aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.cirrus.yml12
-rw-r--r--.github/workflows/ci.yml30
-rw-r--r--.tx/config2
-rw-r--r--COPYING4
-rw-r--r--build-aux/m4/bitcoin_runtime_lib.m442
-rw-r--r--build-aux/m4/l_atomic.m44
-rw-r--r--build_msvc/bitcoin_config.h.in60
-rw-r--r--build_msvc/test_bitcoin-qt/test_bitcoin-qt.vcxproj8
-rw-r--r--build_msvc/test_bitcoin/test_bitcoin.vcxproj2
-rw-r--r--ci/README.md4
-rwxr-xr-xci/lint/04_install.sh3
-rwxr-xr-xci/test/00_setup_env.sh2
-rwxr-xr-xci/test/00_setup_env_i686_centos.sh2
-rwxr-xr-xci/test/00_setup_env_i686_multiprocess.sh4
-rwxr-xr-xci/test/00_setup_env_mac_cross.sh (renamed from ci/test/00_setup_env_mac.sh)7
-rwxr-xr-xci/test/00_setup_env_native_fuzz_with_msan.sh4
-rwxr-xr-xci/test/00_setup_env_native_fuzz_with_valgrind.sh2
-rwxr-xr-xci/test/00_setup_env_native_msan.sh4
-rwxr-xr-xci/test/00_setup_env_native_nowallet_libbitcoinkernel.sh8
-rwxr-xr-xci/test/00_setup_env_native_previous_releases.sh (renamed from ci/test/00_setup_env_native_qt5.sh)6
-rwxr-xr-xci/test/00_setup_env_native_tidy.sh2
-rwxr-xr-xci/test/00_setup_env_native_valgrind.sh2
-rwxr-xr-xci/test/01_base_install.sh2
-rwxr-xr-xci/test/02_run_container.sh10
-rwxr-xr-xci/test/03_test_script.sh8
-rw-r--r--configure.ac104
-rw-r--r--contrib/debian/copyright2
-rwxr-xr-xcontrib/devtools/clang-format-diff.py314
-rw-r--r--contrib/devtools/iwyu/bitcoin.core.imp3
-rwxr-xr-xcontrib/devtools/security-check.py12
-rwxr-xr-xcontrib/devtools/test-security-check.py8
-rwxr-xr-xcontrib/devtools/test_deterministic_coverage.sh26
-rwxr-xr-xcontrib/devtools/test_utxo_snapshots.sh4
-rw-r--r--contrib/guix/INSTALL.md169
-rw-r--r--contrib/guix/README.md2
-rw-r--r--contrib/guix/manifest.scm2
-rwxr-xr-xcontrib/macdeploy/detached-sig-create.sh2
-rw-r--r--contrib/seeds/README.md2
-rwxr-xr-xcontrib/seeds/makeseeds.py21
-rw-r--r--contrib/seeds/nodes_main.txt2248
-rw-r--r--contrib/seeds/nodes_main_manual.txt1096
-rw-r--r--contrib/seeds/nodes_test.txt112
-rw-r--r--depends/Makefile7
-rw-r--r--depends/README.md5
-rw-r--r--depends/builders/darwin.mk5
-rw-r--r--depends/config.site.in8
-rw-r--r--depends/funcs.mk7
-rwxr-xr-xdepends/gen_id7
-rw-r--r--depends/hosts/android.mk5
-rw-r--r--depends/hosts/darwin.mk21
-rw-r--r--depends/hosts/default.mk3
-rw-r--r--depends/hosts/freebsd.mk6
-rw-r--r--depends/hosts/linux.mk4
-rw-r--r--depends/hosts/mingw32.mk4
-rw-r--r--depends/hosts/netbsd.mk4
-rw-r--r--depends/hosts/openbsd.mk6
-rw-r--r--depends/packages.md1
-rw-r--r--depends/packages/bdb.mk1
-rw-r--r--depends/packages/libnatpmp.mk6
-rw-r--r--depends/packages/miniupnpc.mk6
-rw-r--r--depends/packages/native_libmultiprocess.mk4
-rw-r--r--depends/packages/native_libtapi.mk2
-rw-r--r--depends/packages/native_llvm.mk (renamed from depends/packages/native_clang.mk)15
-rw-r--r--depends/packages/packages.mk2
-rw-r--r--depends/packages/qt.mk4
-rw-r--r--depends/packages/sqlite.mk10
-rw-r--r--depends/packages/systemtap.mk3
-rw-r--r--depends/patches/libnatpmp/no_libtool.patch15
-rw-r--r--depends/patches/miniupnpc/no_libtool.patch15
-rw-r--r--depends/patches/qt/fix-minimum-macos.patch18
-rw-r--r--depends/patches/qt/utc_from_string_no_optimize.patch84
-rw-r--r--depends/patches/systemtap/fix_variadic_warning.patch16
-rw-r--r--doc/bips.md2
-rw-r--r--doc/build-openbsd.md4
-rw-r--r--doc/dependencies.md2
-rw-r--r--doc/design/assumeutxo.md4
-rw-r--r--doc/design/multiprocess.md310
-rw-r--r--doc/developer-notes.md60
-rw-r--r--doc/fuzzing.md7
-rw-r--r--doc/multiprocess.md34
-rw-r--r--doc/offline-signing-tutorial.md4
-rw-r--r--doc/policy/README.md4
-rw-r--r--doc/policy/mempool-replacements.md3
-rw-r--r--doc/release-notes-28207.md7
-rw-r--r--doc/shared-libraries.md1
-rw-r--r--doc/translation_process.md16
-rw-r--r--src/.clang-format2
-rw-r--r--src/Makefile.am27
-rw-r--r--src/Makefile.bench.include3
-rw-r--r--src/Makefile.qt_locale.include9
-rw-r--r--src/Makefile.test.include43
-rw-r--r--src/addrdb.cpp4
-rw-r--r--src/addrman.cpp13
-rw-r--r--src/addrman.h5
-rw-r--r--src/bench/ellswift.cpp4
-rw-r--r--src/bench/readblock.cpp53
-rw-r--r--src/bench/verify_script.cpp4
-rw-r--r--src/bench/wallet_balance.cpp3
-rw-r--r--src/bench/wallet_create.cpp4
-rw-r--r--src/bench/wallet_ismine.cpp77
-rw-r--r--src/bench/wallet_loading.cpp4
-rw-r--r--src/bitcoin-chainstate.cpp24
-rw-r--r--src/bitcoin-cli.cpp12
-rw-r--r--src/chain.h7
-rw-r--r--src/chainparamsseeds.h2352
-rw-r--r--src/clientversion.cpp4
-rw-r--r--src/common/settings.cpp19
-rw-r--r--src/common/system.cpp4
-rw-r--r--src/compat/byteswap.h66
-rw-r--r--src/compat/compat.h4
-rw-r--r--src/compat/endian.h241
-rw-r--r--src/core_io.h4
-rw-r--r--src/core_write.cpp12
-rw-r--r--src/crc32c/src/crc32c_arm64.cc32
-rw-r--r--src/crypto/chacha20.cpp11
-rw-r--r--src/crypto/chacha20poly1305.cpp4
-rw-r--r--src/crypto/common.h53
-rw-r--r--src/crypto/muhash.h4
-rw-r--r--src/crypto/sha256.cpp30
-rw-r--r--src/crypto/sha3.cpp65
-rw-r--r--src/crypto/siphash.cpp14
-rw-r--r--src/hash.cpp12
-rw-r--r--src/headerssync.cpp4
-rw-r--r--src/httpserver.cpp5
-rw-r--r--src/i2p.cpp7
-rw-r--r--src/index/base.cpp8
-rw-r--r--src/init.cpp69
-rw-r--r--src/init/common.cpp4
-rw-r--r--src/interfaces/chain.h3
-rw-r--r--src/ipc/capnp/common-types.h108
-rw-r--r--src/kernel/chainparams.cpp46
-rw-r--r--src/kernel/chainstatemanager_opts.h3
-rw-r--r--src/kernel/mempool_entry.h6
-rw-r--r--src/kernel/mempool_options.h4
-rw-r--r--src/kernel/mempool_persist.cpp20
-rw-r--r--src/key.cpp28
-rw-r--r--src/key.h8
-rw-r--r--src/key_io.cpp2
-rw-r--r--src/logging.cpp56
-rw-r--r--src/logging.h31
-rw-r--r--src/net.cpp35
-rw-r--r--src/net.h18
-rw-r--r--src/net_processing.cpp80
-rw-r--r--src/net_processing.h27
-rw-r--r--src/netaddress.h28
-rw-r--r--src/netbase.h4
-rw-r--r--src/node/blockstorage.cpp12
-rw-r--r--src/node/context.h4
-rw-r--r--src/node/interfaces.cpp15
-rw-r--r--src/node/miner.cpp8
-rw-r--r--src/node/transaction.cpp6
-rw-r--r--src/policy/fees.cpp4
-rw-r--r--src/policy/rbf.cpp4
-rw-r--r--src/policy/rbf.h2
-rw-r--r--src/policy/v3_policy.cpp219
-rw-r--r--src/policy/v3_policy.h83
-rw-r--r--src/prevector.h37
-rw-r--r--src/primitives/block.h8
-rw-r--r--src/protocol.cpp14
-rw-r--r--src/protocol.h43
-rw-r--r--src/pubkey.h3
-rw-r--r--src/qt/addressbookpage.cpp4
-rw-r--r--src/qt/askpassphrasedialog.cpp4
-rw-r--r--src/qt/bitcoin.cpp5
-rw-r--r--src/qt/bitcoin_locale.qrc9
-rw-r--r--src/qt/bitcoingui.cpp11
-rw-r--r--src/qt/bitcoinstrings.cpp16
-rw-r--r--src/qt/clientmodel.cpp47
-rw-r--r--src/qt/clientmodel.h10
-rw-r--r--src/qt/coincontroldialog.cpp4
-rw-r--r--src/qt/forms/optionsdialog.ui121
-rw-r--r--src/qt/guiconstants.h2
-rw-r--r--src/qt/guiutil.cpp4
-rw-r--r--src/qt/intro.cpp8
-rw-r--r--src/qt/intro.h1
-rw-r--r--src/qt/locale/bitcoin_af.ts315
-rw-r--r--src/qt/locale/bitcoin_am.ts46
-rw-r--r--src/qt/locale/bitcoin_ar.ts146
-rw-r--r--src/qt/locale/bitcoin_az.ts58
-rw-r--r--src/qt/locale/bitcoin_az@latin.ts52
-rw-r--r--src/qt/locale/bitcoin_be.ts40
-rw-r--r--src/qt/locale/bitcoin_bg.ts123
-rw-r--r--src/qt/locale/bitcoin_bn.ts78
-rw-r--r--src/qt/locale/bitcoin_bs.ts52
-rw-r--r--src/qt/locale/bitcoin_ca.ts264
-rw-r--r--src/qt/locale/bitcoin_cmn.ts1284
-rw-r--r--src/qt/locale/bitcoin_cs.ts132
-rw-r--r--src/qt/locale/bitcoin_cy.ts16
-rw-r--r--src/qt/locale/bitcoin_da.ts96
-rw-r--r--src/qt/locale/bitcoin_de.ts4672
-rw-r--r--src/qt/locale/bitcoin_de_AT.ts357
-rw-r--r--src/qt/locale/bitcoin_de_CH.ts357
-rw-r--r--src/qt/locale/bitcoin_el.ts292
-rw-r--r--src/qt/locale/bitcoin_en.ts208
-rw-r--r--src/qt/locale/bitcoin_en.xlf2220
-rw-r--r--src/qt/locale/bitcoin_eo.ts44
-rw-r--r--src/qt/locale/bitcoin_es.ts1489
-rw-r--r--src/qt/locale/bitcoin_es_CL.ts362
-rw-r--r--src/qt/locale/bitcoin_es_CO.ts687
-rw-r--r--src/qt/locale/bitcoin_es_DO.ts381
-rw-r--r--src/qt/locale/bitcoin_es_MX.ts1457
-rw-r--r--src/qt/locale/bitcoin_es_SV.ts577
-rw-r--r--src/qt/locale/bitcoin_es_VE.ts448
-rw-r--r--src/qt/locale/bitcoin_et.ts44
-rw-r--r--src/qt/locale/bitcoin_eu.ts48
-rw-r--r--src/qt/locale/bitcoin_fa.ts398
-rw-r--r--src/qt/locale/bitcoin_fi.ts114
-rw-r--r--src/qt/locale/bitcoin_fil.ts56
-rw-r--r--src/qt/locale/bitcoin_fo.ts1360
-rw-r--r--src/qt/locale/bitcoin_fr.ts539
-rw-r--r--src/qt/locale/bitcoin_fr_CM.ts350
-rw-r--r--src/qt/locale/bitcoin_fr_LU.ts348
-rw-r--r--src/qt/locale/bitcoin_ga.ts76
-rw-r--r--src/qt/locale/bitcoin_ga_IE.ts76
-rw-r--r--src/qt/locale/bitcoin_gd.ts4
-rw-r--r--src/qt/locale/bitcoin_gl.ts48
-rw-r--r--src/qt/locale/bitcoin_gl_ES.ts36
-rw-r--r--src/qt/locale/bitcoin_gu.ts15
-rw-r--r--src/qt/locale/bitcoin_ha.ts12
-rw-r--r--src/qt/locale/bitcoin_hak.ts1288
-rw-r--r--src/qt/locale/bitcoin_he.ts212
-rw-r--r--src/qt/locale/bitcoin_hi.ts242
-rw-r--r--src/qt/locale/bitcoin_hr.ts100
-rw-r--r--src/qt/locale/bitcoin_hu.ts326
-rw-r--r--src/qt/locale/bitcoin_id.ts406
-rw-r--r--src/qt/locale/bitcoin_is.ts27
-rw-r--r--src/qt/locale/bitcoin_it.ts350
-rw-r--r--src/qt/locale/bitcoin_ja.ts921
-rw-r--r--src/qt/locale/bitcoin_ka.ts56
-rw-r--r--src/qt/locale/bitcoin_kk.ts26
-rw-r--r--src/qt/locale/bitcoin_kk@latin.ts891
-rw-r--r--src/qt/locale/bitcoin_km.ts105
-rw-r--r--src/qt/locale/bitcoin_kn.ts18
-rw-r--r--src/qt/locale/bitcoin_ko.ts169
-rw-r--r--src/qt/locale/bitcoin_ku.ts18
-rw-r--r--src/qt/locale/bitcoin_ku_IQ.ts16
-rw-r--r--src/qt/locale/bitcoin_la.ts19
-rw-r--r--src/qt/locale/bitcoin_lb.ts197
-rw-r--r--src/qt/locale/bitcoin_lt.ts56
-rw-r--r--src/qt/locale/bitcoin_lv.ts8
-rw-r--r--src/qt/locale/bitcoin_mg.ts16
-rw-r--r--src/qt/locale/bitcoin_mi.ts728
-rw-r--r--src/qt/locale/bitcoin_mk.ts832
-rw-r--r--src/qt/locale/bitcoin_ml.ts221
-rw-r--r--src/qt/locale/bitcoin_mn.ts16
-rw-r--r--src/qt/locale/bitcoin_mr.ts8
-rw-r--r--src/qt/locale/bitcoin_mr_IN.ts8
-rw-r--r--src/qt/locale/bitcoin_ms.ts8
-rw-r--r--src/qt/locale/bitcoin_mt.ts1082
-rw-r--r--src/qt/locale/bitcoin_my.ts16
-rw-r--r--src/qt/locale/bitcoin_nb.ts80
-rw-r--r--src/qt/locale/bitcoin_ne.ts123
-rw-r--r--src/qt/locale/bitcoin_nl.ts316
-rw-r--r--src/qt/locale/bitcoin_no.ts8
-rw-r--r--src/qt/locale/bitcoin_pa.ts8
-rw-r--r--src/qt/locale/bitcoin_pam.ts56
-rw-r--r--src/qt/locale/bitcoin_pl.ts254
-rw-r--r--src/qt/locale/bitcoin_pt.ts345
-rw-r--r--src/qt/locale/bitcoin_pt@qtfiletype.ts250
-rw-r--r--src/qt/locale/bitcoin_pt_BR.ts353
-rw-r--r--src/qt/locale/bitcoin_ro.ts150
-rw-r--r--src/qt/locale/bitcoin_ru.ts449
-rw-r--r--src/qt/locale/bitcoin_sc.ts8
-rw-r--r--src/qt/locale/bitcoin_sd.ts281
-rw-r--r--src/qt/locale/bitcoin_si.ts22
-rw-r--r--src/qt/locale/bitcoin_sk.ts233
-rw-r--r--src/qt/locale/bitcoin_sl.ts144
-rw-r--r--src/qt/locale/bitcoin_sn.ts8
-rw-r--r--src/qt/locale/bitcoin_so.ts24
-rw-r--r--src/qt/locale/bitcoin_sq.ts20
-rw-r--r--src/qt/locale/bitcoin_sr.ts144
-rw-r--r--src/qt/locale/bitcoin_sr@ijekavianlatin.ts152
-rw-r--r--src/qt/locale/bitcoin_sr@latin.ts146
-rw-r--r--src/qt/locale/bitcoin_sv.ts316
-rw-r--r--src/qt/locale/bitcoin_sw.ts373
-rw-r--r--src/qt/locale/bitcoin_szl.ts40
-rw-r--r--src/qt/locale/bitcoin_ta.ts60
-rw-r--r--src/qt/locale/bitcoin_te.ts80
-rw-r--r--src/qt/locale/bitcoin_th.ts798
-rw-r--r--src/qt/locale/bitcoin_tk.ts1197
-rw-r--r--src/qt/locale/bitcoin_tl.ts66
-rw-r--r--src/qt/locale/bitcoin_tr.ts116
-rw-r--r--src/qt/locale/bitcoin_ug.ts24
-rw-r--r--src/qt/locale/bitcoin_uk.ts439
-rw-r--r--src/qt/locale/bitcoin_ur.ts60
-rw-r--r--src/qt/locale/bitcoin_uz.ts95
-rw-r--r--src/qt/locale/bitcoin_uz@Cyrl.ts67
-rw-r--r--src/qt/locale/bitcoin_uz@Latn.ts60
-rw-r--r--src/qt/locale/bitcoin_vi.ts132
-rw-r--r--src/qt/locale/bitcoin_yue.ts1357
-rw-r--r--src/qt/locale/bitcoin_zh-Hans.ts392
-rw-r--r--src/qt/locale/bitcoin_zh-Hant.ts1288
-rw-r--r--src/qt/locale/bitcoin_zh.ts3181
-rw-r--r--src/qt/locale/bitcoin_zh_CN.ts3843
-rw-r--r--src/qt/locale/bitcoin_zh_HK.ts1232
-rw-r--r--src/qt/locale/bitcoin_zh_TW.ts911
-rw-r--r--src/qt/locale/bitcoin_zu.ts4
-rw-r--r--src/qt/modaloverlay.cpp4
-rw-r--r--src/qt/notificator.cpp4
-rw-r--r--src/qt/optionsdialog.cpp76
-rw-r--r--src/qt/optionsmodel.cpp77
-rw-r--r--src/qt/optionsmodel.h23
-rw-r--r--src/qt/overviewpage.cpp8
-rw-r--r--src/qt/overviewpage.h2
-rw-r--r--src/qt/paymentserver.cpp4
-rw-r--r--src/qt/paymentserver.h4
-rw-r--r--src/qt/rpcconsole.cpp13
-rw-r--r--src/qt/rpcconsole.h2
-rw-r--r--src/qt/sendcoinsdialog.cpp1
-rw-r--r--src/qt/sendcoinsentry.cpp4
-rw-r--r--src/qt/sendcoinsrecipient.h4
-rw-r--r--src/qt/test/addressbooktests.cpp3
-rw-r--r--src/qt/test/apptests.cpp4
-rw-r--r--src/qt/test/optiontests.cpp19
-rw-r--r--src/qt/test/test_main.cpp49
-rw-r--r--src/qt/test/wallettests.cpp2
-rw-r--r--src/qt/transactiondesc.cpp4
-rw-r--r--src/qt/utilitydialog.cpp3
-rw-r--r--src/qt/walletmodel.cpp11
-rw-r--r--src/qt/walletmodel.h4
-rw-r--r--src/qt/walletmodeltransaction.cpp4
-rw-r--r--src/qt/winshutdownmonitor.h2
-rw-r--r--src/random.cpp4
-rw-r--r--src/random.h3
-rw-r--r--src/rest.cpp12
-rw-r--r--src/rpc/blockchain.cpp47
-rw-r--r--src/rpc/client.cpp2
-rw-r--r--src/rpc/external_signer.cpp4
-rw-r--r--src/rpc/fees.cpp10
-rw-r--r--src/rpc/mempool.cpp27
-rw-r--r--src/rpc/mining.cpp24
-rw-r--r--src/rpc/net.cpp19
-rw-r--r--src/rpc/node.cpp6
-rw-r--r--src/rpc/rawtransaction.cpp4
-rw-r--r--src/rpc/rawtransaction_util.cpp37
-rw-r--r--src/rpc/rawtransaction_util.h11
-rw-r--r--src/rpc/register.h4
-rw-r--r--src/rpc/server.cpp9
-rw-r--r--src/rpc/server.h12
-rw-r--r--src/rpc/util.cpp13
-rw-r--r--src/rpc/util.h5
-rw-r--r--src/scheduler.cpp14
-rw-r--r--src/scheduler.h15
-rw-r--r--src/secp256k1/.cirrus.yml95
-rw-r--r--src/secp256k1/.github/actions/run-in-docker-action/action.yml6
-rw-r--r--src/secp256k1/.github/workflows/ci.yml6
-rw-r--r--src/secp256k1/CHANGELOG.md14
-rw-r--r--src/secp256k1/CMakeLists.txt14
-rw-r--r--src/secp256k1/CONTRIBUTING.md107
-rw-r--r--src/secp256k1/Makefile.am2
-rw-r--r--src/secp256k1/README.md32
-rwxr-xr-xsrc/secp256k1/ci/ci.sh16
-rw-r--r--src/secp256k1/ci/linux-debian.Dockerfile10
-rw-r--r--src/secp256k1/cmake/GeneratePkgConfigFile.cmake8
-rw-r--r--src/secp256k1/configure.ac20
-rw-r--r--src/secp256k1/doc/release-process.md11
-rw-r--r--src/secp256k1/src/CMakeLists.txt10
-rw-r--r--src/secp256k1/src/asm/field_10x26_arm.s1
-rw-r--r--src/secp256k1/src/bench_internal.c59
-rw-r--r--src/secp256k1/src/ecdsa_impl.h7
-rw-r--r--src/secp256k1/src/ecmult_const_impl.h385
-rw-r--r--src/secp256k1/src/field.h5
-rw-r--r--src/secp256k1/src/field_10x26_impl.h4
-rw-r--r--src/secp256k1/src/field_5x52_asm_impl.h504
-rw-r--r--src/secp256k1/src/field_5x52_impl.h4
-rw-r--r--src/secp256k1/src/field_5x52_int128_impl.h13
-rw-r--r--src/secp256k1/src/field_impl.h160
-rw-r--r--src/secp256k1/src/group.h8
-rw-r--r--src/secp256k1/src/group_impl.h200
-rw-r--r--src/secp256k1/src/modinv32_impl.h33
-rw-r--r--src/secp256k1/src/modinv64_impl.h44
-rw-r--r--src/secp256k1/src/modules/ecdh/tests_impl.h25
-rw-r--r--src/secp256k1/src/modules/ellswift/main_impl.h21
-rw-r--r--src/secp256k1/src/modules/ellswift/tests_exhaustive_impl.h2
-rw-r--r--src/secp256k1/src/modules/ellswift/tests_impl.h6
-rw-r--r--src/secp256k1/src/modules/extrakeys/tests_impl.h167
-rw-r--r--src/secp256k1/src/modules/recovery/tests_impl.h69
-rw-r--r--src/secp256k1/src/modules/schnorrsig/tests_impl.h67
-rw-r--r--src/secp256k1/src/scalar.h10
-rw-r--r--src/secp256k1/src/scalar_4x64_impl.h139
-rw-r--r--src/secp256k1/src/scalar_8x32_impl.h150
-rw-r--r--src/secp256k1/src/scalar_impl.h16
-rw-r--r--src/secp256k1/src/scalar_low.h11
-rw-r--r--src/secp256k1/src/scalar_low_impl.h87
-rw-r--r--src/secp256k1/src/tests.c674
-rw-r--r--src/secp256k1/src/tests_exhaustive.c77
-rw-r--r--src/secp256k1/src/testutil.h29
-rw-r--r--src/secp256k1/src/util.h11
-rwxr-xr-xsrc/secp256k1/tools/check-abi.sh64
-rw-r--r--src/serialize.h91
-rw-r--r--src/span.h8
-rw-r--r--src/support/lockedpool.cpp4
-rw-r--r--src/sync.cpp4
-rw-r--r--src/test/.gitignore2
-rw-r--r--src/test/README.md3
-rw-r--r--src/test/addrman_tests.cpp28
-rw-r--r--src/test/blockfilter_index_tests.cpp5
-rw-r--r--src/test/bswap_tests.cpp6
-rw-r--r--src/test/coinstatsindex_tests.cpp2
-rw-r--r--src/test/compress_tests.cpp9
-rw-r--r--src/test/crypto_tests.cpp22
-rw-r--r--src/test/data/tx_valid.json4
-rw-r--r--src/test/fuzz/addition_overflow.cpp10
-rw-r--r--src/test/fuzz/addrman.cpp25
-rw-r--r--src/test/fuzz/banman.cpp12
-rw-r--r--src/test/fuzz/connman.cpp8
-rw-r--r--src/test/fuzz/descriptor_parse.cpp8
-rw-r--r--src/test/fuzz/fuzz.cpp4
-rw-r--r--src/test/fuzz/headerssync.cpp2
-rw-r--r--src/test/fuzz/integer.cpp2
-rw-r--r--src/test/fuzz/key.cpp5
-rw-r--r--src/test/fuzz/multiplication_overflow.cpp10
-rw-r--r--src/test/fuzz/net.cpp37
-rw-r--r--src/test/fuzz/net_permissions.cpp2
-rw-r--r--src/test/fuzz/netaddress.cpp12
-rw-r--r--src/test/fuzz/package_eval.cpp47
-rw-r--r--src/test/fuzz/policy_estimator.cpp10
-rw-r--r--src/test/fuzz/process_message.cpp4
-rw-r--r--src/test/fuzz/process_messages.cpp4
-rw-r--r--src/test/fuzz/tx_pool.cpp19
-rw-r--r--src/test/fuzz/util.cpp2
-rw-r--r--src/test/fuzz/util/descriptor.cpp14
-rw-r--r--src/test/fuzz/util/descriptor.h10
-rw-r--r--src/test/fuzz/util/net.cpp78
-rw-r--r--src/test/fuzz/util/net.h10
-rw-r--r--src/test/ipc_test.capnp18
-rw-r--r--src/test/ipc_test.cpp67
-rw-r--r--src/test/ipc_test.h21
-rw-r--r--src/test/ipc_tests.cpp13
-rw-r--r--src/test/logging_tests.cpp42
-rw-r--r--src/test/miner_tests.cpp1
-rw-r--r--src/test/peerman_tests.cpp76
-rw-r--r--src/test/policyestimator_tests.cpp45
-rw-r--r--src/test/rbf_tests.cpp2
-rw-r--r--src/test/scheduler_tests.cpp10
-rw-r--r--src/test/script_standard_tests.cpp12
-rw-r--r--src/test/script_tests.cpp23
-rw-r--r--src/test/settings_tests.cpp4
-rw-r--r--src/test/sigopcount_tests.cpp6
-rw-r--r--src/test/span_tests.cpp2
-rw-r--r--src/test/streams_tests.cpp9
-rw-r--r--src/test/system_tests.cpp36
-rw-r--r--src/test/transaction_tests.cpp30
-rw-r--r--src/test/txindex_tests.cpp2
-rw-r--r--src/test/txpackage_tests.cpp36
-rw-r--r--src/test/txvalidation_tests.cpp293
-rw-r--r--src/test/util/mining.cpp6
-rw-r--r--src/test/util/setup_common.cpp13
-rw-r--r--src/test/util/txmempool.cpp27
-rw-r--r--src/test/util/txmempool.h10
-rw-r--r--src/test/validation_block_tests.cpp8
-rw-r--r--src/test/validation_chainstatemanager_tests.cpp7
-rw-r--r--src/test/validation_tests.cpp215
-rw-r--r--src/test/validationinterface_tests.cpp31
-rw-r--r--src/timedata.cpp5
-rw-r--r--src/timedata.h6
-rw-r--r--src/torcontrol.cpp2
-rw-r--r--src/txmempool.cpp28
-rw-r--r--src/txmempool.h6
-rw-r--r--src/util/asmap.cpp6
-rw-r--r--src/util/overloaded.h4
-rw-r--r--src/util/task_runner.h52
-rw-r--r--src/util/transaction_identifier.h1
-rw-r--r--src/util/types.h1
-rw-r--r--src/validation.cpp280
-rw-r--r--src/validation.h12
-rw-r--r--src/validationinterface.cpp93
-rw-r--r--src/validationinterface.h113
-rw-r--r--src/wallet/bdb.cpp9
-rw-r--r--src/wallet/coinselection.cpp365
-rw-r--r--src/wallet/coinselection.h25
-rw-r--r--src/wallet/db.h1
-rw-r--r--src/wallet/dump.cpp7
-rw-r--r--src/wallet/dump.h5
-rw-r--r--src/wallet/init.cpp4
-rw-r--r--src/wallet/rpc/addresses.cpp4
-rw-r--r--src/wallet/rpc/backup.cpp14
-rw-r--r--src/wallet/rpc/spend.cpp156
-rw-r--r--src/wallet/rpc/transactions.cpp7
-rw-r--r--src/wallet/rpc/wallet.cpp8
-rw-r--r--src/wallet/scriptpubkeyman.cpp49
-rw-r--r--src/wallet/scriptpubkeyman.h13
-rw-r--r--src/wallet/spend.cpp46
-rw-r--r--src/wallet/spend.h2
-rw-r--r--src/wallet/sqlite.cpp79
-rw-r--r--src/wallet/sqlite.h31
-rw-r--r--src/wallet/test/coinselector_tests.cpp211
-rw-r--r--src/wallet/test/db_tests.cpp154
-rw-r--r--src/wallet/test/fuzz/coinselection.cpp139
-rw-r--r--src/wallet/test/fuzz/fees.cpp7
-rw-r--r--src/wallet/test/fuzz/notifications.cpp16
-rw-r--r--src/wallet/test/fuzz/scriptpubkeyman.cpp12
-rw-r--r--src/wallet/test/ismine_tests.cpp3
-rw-r--r--src/wallet/test/util.cpp3
-rw-r--r--src/wallet/test/util.h4
-rw-r--r--src/wallet/test/wallet_tests.cpp34
-rw-r--r--src/wallet/wallet.cpp500
-rw-r--r--src/wallet/wallet.h22
-rw-r--r--src/wallet/walletdb.cpp173
-rw-r--r--src/wallet/walletdb.h16
-rw-r--r--src/wallet/wallettool.cpp12
-rw-r--r--src/warnings.cpp4
-rw-r--r--src/zmq/zmqpublishnotifier.cpp4
-rw-r--r--test/README.md30
-rw-r--r--test/functional/README.md4
-rwxr-xr-xtest/functional/feature_addrman.py3
-rwxr-xr-xtest/functional/feature_anchors.py2
-rwxr-xr-xtest/functional/feature_assumeutxo.py58
-rwxr-xr-xtest/functional/feature_bind_extra.py10
-rwxr-xr-xtest/functional/feature_bip68_sequence.py6
-rwxr-xr-xtest/functional/feature_block.py4
-rwxr-xr-xtest/functional/feature_config_args.py6
-rwxr-xr-xtest/functional/feature_init.py4
-rwxr-xr-xtest/functional/feature_maxuploadtarget.py59
-rwxr-xr-xtest/functional/feature_notifications.py9
-rwxr-xr-xtest/functional/feature_reindex.py2
-rwxr-xr-xtest/functional/feature_remove_pruned_files_on_startup.py3
-rwxr-xr-xtest/functional/feature_segwit.py23
-rwxr-xr-xtest/functional/feature_settings.py9
-rwxr-xr-xtest/functional/feature_utxo_set_hash.py4
-rwxr-xr-xtest/functional/interface_rest.py3
-rwxr-xr-xtest/functional/interface_usdt_coinselection.py23
-rwxr-xr-xtest/functional/mempool_accept.py8
-rwxr-xr-xtest/functional/mempool_accept_v3.py451
-rwxr-xr-xtest/functional/mempool_expiry.py5
-rwxr-xr-xtest/functional/mempool_package_limits.py2
-rwxr-xr-xtest/functional/mempool_sigoplimit.py9
-rwxr-xr-xtest/functional/mining_prioritisetransaction.py28
-rwxr-xr-xtest/functional/p2p_add_connections.py2
-rwxr-xr-xtest/functional/p2p_addr_relay.py1
-rwxr-xr-xtest/functional/p2p_i2p_ports.py18
-rwxr-xr-xtest/functional/p2p_ibd_stalling.py3
-rwxr-xr-xtest/functional/p2p_invalid_messages.py45
-rwxr-xr-xtest/functional/p2p_mutated_blocks.py116
-rwxr-xr-xtest/functional/p2p_sendtxrcncl.py4
-rwxr-xr-xtest/functional/p2p_timeouts.py29
-rwxr-xr-xtest/functional/p2p_v2_earlykeyresponse.py89
-rwxr-xr-xtest/functional/p2p_v2_encrypted.py134
-rwxr-xr-xtest/functional/p2p_v2_transport.py9
-rwxr-xr-xtest/functional/rpc_bind.py11
-rwxr-xr-xtest/functional/rpc_net.py20
-rwxr-xr-xtest/functional/rpc_psbt.py13
-rwxr-xr-xtest/functional/rpc_setban.py9
-rw-r--r--test/functional/test_framework/crypto/bip324_cipher.py8
-rwxr-xr-xtest/functional/test_framework/messages.py225
-rw-r--r--test/functional/test_framework/netutil.py2
-rwxr-xr-xtest/functional/test_framework/p2p.py235
-rw-r--r--test/functional/test_framework/script.py2
-rwxr-xr-xtest/functional/test_framework/test_framework.py9
-rwxr-xr-xtest/functional/test_framework/test_node.py77
-rw-r--r--test/functional/test_framework/util.py6
-rw-r--r--test/functional/test_framework/v2_p2p.py285
-rw-r--r--test/functional/test_framework/wallet.py20
-rwxr-xr-xtest/functional/test_runner.py39
-rwxr-xr-xtest/functional/wallet_assumeutxo.py169
-rwxr-xr-xtest/functional/wallet_descriptor.py40
-rwxr-xr-xtest/functional/wallet_fundrawtransaction.py31
-rwxr-xr-xtest/functional/wallet_import_rescan.py65
-rwxr-xr-xtest/functional/wallet_importprunedfunds.py2
-rwxr-xr-xtest/functional/wallet_keypool.py16
-rwxr-xr-xtest/functional/wallet_migration.py161
-rwxr-xr-xtest/functional/wallet_multiwallet.py4
-rwxr-xr-xtest/functional/wallet_reorgsrestore.py1
-rwxr-xr-xtest/functional/wallet_rescan_unconfirmed.py83
-rwxr-xr-xtest/functional/wallet_send.py21
-rwxr-xr-xtest/functional/wallet_sendmany.py43
-rwxr-xr-xtest/fuzz/test_runner.py36
-rw-r--r--test/lint/README.md32
-rwxr-xr-xtest/lint/all-lint.py23
-rwxr-xr-xtest/lint/lint-format-strings.py5
-rw-r--r--test/lint/test_runner/src/main.rs160
-rw-r--r--test/sanitizer_suppressions/ubsan4
572 files changed, 48954 insertions, 19992 deletions
diff --git a/.cirrus.yml b/.cirrus.yml
index eb2414dc0a..3c59e41a13 100644
--- a/.cirrus.yml
+++ b/.cirrus.yml
@@ -22,7 +22,7 @@ env: # Global defaults
# - The ./ci/ depedencies (with cirrus-cli) should be installed:
#
# ```
-# apt update && apt install screen python3 bash podman-docker curl -y && curl -L -o cirrus "https://github.com/cirruslabs/cirrus-cli/releases/latest/download/cirrus-linux-$(dpkg --print-architecture)" && mv cirrus /usr/local/bin/cirrus && chmod +x /usr/local/bin/cirrus
+# apt update && apt install git screen python3 bash podman-docker curl -y && curl -L -o cirrus "https://github.com/cirruslabs/cirrus-cli/releases/latest/download/cirrus-linux-$(dpkg --print-architecture)" && mv cirrus /usr/local/bin/cirrus && chmod +x /usr/local/bin/cirrus
# ```
#
# - There are no strict requirements on the hardware, because having less CPUs
@@ -55,7 +55,7 @@ base_template: &BASE_TEMPLATE
<< : *FILTER_TEMPLATE
merge_base_script:
# Unconditionally install git (used in fingerprint_script).
- - bash -c "$PACKAGE_MANAGER_INSTALL git"
+ - git --version || bash -c "$PACKAGE_MANAGER_INSTALL git"
- if [ "$CIRRUS_PR" = "" ]; then exit 0; fi
- git fetch --depth=1 $CIRRUS_REPO_CLONE_URL "pull/${CIRRUS_PR}/merge"
- git checkout FETCH_HEAD # Use merged changes to detect silent merge conflicts
@@ -132,13 +132,13 @@ task:
FILE_ENV: "./ci/test/00_setup_env_i686_centos.sh"
task:
- name: 'previous releases, qt5 dev package and depends packages, DEBUG'
+ name: 'previous releases, depends DEBUG'
<< : *GLOBAL_TASK_TEMPLATE
persistent_worker:
labels:
type: small
env:
- FILE_ENV: "./ci/test/00_setup_env_native_qt5.sh"
+ FILE_ENV: "./ci/test/00_setup_env_native_previous_releases.sh"
task:
name: 'TSan, depends, gui'
@@ -200,10 +200,10 @@ task:
FILE_ENV: "./ci/test/00_setup_env_native_nowallet_libbitcoinkernel.sh"
task:
- name: 'macOS-cross 11.0, gui, no tests'
+ name: 'macOS-cross, gui, no tests'
<< : *GLOBAL_TASK_TEMPLATE
persistent_worker:
labels:
type: small
env:
- FILE_ENV: "./ci/test/00_setup_env_mac.sh"
+ FILE_ENV: "./ci/test/00_setup_env_mac_cross.sh"
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 53f3c5e116..a86b00fdc6 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -89,7 +89,9 @@ jobs:
uses: actions/checkout@v4
- name: Clang version
- run: clang --version
+ run: |
+ sudo xcode-select --switch /Applications/Xcode_15.0.app
+ clang --version
- name: Install Homebrew packages
env:
@@ -101,7 +103,7 @@ jobs:
- name: Restore Ccache cache
id: ccache-cache
- uses: actions/cache/restore@v3
+ uses: actions/cache/restore@v4
with:
path: ${{ env.CCACHE_DIR }}
key: ${{ github.job }}-ccache-${{ github.run_id }}
@@ -111,7 +113,7 @@ jobs:
run: ./ci/test_run_all.sh
- name: Save Ccache cache
- uses: actions/cache/save@v3
+ uses: actions/cache/save@v4
if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true'
with:
path: ${{ env.CCACHE_DIR }}
@@ -146,18 +148,19 @@ jobs:
with:
arch: x64
- - name: Check MSBuild and Qt
+ - name: Get tool information
run: |
msbuild -version | Out-File -FilePath "$env:GITHUB_WORKSPACE\msbuild_version"
Get-Content -Path "$env:GITHUB_WORKSPACE\msbuild_version"
$env:VCToolsVersion | Out-File -FilePath "$env:GITHUB_WORKSPACE\toolset_version"
- Get-Content -Path "$env:GITHUB_WORKSPACE\toolset_version"
+ Write-Host "VCToolsVersion $(Get-Content -Path "$env:GITHUB_WORKSPACE\toolset_version")"
$env:CI_QT_URL | Out-File -FilePath "$env:GITHUB_WORKSPACE\qt_url"
$env:CI_QT_CONF | Out-File -FilePath "$env:GITHUB_WORKSPACE\qt_conf"
+ py -3 --version
- name: Restore static Qt cache
id: static-qt-cache
- uses: actions/cache/restore@v3
+ uses: actions/cache/restore@v4
with:
path: C:\Qt_static
key: ${{ github.job }}-static-qt-${{ hashFiles('msbuild_version', 'qt_url', 'qt_conf') }}
@@ -200,14 +203,14 @@ jobs:
- name: Save static Qt cache
if: steps.static-qt-cache.outputs.cache-hit != 'true'
- uses: actions/cache/save@v3
+ uses: actions/cache/save@v4
with:
path: C:\Qt_static
key: ${{ github.job }}-static-qt-${{ hashFiles('msbuild_version', 'qt_url', 'qt_conf') }}
- name: Ccache installation cache
id: ccache-installation-cache
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: |
C:\ProgramData\chocolatey\lib\ccache
@@ -224,7 +227,7 @@ jobs:
- name: Restore Ccache cache
id: ccache-cache
- uses: actions/cache/restore@v3
+ uses: actions/cache/restore@v4
with:
path: ~/AppData/Local/ccache
key: ${{ github.job }}-ccache-${{ github.run_id }}
@@ -240,13 +243,13 @@ jobs:
Get-Content -Path "$env:GITHUB_WORKSPACE\vcpkg_commit"
- name: vcpkg tools cache
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: C:/vcpkg/downloads/tools
key: ${{ github.job }}-vcpkg-tools
- name: vcpkg binary cache
- uses: actions/cache@v3
+ uses: actions/cache@v4
with:
path: ~/AppData/Local/vcpkg/archives
key: ${{ github.job }}-vcpkg-binary-${{ hashFiles('vcpkg_commit', 'msbuild_version', 'toolset_version', 'build_msvc/vcpkg.json') }}
@@ -264,7 +267,7 @@ jobs:
run: ccache --show-stats
- name: Save Ccache cache
- uses: actions/cache/save@v3
+ uses: actions/cache/save@v4
if: github.event_name != 'pull_request' && steps.ccache-cache.outputs.cache-hit != 'true'
with:
path: ~/AppData/Local/ccache
@@ -286,4 +289,5 @@ jobs:
- name: Run functional tests
env:
TEST_RUNNER_EXTRA: ${{ github.event_name != 'pull_request' && '--extended' || '' }}
- run: py -3 test\functional\test_runner.py --jobs $env:NUMBER_OF_PROCESSORS --ci --quiet --tmpdirprefix=$env:RUNNER_TEMP --combinedlogslen=99999999 --timeout-factor=$env:TEST_RUNNER_TIMEOUT_FACTOR $env:TEST_RUNNER_EXTRA
+ shell: cmd
+ run: py -3 test\functional\test_runner.py --jobs %NUMBER_OF_PROCESSORS% --ci --quiet --tmpdirprefix=%RUNNER_TEMP% --combinedlogslen=99999999 --timeout-factor=%TEST_RUNNER_TIMEOUT_FACTOR% %TEST_RUNNER_EXTRA%
diff --git a/.tx/config b/.tx/config
index e75ce0afcb..0192284a82 100644
--- a/.tx/config
+++ b/.tx/config
@@ -1,7 +1,7 @@
[main]
host = https://www.transifex.com
-[o:bitcoin:p:bitcoin:r:qt-translation-026x]
+[o:bitcoin:p:bitcoin:r:qt-translation-027x]
file_filter = src/qt/locale/bitcoin_<lang>.xlf
source_file = src/qt/locale/bitcoin_en.xlf
source_lang = en
diff --git a/COPYING b/COPYING
index 2f7add71ac..e6d6e9fe57 100644
--- a/COPYING
+++ b/COPYING
@@ -1,7 +1,7 @@
The MIT License (MIT)
-Copyright (c) 2009-2023 The Bitcoin Core developers
-Copyright (c) 2009-2023 Bitcoin Developers
+Copyright (c) 2009-2024 The Bitcoin Core developers
+Copyright (c) 2009-2024 Bitcoin Developers
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/build-aux/m4/bitcoin_runtime_lib.m4 b/build-aux/m4/bitcoin_runtime_lib.m4
deleted file mode 100644
index 1a6922deca..0000000000
--- a/build-aux/m4/bitcoin_runtime_lib.m4
+++ /dev/null
@@ -1,42 +0,0 @@
-# On some platforms clang builtin implementations
-# require compiler-rt as a runtime library to use.
-#
-# See:
-# - https://bugs.llvm.org/show_bug.cgi?id=28629
-
-m4_define([_CHECK_RUNTIME_testbody], [[
- bool f(long long x, long long y, long long* p)
- {
- return __builtin_mul_overflow(x, y, p);
- }
- int main() { return 0; }
-]])
-
-AC_DEFUN([CHECK_RUNTIME_LIB], [
-
- AC_LANG_PUSH([C++])
-
- AC_MSG_CHECKING([for __builtin_mul_overflow])
- AC_LINK_IFELSE(
- [AC_LANG_SOURCE([_CHECK_RUNTIME_testbody])],
- [
- AC_MSG_RESULT([yes])
- AC_DEFINE([HAVE_BUILTIN_MUL_OVERFLOW], [1], [Define if you have a working __builtin_mul_overflow])
- ],
- [
- ax_check_save_flags="$LDFLAGS"
- LDFLAGS="$LDFLAGS --rtlib=compiler-rt -lgcc_s"
- AC_LINK_IFELSE(
- [AC_LANG_SOURCE([_CHECK_RUNTIME_testbody])],
- [
- AC_MSG_RESULT([yes, with additional linker flags])
- RUNTIME_LDFLAGS="--rtlib=compiler-rt -lgcc_s"
- AC_DEFINE([HAVE_BUILTIN_MUL_OVERFLOW], [1], [Define if you have a working __builtin_mul_overflow])
- ],
- [AC_MSG_RESULT([no])])
- LDFLAGS="$ax_check_save_flags"
- ])
-
- AC_LANG_POP
- AC_SUBST([RUNTIME_LDFLAGS])
-])
diff --git a/build-aux/m4/l_atomic.m4 b/build-aux/m4/l_atomic.m4
index 5e65257d77..aa00168fce 100644
--- a/build-aux/m4/l_atomic.m4
+++ b/build-aux/m4/l_atomic.m4
@@ -4,7 +4,7 @@ dnl permitted in any medium without royalty provided the copyright notice
dnl and this notice are preserved. This file is offered as-is, without any
dnl warranty.
-# Clang prior to version 15, when building for 32-bit,
+# Clang, when building for 32-bit,
# and linking against libstdc++, requires linking with
# -latomic if using the C++ atomic library.
# Can be tested with: clang++ test.cpp -m32
@@ -24,6 +24,8 @@ m4_define([_CHECK_ATOMIC_testbody], [[
std::atomic<std::chrono::seconds> t{0s};
t.store(2s);
+ auto t1 = t.load();
+ t.compare_exchange_strong(t1, 3s);
std::atomic<int64_t> a{};
diff --git a/build_msvc/bitcoin_config.h.in b/build_msvc/bitcoin_config.h.in
index ec69307f50..2d6df92286 100644
--- a/build_msvc/bitcoin_config.h.in
+++ b/build_msvc/bitcoin_config.h.in
@@ -41,70 +41,10 @@
/* Define this symbol to enable ZMQ functions */
#define ENABLE_ZMQ 1
-/* Define to 1 if you have the declaration of `be16toh', and to 0 if you
- don't. */
-#define HAVE_DECL_BE16TOH 0
-
-/* Define to 1 if you have the declaration of `be32toh', and to 0 if you
- don't. */
-#define HAVE_DECL_BE32TOH 0
-
-/* Define to 1 if you have the declaration of `be64toh', and to 0 if you
- don't. */
-#define HAVE_DECL_BE64TOH 0
-
-/* Define to 1 if you have the declaration of `bswap_16', and to 0 if you
- don't. */
-#define HAVE_DECL_BSWAP_16 0
-
-/* Define to 1 if you have the declaration of `bswap_32', and to 0 if you
- don't. */
-#define HAVE_DECL_BSWAP_32 0
-
-/* Define to 1 if you have the declaration of `bswap_64', and to 0 if you
- don't. */
-#define HAVE_DECL_BSWAP_64 0
-
/* Define to 1 if you have the declaration of `fork', and to 0 if you don't.
*/
#define HAVE_DECL_FORK 0
-/* Define to 1 if you have the declaration of `htobe16', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOBE16 0
-
-/* Define to 1 if you have the declaration of `htobe32', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOBE32 0
-
-/* Define to 1 if you have the declaration of `htobe64', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOBE64 0
-
-/* Define to 1 if you have the declaration of `htole16', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOLE16 0
-
-/* Define to 1 if you have the declaration of `htole32', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOLE32 0
-
-/* Define to 1 if you have the declaration of `htole64', and to 0 if you
- don't. */
-#define HAVE_DECL_HTOLE64 0
-
-/* Define to 1 if you have the declaration of `le16toh', and to 0 if you
- don't. */
-#define HAVE_DECL_LE16TOH 0
-
-/* Define to 1 if you have the declaration of `le32toh', and to 0 if you
- don't. */
-#define HAVE_DECL_LE32TOH 0
-
-/* Define to 1 if you have the declaration of `le64toh', and to 0 if you
- don't. */
-#define HAVE_DECL_LE64TOH 0
-
/* Define to 1 if you have the declaration of `setsid', and to 0 if you don't.
*/
#define HAVE_DECL_SETSID 0
diff --git a/build_msvc/test_bitcoin-qt/test_bitcoin-qt.vcxproj b/build_msvc/test_bitcoin-qt/test_bitcoin-qt.vcxproj
index c5a32a9711..7b4b73ca21 100644
--- a/build_msvc/test_bitcoin-qt/test_bitcoin-qt.vcxproj
+++ b/build_msvc/test_bitcoin-qt/test_bitcoin-qt.vcxproj
@@ -9,19 +9,13 @@
</PropertyGroup>
<ItemGroup>
<ClCompile Include="..\..\src\init\bitcoin-qt.cpp" />
- <ClCompile Include="..\..\src\test\util\setup_common.cpp" />
- <ClCompile Include="..\..\src\wallet\test\util.cpp">
- <ObjectFileName>$(IntDir)wallet_test_util.obj</ObjectFileName>
- </ClCompile>
<ClCompile Include="..\..\src\qt\test\addressbooktests.cpp" />
<ClCompile Include="..\..\src\qt\test\apptests.cpp" />
<ClCompile Include="..\..\src\qt\test\optiontests.cpp" />
<ClCompile Include="..\..\src\qt\test\rpcnestedtests.cpp" />
<ClCompile Include="..\..\src\qt\test\test_main.cpp" />
<ClCompile Include="..\..\src\qt\test\uritests.cpp" />
- <ClCompile Include="..\..\src\qt\test\util.cpp">
- <ObjectFileName>$(IntDir)qt_test_util.obj</ObjectFileName>
- </ClCompile>
+ <ClCompile Include="..\..\src\qt\test\util.cpp" />
<ClCompile Include="..\..\src\qt\test\wallettests.cpp" />
<ClCompile Include="..\..\src\wallet\test\wallet_test_fixture.cpp" />
<ClCompile Include="$(GeneratedFilesOutDir)\moc\moc_addressbooktests.cpp" />
diff --git a/build_msvc/test_bitcoin/test_bitcoin.vcxproj b/build_msvc/test_bitcoin/test_bitcoin.vcxproj
index 2a78f6f2a1..0ae3819e50 100644
--- a/build_msvc/test_bitcoin/test_bitcoin.vcxproj
+++ b/build_msvc/test_bitcoin/test_bitcoin.vcxproj
@@ -10,7 +10,7 @@
</PropertyGroup>
<ItemGroup>
<ClCompile Include="..\..\src\test\*_properties.cpp" />
- <ClCompile Include="..\..\src\test\*_tests.cpp" />
+ <ClCompile Include="..\..\src\test\*_tests.cpp" Exclude="..\..\src\test\ipc_tests.cpp" />
<ClCompile Include="..\..\src\test\gen\*_gen.cpp" />
<ClCompile Include="..\..\src\test\main.cpp" />
<ClCompile Include="..\..\src\test\util\*.cpp" />
diff --git a/ci/README.md b/ci/README.md
index 7cf3b1f563..b4edd4b191 100644
--- a/ci/README.md
+++ b/ci/README.md
@@ -14,10 +14,10 @@ testing compared to other parts of the codebase. If you want to keep the work tr
system in a virtual machine with a Linux operating system of your choice.
To allow for a wide range of tested environments, but also ensure reproducibility to some extent, the test stage
-requires `bash`, `docker`, and `python3` to be installed. To install all requirements on Ubuntu, run
+requires `bash`, `docker`, and `python3` to be installed. To run on different architectures than the host `qemu` is also required. To install all requirements on Ubuntu, run
```
-sudo apt install bash docker.io python3
+sudo apt install bash docker.io python3 qemu-user-static
```
It is recommended to run the ci system in a clean env. To run the test stage
diff --git a/ci/lint/04_install.sh b/ci/lint/04_install.sh
index 476417d04b..47cb8864c2 100755
--- a/ci/lint/04_install.sh
+++ b/ci/lint/04_install.sh
@@ -10,10 +10,11 @@ export PATH=$PWD/ci/retry:$PATH
${CI_RETRY_EXE} apt-get update
# Lint dependencies:
+# - automake pkg-config libtool (for lint_includes_build_config)
# - curl/xz-utils (to install shellcheck)
# - git (used in many lint scripts)
# - gpg (used by verify-commits)
-${CI_RETRY_EXE} apt-get install -y curl xz-utils git gpg
+${CI_RETRY_EXE} apt-get install -y automake pkg-config libtool curl xz-utils git gpg
PYTHON_PATH="/python_build"
if [ ! -d "${PYTHON_PATH}/bin" ]; then
diff --git a/ci/test/00_setup_env.sh b/ci/test/00_setup_env.sh
index 6ba3deb121..b9e6818afb 100755
--- a/ci/test/00_setup_env.sh
+++ b/ci/test/00_setup_env.sh
@@ -66,7 +66,7 @@ export BASE_BUILD_DIR=${BASE_BUILD_DIR:-$BASE_SCRATCH_DIR/build}
# The folder for previous release binaries.
# This folder exists only on the ci guest, and on the ci host as a volume.
export PREVIOUS_RELEASES_DIR=${PREVIOUS_RELEASES_DIR:-$BASE_ROOT_DIR/prev_releases}
-export CI_BASE_PACKAGES=${CI_BASE_PACKAGES:-build-essential libtool autotools-dev automake pkg-config bsdmainutils curl ca-certificates ccache python3 rsync git procps bison e2fsprogs}
+export CI_BASE_PACKAGES=${CI_BASE_PACKAGES:-build-essential libtool autotools-dev automake pkg-config bsdmainutils curl ca-certificates ccache python3 rsync git procps bison e2fsprogs cmake}
export GOAL=${GOAL:-install}
export DIR_QA_ASSETS=${DIR_QA_ASSETS:-${BASE_SCRATCH_DIR}/qa-assets}
export CI_RETRY_EXE=${CI_RETRY_EXE:-"retry --"}
diff --git a/ci/test/00_setup_env_i686_centos.sh b/ci/test/00_setup_env_i686_centos.sh
index d509c72141..5f8391c5da 100755
--- a/ci/test/00_setup_env_i686_centos.sh
+++ b/ci/test/00_setup_env_i686_centos.sh
@@ -9,7 +9,7 @@ export LC_ALL=C.UTF-8
export HOST=i686-pc-linux-gnu
export CONTAINER_NAME=ci_i686_centos
export CI_IMAGE_NAME_TAG="quay.io/centos/amd64:stream9"
-export CI_BASE_PACKAGES="gcc-c++ glibc-devel.x86_64 libstdc++-devel.x86_64 glibc-devel.i686 libstdc++-devel.i686 ccache libtool make git python3 python3-pip which patch lbzip2 xz procps-ng dash rsync coreutils bison util-linux e2fsprogs"
+export CI_BASE_PACKAGES="gcc-c++ glibc-devel.x86_64 libstdc++-devel.x86_64 glibc-devel.i686 libstdc++-devel.i686 ccache libtool make git python3 python3-pip which patch lbzip2 xz procps-ng dash rsync coreutils bison util-linux e2fsprogs cmake"
export PIP_PACKAGES="pyzmq"
export GOAL="install"
export NO_WERROR=1 # Suppress error: #warning _FORTIFY_SOURCE > 2 is treated like 2 on this platform [-Werror=cpp]
diff --git a/ci/test/00_setup_env_i686_multiprocess.sh b/ci/test/00_setup_env_i686_multiprocess.sh
index 7b46835b57..0d18e2f029 100755
--- a/ci/test/00_setup_env_i686_multiprocess.sh
+++ b/ci/test/00_setup_env_i686_multiprocess.sh
@@ -9,9 +9,9 @@ export LC_ALL=C.UTF-8
export HOST=i686-pc-linux-gnu
export CONTAINER_NAME=ci_i686_multiprocess
export CI_IMAGE_NAME_TAG="docker.io/amd64/ubuntu:22.04"
-export PACKAGES="cmake llvm clang g++-multilib"
+export PACKAGES="llvm clang g++-multilib"
export DEP_OPTS="DEBUG=1 MULTIPROCESS=1"
export GOAL="install"
export BITCOIN_CONFIG="--enable-debug CC='clang -m32' CXX='clang++ -m32' \
-LDFLAGS='--rtlib=compiler-rt -lgcc_s' CPPFLAGS='-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE'"
+CPPFLAGS='-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE'"
export BITCOIND=bitcoin-node # Used in functional tests
diff --git a/ci/test/00_setup_env_mac.sh b/ci/test/00_setup_env_mac_cross.sh
index 1651c5ec26..31c4bff6ae 100755
--- a/ci/test/00_setup_env_mac.sh
+++ b/ci/test/00_setup_env_mac_cross.sh
@@ -11,13 +11,10 @@ export SDK_URL=${SDK_URL:-https://bitcoincore.org/depends-sources/sdks}
export CONTAINER_NAME=ci_macos_cross
export CI_IMAGE_NAME_TAG="docker.io/ubuntu:22.04"
export HOST=x86_64-apple-darwin
-export PACKAGES="cmake zip"
+export PACKAGES="zip"
export XCODE_VERSION=15.0
export XCODE_BUILD_ID=15A240d
export RUN_UNIT_TESTS=false
export RUN_FUNCTIONAL_TESTS=false
export GOAL="deploy"
-
-# False-positive warning is fixed with clang 17, remove this when that version
-# can be used.
-export BITCOIN_CONFIG="--with-gui --enable-reduce-exports LDFLAGS=-Wno-error=unused-command-line-argument"
+export BITCOIN_CONFIG="--with-gui --enable-reduce-exports"
diff --git a/ci/test/00_setup_env_native_fuzz_with_msan.sh b/ci/test/00_setup_env_native_fuzz_with_msan.sh
index 6055e0ad19..0b32049013 100755
--- a/ci/test/00_setup_env_native_fuzz_with_msan.sh
+++ b/ci/test/00_setup_env_native_fuzz_with_msan.sh
@@ -13,9 +13,9 @@ LIBCXX_FLAGS="-nostdinc++ -nostdlib++ -isystem ${LIBCXX_DIR}include/c++/v1 -L${L
export MSAN_AND_LIBCXX_FLAGS="${MSAN_FLAGS} ${LIBCXX_FLAGS}"
export CONTAINER_NAME="ci_native_fuzz_msan"
-export PACKAGES="cmake ninja-build"
+export PACKAGES="ninja-build"
# BDB generates false-positives and will be removed in future
-export DEP_OPTS="NO_BDB=1 NO_QT=1 CC=clang CXX=clang++ CFLAGS='${MSAN_FLAGS}' CXXFLAGS='${MSAN_AND_LIBCXX_FLAGS}'"
+export DEP_OPTS="DEBUG=1 NO_BDB=1 NO_QT=1 CC=clang CXX=clang++ CFLAGS='${MSAN_FLAGS}' CXXFLAGS='${MSAN_AND_LIBCXX_FLAGS}'"
export GOAL="install"
export BITCOIN_CONFIG="--enable-fuzz --with-sanitizers=fuzzer,memory --disable-hardening --with-asm=no CFLAGS='${MSAN_FLAGS}' CPPFLAGS='-DBOOST_MULTI_INDEX_ENABLE_SAFE_MODE' CXXFLAGS='${MSAN_AND_LIBCXX_FLAGS}'"
export USE_MEMORY_SANITIZER="true"
diff --git a/ci/test/00_setup_env_native_fuzz_with_valgrind.sh b/ci/test/00_setup_env_native_fuzz_with_valgrind.sh
index 1f60c46803..4f80d7ed42 100755
--- a/ci/test/00_setup_env_native_fuzz_with_valgrind.sh
+++ b/ci/test/00_setup_env_native_fuzz_with_valgrind.sh
@@ -16,5 +16,5 @@ export RUN_FUZZ_TESTS=true
export FUZZ_TESTS_CONFIG="--valgrind"
export GOAL="install"
# Temporarily pin dwarf 4, until using Valgrind 3.20 or later
-export BITCOIN_CONFIG="--enable-fuzz --with-sanitizers=fuzzer CC='clang -gdwarf-4' CXX='clang++ -gdwarf-4'"
+export BITCOIN_CONFIG="--enable-fuzz --with-sanitizers=fuzzer CC=clang CXX=clang++ CFLAGS=-gdwarf-4 CXXFLAGS=-gdwarf-4"
export CCACHE_MAXSIZE=200M
diff --git a/ci/test/00_setup_env_native_msan.sh b/ci/test/00_setup_env_native_msan.sh
index d73a7db0e6..60987f5011 100755
--- a/ci/test/00_setup_env_native_msan.sh
+++ b/ci/test/00_setup_env_native_msan.sh
@@ -13,9 +13,9 @@ LIBCXX_FLAGS="-nostdinc++ -nostdlib++ -isystem ${LIBCXX_DIR}include/c++/v1 -L${L
export MSAN_AND_LIBCXX_FLAGS="${MSAN_FLAGS} ${LIBCXX_FLAGS}"
export CONTAINER_NAME="ci_native_msan"
-export PACKAGES="cmake ninja-build"
+export PACKAGES="ninja-build"
# BDB generates false-positives and will be removed in future
-export DEP_OPTS="NO_BDB=1 NO_QT=1 CC=clang CXX=clang++ CFLAGS='${MSAN_FLAGS}' CXXFLAGS='${MSAN_AND_LIBCXX_FLAGS}'"
+export DEP_OPTS="DEBUG=1 NO_BDB=1 NO_QT=1 CC=clang CXX=clang++ CFLAGS='${MSAN_FLAGS}' CXXFLAGS='${MSAN_AND_LIBCXX_FLAGS}'"
export GOAL="install"
export BITCOIN_CONFIG="--with-sanitizers=memory --disable-hardening --with-asm=no CFLAGS='${MSAN_FLAGS}' CXXFLAGS='${MSAN_AND_LIBCXX_FLAGS}'"
export USE_MEMORY_SANITIZER="true"
diff --git a/ci/test/00_setup_env_native_nowallet_libbitcoinkernel.sh b/ci/test/00_setup_env_native_nowallet_libbitcoinkernel.sh
index 20044d7e1c..6f0b9cc285 100755
--- a/ci/test/00_setup_env_native_nowallet_libbitcoinkernel.sh
+++ b/ci/test/00_setup_env_native_nowallet_libbitcoinkernel.sh
@@ -7,9 +7,9 @@
export LC_ALL=C.UTF-8
export CONTAINER_NAME=ci_native_nowallet_libbitcoinkernel
-export CI_IMAGE_NAME_TAG="docker.io/debian:bullseye"
-# Use minimum supported python3.9 and clang-13, see doc/dependencies.md
-export PACKAGES="python3-zmq clang-13 llvm-13 libc++abi-13-dev libc++-13-dev"
-export DEP_OPTS="NO_WALLET=1 CC=clang-13 CXX='clang++-13 -stdlib=libc++'"
+export CI_IMAGE_NAME_TAG="docker.io/ubuntu:22.04"
+# Use minimum supported python3.9 (or best-effort 3.10) and clang-14, see doc/dependencies.md
+export PACKAGES="python3-zmq clang-14 llvm-14 libc++abi-14-dev libc++-14-dev"
+export DEP_OPTS="NO_WALLET=1 CC=clang-14 CXX='clang++-14 -stdlib=libc++'"
export GOAL="install"
export BITCOIN_CONFIG="--enable-reduce-exports --enable-experimental-util-chainstate --with-experimental-kernel-lib --enable-shared"
diff --git a/ci/test/00_setup_env_native_qt5.sh b/ci/test/00_setup_env_native_previous_releases.sh
index f351298f1e..94e88f872f 100755
--- a/ci/test/00_setup_env_native_qt5.sh
+++ b/ci/test/00_setup_env_native_previous_releases.sh
@@ -6,11 +6,11 @@
export LC_ALL=C.UTF-8
-export CONTAINER_NAME=ci_native_qt5
+export CONTAINER_NAME=ci_native_previous_releases
export CI_IMAGE_NAME_TAG="docker.io/debian:bullseye"
# Use minimum supported python3.9 and gcc-10, see doc/dependencies.md
-export PACKAGES="gcc-10 g++-10 python3-zmq qtbase5-dev qttools5-dev-tools libdbus-1-dev libharfbuzz-dev"
-export DEP_OPTS="NO_QT=1 NO_UPNP=1 NO_NATPMP=1 DEBUG=1 ALLOW_HOST_PACKAGES=1 CC=gcc-10 CXX=g++-10"
+export PACKAGES="gcc-10 g++-10 python3-zmq"
+export DEP_OPTS="NO_UPNP=1 NO_NATPMP=1 DEBUG=1 CC=gcc-10 CXX=g++-10"
export TEST_RUNNER_EXTRA="--previous-releases --coverage --extended --exclude feature_dbcrash" # Run extended tests so that coverage does not fail, but exclude the very slow dbcrash
export RUN_UNIT_TESTS_SEQUENTIAL="true"
export RUN_UNIT_TESTS="false"
diff --git a/ci/test/00_setup_env_native_tidy.sh b/ci/test/00_setup_env_native_tidy.sh
index c03392af06..c12044f461 100755
--- a/ci/test/00_setup_env_native_tidy.sh
+++ b/ci/test/00_setup_env_native_tidy.sh
@@ -9,7 +9,7 @@ export LC_ALL=C.UTF-8
export CI_IMAGE_NAME_TAG="docker.io/ubuntu:24.04"
export CONTAINER_NAME=ci_native_tidy
export TIDY_LLVM_V="17"
-export PACKAGES="clang-${TIDY_LLVM_V} libclang-${TIDY_LLVM_V}-dev llvm-${TIDY_LLVM_V}-dev libomp-${TIDY_LLVM_V}-dev clang-tidy-${TIDY_LLVM_V} jq bear cmake libevent-dev libboost-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev systemtap-sdt-dev libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libqrencode-dev libsqlite3-dev libdb++-dev"
+export PACKAGES="clang-${TIDY_LLVM_V} libclang-${TIDY_LLVM_V}-dev llvm-${TIDY_LLVM_V}-dev libomp-${TIDY_LLVM_V}-dev clang-tidy-${TIDY_LLVM_V} jq bear libevent-dev libboost-dev libminiupnpc-dev libnatpmp-dev libzmq3-dev systemtap-sdt-dev libqt5gui5 libqt5core5a libqt5dbus5 qttools5-dev qttools5-dev-tools libqrencode-dev libsqlite3-dev libdb++-dev"
export NO_DEPENDS=1
export RUN_UNIT_TESTS=false
export RUN_FUNCTIONAL_TESTS=false
diff --git a/ci/test/00_setup_env_native_valgrind.sh b/ci/test/00_setup_env_native_valgrind.sh
index daa1a0cdb3..9bdb2b7860 100755
--- a/ci/test/00_setup_env_native_valgrind.sh
+++ b/ci/test/00_setup_env_native_valgrind.sh
@@ -14,4 +14,4 @@ export NO_DEPENDS=1
export TEST_RUNNER_EXTRA="--exclude feature_init,rpc_bind,feature_bind_extra" # Excluded for now, see https://github.com/bitcoin/bitcoin/issues/17765#issuecomment-602068547
export GOAL="install"
# Temporarily pin dwarf 4, until using Valgrind 3.20 or later
-export BITCOIN_CONFIG="--enable-zmq --with-incompatible-bdb --with-gui=no CC='clang -gdwarf-4' CXX='clang++ -gdwarf-4'" # TODO enable GUI
+export BITCOIN_CONFIG="--enable-zmq --with-incompatible-bdb --with-gui=no CC=clang CXX=clang++ CFLAGS=-gdwarf-4 CXXFLAGS=-gdwarf-4" # TODO enable GUI
diff --git a/ci/test/01_base_install.sh b/ci/test/01_base_install.sh
index b15df4b6cc..99813da106 100755
--- a/ci/test/01_base_install.sh
+++ b/ci/test/01_base_install.sh
@@ -36,7 +36,7 @@ if [ -n "$PIP_PACKAGES" ]; then
fi
if [[ ${USE_MEMORY_SANITIZER} == "true" ]]; then
- ${CI_RETRY_EXE} git clone --depth=1 https://github.com/llvm/llvm-project -b llvmorg-17.0.2 /msan/llvm-project
+ ${CI_RETRY_EXE} git clone --depth=1 https://github.com/llvm/llvm-project -b llvmorg-17.0.6 /msan/llvm-project
cmake -G Ninja -B /msan/clang_build/ \
-DLLVM_ENABLE_PROJECTS="clang" \
diff --git a/ci/test/02_run_container.sh b/ci/test/02_run_container.sh
index 64b1e4e182..e6c4a61341 100755
--- a/ci/test/02_run_container.sh
+++ b/ci/test/02_run_container.sh
@@ -12,9 +12,9 @@ set -ex
if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then
# Export all env vars to avoid missing some.
# Though, exclude those with newlines to avoid parsing problems.
- python3 -c 'import os; [print(f"{key}={value}") for key, value in os.environ.items() if "\n" not in value and "HOME" != key and "PATH" != key and "USER" != key]' | tee /tmp/env
+ python3 -c 'import os; [print(f"{key}={value}") for key, value in os.environ.items() if "\n" not in value and "HOME" != key and "PATH" != key and "USER" != key]' | tee "/tmp/env-$USER-$CONTAINER_NAME"
# System-dependent env vars must be kept as is. So read them from the container.
- docker run --rm "${CI_IMAGE_NAME_TAG}" bash -c "env | grep --extended-regexp '^(HOME|PATH|USER)='" | tee --append /tmp/env
+ docker run --rm "${CI_IMAGE_NAME_TAG}" bash -c "env | grep --extended-regexp '^(HOME|PATH|USER)='" | tee --append "/tmp/env-$USER-$CONTAINER_NAME"
echo "Creating $CI_IMAGE_NAME_TAG container to run in"
DOCKER_BUILDKIT=1 docker build \
--file "${BASE_READ_ONLY_DIR}/ci/test_imagefile" \
@@ -44,6 +44,8 @@ if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then
# When detecting podman-docker, `--external` should be added.
docker image prune --force --filter "label=$CI_IMAGE_LABEL"
+ # Append $USER to /tmp/env to support multi-user systems and $CONTAINER_NAME
+ # to allow support starting multiple runs simultaneously by the same user.
# shellcheck disable=SC2086
CI_CONTAINER_ID=$(docker run --cap-add LINUX_IMMUTABLE $CI_CONTAINER_CAP --rm --interactive --detach --tty \
--mount "type=bind,src=$BASE_READ_ONLY_DIR,dst=$BASE_READ_ONLY_DIR,readonly" \
@@ -52,7 +54,7 @@ if [ -z "$DANGER_RUN_CI_ON_HOST" ]; then
--mount "type=volume,src=${CONTAINER_NAME}_depends_sources,dst=$DEPENDS_DIR/sources" \
--mount "type=volume,src=${CONTAINER_NAME}_depends_SDKs_android,dst=$DEPENDS_DIR/SDKs/android" \
--mount "type=volume,src=${CONTAINER_NAME}_previous_releases,dst=$PREVIOUS_RELEASES_DIR" \
- --env-file /tmp/env \
+ --env-file /tmp/env-$USER-$CONTAINER_NAME \
--name "$CONTAINER_NAME" \
"$CONTAINER_NAME")
export CI_CONTAINER_ID
@@ -70,7 +72,7 @@ if [ "$CI_OS_NAME" == "macos" ]; then
fi
CI_EXEC () {
- $CI_EXEC_CMD_PREFIX bash -c "export PATH=${BINS_SCRATCH_DIR}:${BASE_ROOT_DIR}/ci/retry:\$PATH && cd \"${BASE_ROOT_DIR}\" && $*"
+ $CI_EXEC_CMD_PREFIX bash -c "export PATH=\"/path_with space:${BINS_SCRATCH_DIR}:${BASE_ROOT_DIR}/ci/retry:\$PATH\" && cd \"${BASE_ROOT_DIR}\" && $*"
}
export -f CI_EXEC
diff --git a/ci/test/03_test_script.sh b/ci/test/03_test_script.sh
index cdcd731528..786cb08bf6 100755
--- a/ci/test/03_test_script.sh
+++ b/ci/test/03_test_script.sh
@@ -36,8 +36,8 @@ export HOST=${HOST:-$("$BASE_ROOT_DIR/depends/config.guess")}
# CI, so as a temporary minimal fix to work around UB and CI failures, leave
# bytes_written unmodified.
# See https://github.com/bitcoin/bitcoin/pull/28359#issuecomment-1698694748
- echo 'diff --git a/src/leveldb/db/db_impl.cc b/src/leveldb/db/db_impl.cc
-index 65e31724bc..f61b471953 100644
+ # Tee patch to stdout to make it clear CI is testing modified code.
+ tee >(patch -p1) <<'EOF'
--- a/src/leveldb/db/db_impl.cc
+++ b/src/leveldb/db/db_impl.cc
@@ -1028,9 +1028,6 @@ Status DBImpl::DoCompactionWork(CompactionState* compact) {
@@ -49,8 +49,8 @@ index 65e31724bc..f61b471953 100644
- }
mutex_.Lock();
- stats_[compact->compaction->level() + 1].Add(stats);' | patch -p1
- git diff
+ stats_[compact->compaction->level() + 1].Add(stats);
+EOF
)
if [ "$RUN_FUZZ_TESTS" = "true" ]; then
diff --git a/configure.ac b/configure.ac
index 7b286df603..aeb8b71437 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,10 +1,10 @@
AC_PREREQ([2.69])
-define(_CLIENT_VERSION_MAJOR, 26)
+define(_CLIENT_VERSION_MAJOR, 27)
define(_CLIENT_VERSION_MINOR, 99)
define(_CLIENT_VERSION_BUILD, 0)
define(_CLIENT_VERSION_RC, 0)
define(_CLIENT_VERSION_IS_RELEASE, false)
-define(_COPYRIGHT_YEAR, 2023)
+define(_COPYRIGHT_YEAR, 2024)
define(_COPYRIGHT_HOLDERS,[The %s developers])
define(_COPYRIGHT_HOLDERS_SUBSTITUTION,[[Bitcoin Core]])
AC_INIT([Bitcoin Core],m4_join([.], _CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MINOR, _CLIENT_VERSION_BUILD)m4_if(_CLIENT_VERSION_RC, [0], [], [rc]_CLIENT_VERSION_RC),[https://github.com/bitcoin/bitcoin/issues],[bitcoin],[https://bitcoincore.org/])
@@ -249,16 +249,6 @@ AC_ARG_ENABLE([threadlocal],
[use_thread_local=$enableval],
[use_thread_local=auto])
-AC_ARG_ENABLE([asm],
- [AS_HELP_STRING([--disable-asm],
- [disable assembly routines (enabled by default)])],
- [use_asm=$enableval],
- [use_asm=yes])
-
-if test "$use_asm" = "yes"; then
- AC_DEFINE([USE_ASM], [1], [Define this symbol to build in assembly routines])
-fi
-
AC_ARG_ENABLE([zmq],
[AS_HELP_STRING([--disable-zmq],
[disable ZMQ notifications])],
@@ -321,13 +311,17 @@ AC_ARG_ENABLE([external-signer],
[use_external_signer=$enableval],
[use_external_signer=auto])
-AC_ARG_ENABLE([lto],
- [AS_HELP_STRING([--enable-lto],[build using LTO (default is no)])],
- [enable_lto=$enableval],
- [enable_lto=no])
-
AC_LANG_PUSH([C++])
+dnl Always set -g -O2 in our CXXFLAGS. Autoconf will try and set CXXFLAGS to "-g -O2" by default,
+dnl so we suppress that (if CXXFLAGS hasn't been overridden by the user), given we are adding it
+dnl ourselves.
+CORE_CXXFLAGS="$CORE_CXXFLAGS -g -O2"
+
+if test "$CXXFLAGS_overridden" = "no"; then
+ CXXFLAGS=""
+fi
+
dnl Check for a flag to turn compiler warnings into errors. This is helpful for checks which may
dnl appear to succeed because by default they merely emit warnings when they fail.
dnl
@@ -352,12 +346,6 @@ case $host in
esac
if test "$enable_debug" = "yes"; then
- dnl If debugging is enabled, and the user hasn't overridden CXXFLAGS, clear
- dnl them, to prevent autoconfs "-g -O2" being added. Otherwise we'd end up
- dnl with "-O0 -g3 -g -O2".
- if test "$CXXFLAGS_overridden" = "no"; then
- CXXFLAGS=""
- fi
dnl Disable all optimizations
AX_CHECK_COMPILE_FLAG([-O0], [DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -O0"], [], [$CXXFLAG_WERROR])
@@ -377,18 +365,14 @@ if test "$enable_debug" = "yes"; then
AX_CHECK_COMPILE_FLAG([-ftrapv], [DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -ftrapv"], [], [$CXXFLAG_WERROR])
fi
-if test "$enable_lto" = "yes"; then
- AX_CHECK_COMPILE_FLAG([-flto], [LTO_CXXFLAGS="$LTO_CXXFLAGS -flto"], [AC_MSG_ERROR([compile failed with -flto])], [$CXXFLAG_WERROR])
- AX_CHECK_LINK_FLAG([-flto], [LTO_LDFLAGS="$LTO_LDFLAGS -flto"], [AC_MSG_ERROR([link failed with -flto])], [$CXXFLAG_WERROR])
-fi
-
if test "$use_sanitizers" != ""; then
dnl First check if the compiler accepts flags. If an incompatible pair like
dnl -fsanitize=address,thread is used here, this check will fail. This will also
dnl fail if a bad argument is passed, e.g. -fsanitize=undfeined
AX_CHECK_COMPILE_FLAG(
[-fsanitize=$use_sanitizers],
- [SANITIZER_CXXFLAGS="-fsanitize=$use_sanitizers"],
+ [SANITIZER_CXXFLAGS="-fsanitize=$use_sanitizers"
+ SANITIZER_CFLAGS="-fsanitize=$use_sanitizers"],
[AC_MSG_ERROR([compiler did not accept requested flags])])
dnl Some compilers (e.g. GCC) require additional libraries like libasan,
@@ -438,10 +422,7 @@ if test "$CXXFLAGS_overridden" = "no"; then
AX_CHECK_COMPILE_FLAG([-Wsuggest-override], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wsuggest-override"], [], [$CXXFLAG_WERROR])
AX_CHECK_COMPILE_FLAG([-Wimplicit-fallthrough], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wimplicit-fallthrough"], [], [$CXXFLAG_WERROR])
AX_CHECK_COMPILE_FLAG([-Wunreachable-code], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wunreachable-code"], [], [$CXXFLAG_WERROR])
-
- if test "$suppress_external_warnings" != "no" ; then
- AX_CHECK_COMPILE_FLAG([-Wdocumentation], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wdocumentation"], [], [$CXXFLAG_WERROR])
- fi
+ AX_CHECK_COMPILE_FLAG([-Wdocumentation], [WARN_CXXFLAGS="$WARN_CXXFLAGS -Wdocumentation"], [], [$CXXFLAG_WERROR])
dnl Some compilers (gcc) ignore unknown -Wno-* options, but warn about all
dnl unknown options if any other warning is produced. Test the -Wfoo case, and
@@ -469,8 +450,6 @@ enable_sse41=no
enable_avx2=no
enable_x86_shani=no
-if test "$use_asm" = "yes"; then
-
dnl Check for optional instruction set support. Enabling these does _not_ imply that all code will
dnl be compiled with them, rather that specific objects/libs may use them after checking for runtime
dnl compatibility.
@@ -609,8 +588,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
)
CXXFLAGS="$TEMP_CXXFLAGS"
-fi
-
CORE_CPPFLAGS="$CORE_CPPFLAGS -DHAVE_BUILD_INFO"
AC_ARG_WITH([utils],
@@ -740,7 +717,7 @@ case $host in
dnl option to system-ify all /usr/local/include paths without adding it to the list
dnl of search paths in case it's not already there.
if test "$suppress_external_warnings" != "no"; then
- AX_CHECK_PREPROC_FLAG([-Xclang -internal-isystem/usr/local/include], [CORE_CPPFLAGS="$CORE_CPPFLAGS -Xclang -internal-isystem/usr/local/include"], [], [$CXXFLAG_WERROR])
+ AX_CHECK_PREPROC_FLAG([-Xclang -internal-isystem -Xclang /usr/local/include/], [CORE_CPPFLAGS="$CORE_CPPFLAGS -Xclang -internal-isystem -Xclang /usr/local/include/"], [], [$CXXFLAG_WERROR])
fi
if test "$use_bdb" != "no" && $BREW list --versions berkeley-db@4 >/dev/null && test "$BDB_CFLAGS" = "" && test "$BDB_LIBS" = ""; then
@@ -803,7 +780,10 @@ case $host in
AX_CHECK_LINK_FLAG([-Wl,-headerpad_max_install_names], [CORE_LDFLAGS="$CORE_LDFLAGS -Wl,-headerpad_max_install_names"], [], [$LDFLAG_WERROR])
CORE_CPPFLAGS="$CORE_CPPFLAGS -DMAC_OSX -DOBJC_OLD_DISPATCH_PROTOTYPES=0"
- OBJCXXFLAGS="$CXXFLAGS"
+
+ dnl ignore deprecated-declarations warnings coming from objcxx code
+ dnl "'NSUserNotificationCenter' is deprecated: first deprecated in macOS 11.0".
+ OBJCXXFLAGS="$CXXFLAGS -Wno-deprecated-declarations"
;;
*android*)
dnl make sure android stays above linux for hosts like *linux-android*
@@ -869,13 +849,7 @@ if test "$use_lcov" = "yes"; then
[AC_MSG_ERROR([lcov testing requested but --coverage linker flag does not work])])
AX_CHECK_COMPILE_FLAG([--coverage],[CORE_CXXFLAGS="$CORE_CXXFLAGS --coverage"],
[AC_MSG_ERROR([lcov testing requested but --coverage flag does not work])])
- dnl If coverage is enabled, and the user hasn't overridden CXXFLAGS, clear
- dnl them, to prevent autoconfs "-g -O2" being added. Otherwise we'd end up
- dnl with "--coverage -Og -O0 -g -O2".
- if test "$CXXFLAGS_overridden" = "no"; then
- CXXFLAGS=""
- fi
- CORE_CXXFLAGS="$CORE_CXXFLAGS -Og -O0"
+ CORE_CXXFLAGS="$CORE_CXXFLAGS -Og"
fi
if test "$use_lcov_branch" != "no"; then
@@ -987,7 +961,7 @@ if test "$TARGET_OS" = "darwin"; then
AX_CHECK_LINK_FLAG([-Wl,-fixup_chains], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-fixup_chains"], [], [$LDFLAG_WERROR])
fi
-AC_CHECK_HEADERS([endian.h sys/endian.h byteswap.h sys/select.h sys/prctl.h sys/sysctl.h vm/vm_param.h sys/vmmeter.h sys/resources.h])
+AC_CHECK_HEADERS([sys/select.h sys/prctl.h sys/sysctl.h vm/vm_param.h sys/vmmeter.h sys/resources.h])
AC_CHECK_DECLS([getifaddrs, freeifaddrs],[CHECK_SOCKET],,
[#include <sys/types.h>
@@ -1002,18 +976,6 @@ AC_CHECK_DECLS([pipe2])
AC_CHECK_FUNCS([timingsafe_bcmp])
-AC_CHECK_DECLS([le16toh, le32toh, le64toh, htole16, htole32, htole64, be16toh, be32toh, be64toh, htobe16, htobe32, htobe64],,,
- [#if HAVE_ENDIAN_H
- #include <endian.h>
- #elif HAVE_SYS_ENDIAN_H
- #include <sys/endian.h>
- #endif])
-
-AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64],,,
- [#if HAVE_BYTESWAP_H
- #include <byteswap.h>
- #endif])
-
AC_MSG_CHECKING([for __builtin_clzl])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[
(void) __builtin_clzl(0);
@@ -1186,14 +1148,6 @@ AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
[ AC_MSG_RESULT([no])]
)
-AC_MSG_CHECKING([for if type char equals int8_t])
-AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdint.h>
- #include <type_traits>]],
- [[ static_assert(std::is_same<int8_t, char>::value, ""); ]])],
- [ AC_MSG_RESULT([yes]); AC_DEFINE([CHAR_EQUALS_INT8], [1], [Define this symbol if type char equals int8_t]) ],
- [ AC_MSG_RESULT([no])]
-)
-
AC_MSG_CHECKING([for fdatasync])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <unistd.h>]],
[[ fdatasync(0); ]])],
@@ -1338,8 +1292,6 @@ if test "$enable_fuzz_binary" = "yes"; then
]],[[
*/ int not_main() {
]])])
-
- CHECK_RUNTIME_LIB
fi
if test "$enable_wallet" != "no"; then
@@ -1842,7 +1794,6 @@ AM_CONDITIONAL([ENABLE_AVX2], [test "$enable_avx2" = "yes"])
AM_CONDITIONAL([ENABLE_X86_SHANI], [test "$enable_x86_shani" = "yes"])
AM_CONDITIONAL([ENABLE_ARM_CRC], [test "$enable_arm_crc" = "yes"])
AM_CONDITIONAL([ENABLE_ARM_SHANI], [test "$enable_arm_shani" = "yes"])
-AM_CONDITIONAL([USE_ASM], [test "$use_asm" = "yes"])
AM_CONDITIONAL([WORDS_BIGENDIAN], [test "$ac_cv_c_bigendian" = "yes"])
AM_CONDITIONAL([USE_NATPMP], [test "$use_natpmp" = "yes"])
AM_CONDITIONAL([USE_UPNP], [test "$use_upnp" = "yes"])
@@ -1893,8 +1844,6 @@ AC_SUBST(GPROF_LDFLAGS)
AC_SUBST(HARDENED_CXXFLAGS)
AC_SUBST(HARDENED_CPPFLAGS)
AC_SUBST(HARDENED_LDFLAGS)
-AC_SUBST(LTO_CXXFLAGS)
-AC_SUBST(LTO_LDFLAGS)
AC_SUBST(PIC_FLAGS)
AC_SUBST(PIE_FLAGS)
AC_SUBST(SANITIZER_CXXFLAGS)
@@ -1948,6 +1897,9 @@ CPPFLAGS_TEMP="$CPPFLAGS"
unset CPPFLAGS
CPPFLAGS="$CPPFLAGS_TEMP"
+if test -n "$use_sanitizers"; then
+ export SECP_CFLAGS="$SECP_CFLAGS $SANITIZER_CFLAGS"
+fi
ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --enable-module-recovery --disable-module-ecdh"
AC_CONFIG_SUBDIRS([src/secp256k1])
@@ -1996,23 +1948,21 @@ echo " with fuzz binary = $enable_fuzz_binary"
echo " with bench = $use_bench"
echo " with upnp = $use_upnp"
echo " with natpmp = $use_natpmp"
-echo " use asm = $use_asm"
echo " USDT tracing = $use_usdt"
echo " sanitizers = $use_sanitizers"
echo " debug enabled = $enable_debug"
echo " gprof enabled = $enable_gprof"
echo " werror = $enable_werror"
-echo " LTO = $enable_lto"
echo
echo " target os = $host_os"
echo " build os = $build_os"
echo
echo " CC = $CC"
-echo " CFLAGS = $PTHREAD_CFLAGS $CFLAGS"
+echo " CFLAGS = $PTHREAD_CFLAGS $SANITIZER_CFLAGS $CFLAGS"
echo " CPPFLAGS = $DEBUG_CPPFLAGS $HARDENED_CPPFLAGS $CORE_CPPFLAGS $CPPFLAGS"
echo " CXX = $CXX"
-echo " CXXFLAGS = $LTO_CXXFLAGS $DEBUG_CXXFLAGS $HARDENED_CXXFLAGS $WARN_CXXFLAGS $NOWARN_CXXFLAGS $ERROR_CXXFLAGS $GPROF_CXXFLAGS $CORE_CXXFLAGS $CXXFLAGS"
-echo " LDFLAGS = $LTO_LDFLAGS $PTHREAD_LIBS $HARDENED_LDFLAGS $GPROF_LDFLAGS $CORE_LDFLAGS $LDFLAGS"
+echo " CXXFLAGS = $CORE_CXXFLAGS $DEBUG_CXXFLAGS $HARDENED_CXXFLAGS $WARN_CXXFLAGS $NOWARN_CXXFLAGS $ERROR_CXXFLAGS $GPROF_CXXFLAGS $SANITIZER_CXXFLAGS $CXXFLAGS"
+echo " LDFLAGS = $PTHREAD_LIBS $HARDENED_LDFLAGS $GPROF_LDFLAGS $SANITIZER_LDFLAGS $CORE_LDFLAGS $LDFLAGS"
echo " AR = $AR"
echo " ARFLAGS = $ARFLAGS"
echo
diff --git a/contrib/debian/copyright b/contrib/debian/copyright
index ca430170a1..dafc92f8ad 100644
--- a/contrib/debian/copyright
+++ b/contrib/debian/copyright
@@ -5,7 +5,7 @@ Upstream-Contact: Satoshi Nakamoto <satoshin@gmx.com>
Source: https://github.com/bitcoin/bitcoin
Files: *
-Copyright: 2009-2023, Bitcoin Core Developers
+Copyright: 2009-2024, Bitcoin Core Developers
License: Expat
Comment: The Bitcoin Core Developers encompasses all contributors to the
project, listed in the release notes or the git log.
diff --git a/contrib/devtools/clang-format-diff.py b/contrib/devtools/clang-format-diff.py
index 420bf7ff33..e2b661d65d 100755
--- a/contrib/devtools/clang-format-diff.py
+++ b/contrib/devtools/clang-format-diff.py
@@ -1,166 +1,190 @@
#!/usr/bin/env python3
#
-#===- clang-format-diff.py - ClangFormat Diff Reformatter ----*- python -*--===#
+# ===- clang-format-diff.py - ClangFormat Diff Reformatter ----*- python -*--===#
#
-# The LLVM Compiler Infrastructure
+# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+# See https://llvm.org/LICENSE.txt for license information.
+# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#
-# This file is distributed under the University of Illinois Open Source
-# License.
-#
-# ============================================================
-#
-# University of Illinois/NCSA
-# Open Source License
-#
-# Copyright (c) 2007-2015 University of Illinois at Urbana-Champaign.
-# All rights reserved.
-#
-# Developed by:
-#
-# LLVM Team
-#
-# University of Illinois at Urbana-Champaign
-#
-# http://llvm.org
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy of
-# this software and associated documentation files (the "Software"), to deal with
-# the Software without restriction, including without limitation the rights to
-# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-# of the Software, and to permit persons to whom the Software is furnished to do
-# so, subject to the following conditions:
-#
-# * Redistributions of source code must retain the above copyright notice,
-# this list of conditions and the following disclaimers.
-#
-# * Redistributions in binary form must reproduce the above copyright notice,
-# this list of conditions and the following disclaimers in the
-# documentation and/or other materials provided with the distribution.
-#
-# * Neither the names of the LLVM Team, University of Illinois at
-# Urbana-Champaign, nor the names of its contributors may be used to
-# endorse or promote products derived from this Software without specific
-# prior written permission.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-# FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-# CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-# SOFTWARE.
-#
-# ============================================================
-#
-#===------------------------------------------------------------------------===#
-
-r"""
-ClangFormat Diff Reformatter
-============================
+# ===------------------------------------------------------------------------===#
+"""
This script reads input from a unified diff and reformats all the changed
lines. This is useful to reformat all the lines touched by a specific patch.
Example usage for git/svn users:
- git diff -U0 HEAD^ | clang-format-diff.py -p1 -i
- svn diff --diff-cmd=diff -x-U0 | clang-format-diff.py -i
+ git diff -U0 --no-color --relative HEAD^ | {clang_format_diff} -p1 -i
+ svn diff --diff-cmd=diff -x-U0 | {clang_format_diff} -i
+It should be noted that the filename contained in the diff is used unmodified
+to determine the source file to update. Users calling this script directly
+should be careful to ensure that the path in the diff is correct relative to the
+current working directory.
"""
+from __future__ import absolute_import, division, print_function
import argparse
import difflib
-import io
import re
import subprocess
import sys
-
-# Change this to the full path if clang-format is not on the path.
-binary = 'clang-format'
+from io import StringIO
def main():
- parser = argparse.ArgumentParser(description=
- 'Reformat changed lines in diff. Without -i '
- 'option just output the diff that would be '
- 'introduced.')
- parser.add_argument('-i', action='store_true', default=False,
- help='apply edits to files instead of displaying a diff')
- parser.add_argument('-p', metavar='NUM', default=0,
- help='strip the smallest prefix containing P slashes')
- parser.add_argument('-regex', metavar='PATTERN', default=None,
- help='custom pattern selecting file paths to reformat '
- '(case sensitive, overrides -iregex)')
- parser.add_argument('-iregex', metavar='PATTERN', default=
- r'.*\.(cpp|cc|c\+\+|cxx|c|cl|h|hpp|m|mm|inc|js|ts|proto'
- r'|protodevel|java)',
- help='custom pattern selecting file paths to reformat '
- '(case insensitive, overridden by -regex)')
- parser.add_argument('-sort-includes', action='store_true', default=False,
- help='let clang-format sort include blocks')
- parser.add_argument('-v', '--verbose', action='store_true',
- help='be more verbose, ineffective without -i')
- args = parser.parse_args()
-
- # Extract changed lines for each file.
- filename = None
- lines_by_file = {}
- for line in sys.stdin:
- match = re.search(r'^\+\+\+\ (.*?/){%s}(\S*)' % args.p, line)
- if match:
- filename = match.group(2)
- if filename is None:
- continue
-
- if args.regex is not None:
- if not re.match('^%s$' % args.regex, filename):
- continue
- else:
- if not re.match('^%s$' % args.iregex, filename, re.IGNORECASE):
- continue
-
- match = re.search(r'^@@.*\+(\d+)(,(\d+))?', line)
- if match:
- start_line = int(match.group(1))
- line_count = 1
- if match.group(3):
- line_count = int(match.group(3))
- if line_count == 0:
- continue
- end_line = start_line + line_count - 1
- lines_by_file.setdefault(filename, []).extend(
- ['-lines', str(start_line) + ':' + str(end_line)])
-
- # Reformat files containing changes in place.
- for filename, lines in lines_by_file.items():
- if args.i and args.verbose:
- print('Formatting {}'.format(filename))
- command = [binary, filename]
- if args.i:
- command.append('-i')
- if args.sort_includes:
- command.append('-sort-includes')
- command.extend(lines)
- command.extend(['-style=file', '-fallback-style=none'])
- p = subprocess.Popen(command,
- stdout=subprocess.PIPE,
- stderr=None,
- stdin=subprocess.PIPE,
- text=True)
- stdout, stderr = p.communicate()
- if p.returncode != 0:
- sys.exit(p.returncode)
-
- if not args.i:
- with open(filename, encoding="utf8") as f:
- code = f.readlines()
- formatted_code = io.StringIO(stdout).readlines()
- diff = difflib.unified_diff(code, formatted_code,
- filename, filename,
- '(before formatting)', '(after formatting)')
- diff_string = ''.join(diff)
- if len(diff_string) > 0:
- sys.stdout.write(diff_string)
-
-if __name__ == '__main__':
- main()
+ parser = argparse.ArgumentParser(
+ description=__doc__.format(clang_format_diff="%(prog)s"),
+ formatter_class=argparse.RawDescriptionHelpFormatter,
+ )
+ parser.add_argument(
+ "-i",
+ action="store_true",
+ default=False,
+ help="apply edits to files instead of displaying a diff",
+ )
+ parser.add_argument(
+ "-p",
+ metavar="NUM",
+ default=0,
+ help="strip the smallest prefix containing P slashes",
+ )
+ parser.add_argument(
+ "-regex",
+ metavar="PATTERN",
+ default=None,
+ help="custom pattern selecting file paths to reformat "
+ "(case sensitive, overrides -iregex)",
+ )
+ parser.add_argument(
+ "-iregex",
+ metavar="PATTERN",
+ default=r".*\.(?:cpp|cc|c\+\+|cxx|cppm|ccm|cxxm|c\+\+m|c|cl|h|hh|hpp"
+ r"|hxx|m|mm|inc|js|ts|proto|protodevel|java|cs|json|s?vh?)",
+ help="custom pattern selecting file paths to reformat "
+ "(case insensitive, overridden by -regex)",
+ )
+ parser.add_argument(
+ "-sort-includes",
+ action="store_true",
+ default=False,
+ help="let clang-format sort include blocks",
+ )
+ parser.add_argument(
+ "-v",
+ "--verbose",
+ action="store_true",
+ help="be more verbose, ineffective without -i",
+ )
+ parser.add_argument(
+ "-style",
+ help="formatting style to apply (LLVM, GNU, Google, Chromium, "
+ "Microsoft, Mozilla, WebKit)",
+ )
+ parser.add_argument(
+ "-fallback-style",
+ help="The name of the predefined style used as a"
+ "fallback in case clang-format is invoked with"
+ "-style=file, but can not find the .clang-format"
+ "file to use.",
+ )
+ parser.add_argument(
+ "-binary",
+ default="clang-format",
+ help="location of binary to use for clang-format",
+ )
+ args = parser.parse_args()
+
+ # Extract changed lines for each file.
+ filename = None
+ lines_by_file = {}
+ for line in sys.stdin:
+ match = re.search(r"^\+\+\+\ (.*?/){%s}(\S*)" % args.p, line)
+ if match:
+ filename = match.group(2)
+ if filename is None:
+ continue
+
+ if args.regex is not None:
+ if not re.match("^%s$" % args.regex, filename):
+ continue
+ else:
+ if not re.match("^%s$" % args.iregex, filename, re.IGNORECASE):
+ continue
+
+ match = re.search(r"^@@.*\+(\d+)(?:,(\d+))?", line)
+ if match:
+ start_line = int(match.group(1))
+ line_count = 1
+ if match.group(2):
+ line_count = int(match.group(2))
+ # The input is something like
+ #
+ # @@ -1, +0,0 @@
+ #
+ # which means no lines were added.
+ if line_count == 0:
+ continue
+ # Also format lines range if line_count is 0 in case of deleting
+ # surrounding statements.
+ end_line = start_line
+ if line_count != 0:
+ end_line += line_count - 1
+ lines_by_file.setdefault(filename, []).extend(
+ ["-lines", str(start_line) + ":" + str(end_line)]
+ )
+
+ # Reformat files containing changes in place.
+ for filename, lines in lines_by_file.items():
+ if args.i and args.verbose:
+ print("Formatting {}".format(filename))
+ command = [args.binary, filename]
+ if args.i:
+ command.append("-i")
+ if args.sort_includes:
+ command.append("-sort-includes")
+ command.extend(lines)
+ if args.style:
+ command.extend(["-style", args.style])
+ if args.fallback_style:
+ command.extend(["-fallback-style", args.fallback_style])
+
+ try:
+ p = subprocess.Popen(
+ command,
+ stdout=subprocess.PIPE,
+ stderr=None,
+ stdin=subprocess.PIPE,
+ universal_newlines=True,
+ )
+ except OSError as e:
+ # Give the user more context when clang-format isn't
+ # found/isn't executable, etc.
+ raise RuntimeError(
+ 'Failed to run "%s" - %s"' % (" ".join(command), e.strerror)
+ )
+
+ stdout, stderr = p.communicate()
+ if p.returncode != 0:
+ sys.exit(p.returncode)
+
+ if not args.i:
+ with open(filename, encoding="utf8") as f:
+ code = f.readlines()
+ formatted_code = StringIO(stdout).readlines()
+ diff = difflib.unified_diff(
+ code,
+ formatted_code,
+ filename,
+ filename,
+ "(before formatting)",
+ "(after formatting)",
+ )
+ diff_string = "".join(diff)
+ if len(diff_string) > 0:
+ sys.stdout.write(diff_string)
+ sys.exit(1)
+
+
+if __name__ == "__main__":
+ main()
diff --git a/contrib/devtools/iwyu/bitcoin.core.imp b/contrib/devtools/iwyu/bitcoin.core.imp
index 919ffab102..befc949f18 100644
--- a/contrib/devtools/iwyu/bitcoin.core.imp
+++ b/contrib/devtools/iwyu/bitcoin.core.imp
@@ -1,7 +1,4 @@
# Fixups / upstreamed changes
[
- { include: [ "<bits/termios-c_lflag.h>", private, "<termios.h>", public ] },
- { include: [ "<bits/termios-struct.h>", private, "<termios.h>", public ] },
- { include: [ "<bits/termios-tcflow.h>", private, "<termios.h>", public ] },
{ include: [ "<bits/chrono.h>", private, "<chrono>", public ] },
]
diff --git a/contrib/devtools/security-check.py b/contrib/devtools/security-check.py
index 590c2ed87d..f57e9abfec 100755
--- a/contrib/devtools/security-check.py
+++ b/contrib/devtools/security-check.py
@@ -192,6 +192,16 @@ def check_MACHO_control_flow(binary) -> bool:
return True
return False
+def check_MACHO_branch_protection(binary) -> bool:
+ '''
+ Check for branch protection instrumentation
+ '''
+ content = binary.get_content_from_virtual_address(binary.entrypoint, 4, lief.Binary.VA_TYPES.AUTO)
+
+ if content.tolist() == [95, 36, 3, 213]: # bti
+ return True
+ return False
+
BASE_ELF = [
('PIE', check_PIE),
('NX', check_NX),
@@ -231,7 +241,7 @@ CHECKS = {
lief.ARCHITECTURES.X86: BASE_MACHO + [('PIE', check_PIE),
('NX', check_NX),
('CONTROL_FLOW', check_MACHO_control_flow)],
- lief.ARCHITECTURES.ARM64: BASE_MACHO,
+ lief.ARCHITECTURES.ARM64: BASE_MACHO + [('BRANCH_PROTECTION', check_MACHO_branch_protection)],
}
}
diff --git a/contrib/devtools/test-security-check.py b/contrib/devtools/test-security-check.py
index 64daabad4e..48823c7e45 100755
--- a/contrib/devtools/test-security-check.py
+++ b/contrib/devtools/test-security-check.py
@@ -137,12 +137,12 @@ class TestSecurityChecks(unittest.TestCase):
else:
# arm64 darwin doesn't support non-PIE binaries, control flow or executable stacks
self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fno-stack-protector', '-Wl,-no_fixup_chains']),
- (1, executable+': failed NOUNDEFS Canary FIXUP_CHAINS'))
- self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fno-stack-protector', '-Wl,-fixup_chains']),
+ (1, executable+': failed NOUNDEFS Canary FIXUP_CHAINS BRANCH_PROTECTION'))
+ self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fno-stack-protector', '-Wl,-fixup_chains', '-mbranch-protection=bti']),
(1, executable+': failed NOUNDEFS Canary'))
- self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fstack-protector-all', '-Wl,-fixup_chains']),
+ self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-flat_namespace','-fstack-protector-all', '-Wl,-fixup_chains', '-mbranch-protection=bti']),
(1, executable+': failed NOUNDEFS'))
- self.assertEqual(call_security_check(cc, source, executable, ['-fstack-protector-all', '-Wl,-fixup_chains']),
+ self.assertEqual(call_security_check(cc, source, executable, ['-fstack-protector-all', '-Wl,-fixup_chains', '-mbranch-protection=bti']),
(0, ''))
diff --git a/contrib/devtools/test_deterministic_coverage.sh b/contrib/devtools/test_deterministic_coverage.sh
index 8501c72f04..23c260b529 100755
--- a/contrib/devtools/test_deterministic_coverage.sh
+++ b/contrib/devtools/test_deterministic_coverage.sh
@@ -17,21 +17,21 @@ NON_DETERMINISTIC_TESTS=(
"blockfilter_index_tests/blockfilter_index_initial_sync" # src/checkqueue.h: In CCheckQueue::Loop(): while (queue.empty()) { ... }
"coinselector_tests/knapsack_solver_test" # coinselector_tests.cpp: if (equal_sets(setCoinsRet, setCoinsRet2))
"fs_tests/fsbridge_fstream" # deterministic test failure?
- "miner_tests/CreateNewBlock_validity" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
+ "miner_tests/CreateNewBlock_validity" # validation.cpp: if (signals.CallbacksPending() > 10)
"scheduler_tests/manythreads" # scheduler.cpp: CScheduler::serviceQueue()
"scheduler_tests/singlethreadedscheduler_ordered" # scheduler.cpp: CScheduler::serviceQueue()
- "txvalidationcache_tests/checkinputs_test" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "txvalidationcache_tests/tx_mempool_block_doublespend" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "txindex_tests/txindex_initial_sync" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "txvalidation_tests/tx_mempool_reject_coinbase" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "validation_block_tests/processnewblock_signals_ordering" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/coin_mark_dirty_immature_credit" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/dummy_input_size_test" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/importmulti_rescan" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/importwallet_rescan" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/ListCoins" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/scan_for_wallet_transactions" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
- "wallet_tests/wallet_disableprivkeys" # validation.cpp: if (GetMainSignals().CallbacksPending() > 10)
+ "txvalidationcache_tests/checkinputs_test" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "txvalidationcache_tests/tx_mempool_block_doublespend" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "txindex_tests/txindex_initial_sync" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "txvalidation_tests/tx_mempool_reject_coinbase" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "validation_block_tests/processnewblock_signals_ordering" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/coin_mark_dirty_immature_credit" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/dummy_input_size_test" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/importmulti_rescan" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/importwallet_rescan" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/ListCoins" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/scan_for_wallet_transactions" # validation.cpp: if (signals.CallbacksPending() > 10)
+ "wallet_tests/wallet_disableprivkeys" # validation.cpp: if (signals.CallbacksPending() > 10)
)
TEST_BITCOIN_BINARY="src/test/test_bitcoin"
diff --git a/contrib/devtools/test_utxo_snapshots.sh b/contrib/devtools/test_utxo_snapshots.sh
index 93a4cd1683..d7c019f4a6 100755
--- a/contrib/devtools/test_utxo_snapshots.sh
+++ b/contrib/devtools/test_utxo_snapshots.sh
@@ -183,8 +183,8 @@ echo "-- Initial state of the client:"
client_rpc getchainstates
echo
-echo "-- Loading UTXO snapshot into client..."
-client_rpc loadtxoutset "$UTXO_DAT_FILE"
+echo "-- Loading UTXO snapshot into client. Calling RPC in a loop..."
+while ! client_rpc loadtxoutset "$UTXO_DAT_FILE" ; do sleep 10; done
watch -n 0.3 "( tail -n 14 $CLIENT_DATADIR/debug.log ; echo ; ./src/bitcoin-cli -rpcport=$CLIENT_RPC_PORT -datadir=$CLIENT_DATADIR getchainstates) | cat"
diff --git a/contrib/guix/INSTALL.md b/contrib/guix/INSTALL.md
index 61310de724..35ea83e585 100644
--- a/contrib/guix/INSTALL.md
+++ b/contrib/guix/INSTALL.md
@@ -62,9 +62,6 @@ so you should log out and log back in.
Please refer to fanquake's instructions
[here](https://github.com/fanquake/core-review/tree/master/guix).
-Note that the `Dockerfile` is largely equivalent to running through the binary
-tarball installation steps.
-
## Option 4: Using a distribution-maintained package
Note that this section is based on the distro packaging situation at the time of
@@ -74,25 +71,15 @@ https://repology.org/project/guix/versions
### Debian / Ubuntu
-Guix v1.2.0 is available as a distribution package starting in [Debian
-11](https://packages.debian.org/bullseye/guix) and [Ubuntu
-21.04](https://packages.ubuntu.com/search?keywords=guix).
-
-Note that if you intend on using Guix without using any substitutes (more
-details [here][security-model]), v1.2.0 has a known problem when building GnuTLS
-from source. Solutions and workarounds are documented
-[here](#gnutls-test-suite-fail-status-request-revoked).
-
+Guix is available as a distribution package in [Debian
+](https://packages.debian.org/search?keywords=guix) and [Ubuntu
+](https://packages.ubuntu.com/search?keywords=guix).
To install:
```sh
sudo apt install guix
```
-For up-to-date information on Debian and Ubuntu's release history:
-- [Debian release history](https://www.debian.org/releases/)
-- [Ubuntu release history](https://ubuntu.com/about/release-cycle)
-
### Arch Linux
Guix is available in the AUR as
@@ -167,80 +154,41 @@ For reference, the graphic below outlines Guix v1.3.0's dependency graph:
![bootstrap map](https://user-images.githubusercontent.com/6399679/125064185-a9a59880-e0b0-11eb-82c1-9b8e5dc9950d.png)
-#### Consider /tmp on tmpfs
-
-If you use an NVME (SSD) drive, you may encounter [cryptic build errors](#coreutils-fail-teststail-2inotify-dir-recreate). Mounting a [tmpfs at /tmp](https://ubuntu.com/blog/data-driven-analysis-tmp-on-tmpfs) should prevent this and may improve performance as a bonus.
-
-#### Guile
-
-##### Choosing a Guile version and sticking to it
-
-One of the first things you need to decide is which Guile version you want to
-use: Guile v2.2 or Guile v3.0. Unlike the python2 to python3 transition, Guile
-v2.2 and Guile v3.0 are largely compatible, as evidenced by the fact that most
-Guile packages and even [Guix
-itself](https://guix.gnu.org/en/blog/2020/guile-3-and-guix/) support running on
-both.
-
-What is important here is that you **choose one**, and you **remain consistent**
-with your choice throughout **all Guile-related packages**, no matter if they
-are installed via the distribution's package manager or installed from source.
-This is because the files for Guile packages are installed to directories which
-are separated based on the Guile version.
-
-###### Example: Checking that Ubuntu's `guile-git` is compatible with your chosen Guile version
-
-On Ubuntu Focal:
+If you do not care about building each dependency from source, and Guix is
+already packaged for your distribution, you can easily install only the build
+dependencies of Guix. For example, to enable deb-src and install the Guix build
+dependencies on Ubuntu/Debian:
```sh
-$ apt show guile-git
-Package: guile-git
-...
-Depends: guile-2.2, guile-bytestructures, libgit2-dev
-...
+sed -i 's|# deb-src|deb-src|g' /etc/apt/sources.list
+apt update
+apt-get build-dep -y guix
```
-As you can see, the package `guile-git` depends on `guile-2.2`, meaning that it
-was likely built for Guile v2.2. This means that if you decided to use Guile
-v3.0 on Ubuntu Focal, you would need to build guile-git from source instead of
-using the distribution package.
+If this succeeded, you can likely skip to section
+["Building and Installing Guix itself"](#building-and-installing-guix-itself).
-On Ubuntu Hirsute:
-
-```sh
-$ apt show guile-git
-Package: guile-git
-...
-Depends: guile-3.0 | guile-2.2, guile-bytestructures (>= 1.0.7-3~), libgit2-dev (>= 1.0)
-...
-```
-
-In this case, `guile-git` depends on either `guile-3.0` or `guile-2.2`, meaning
-that it would work no matter what Guile version you decided to use.
+#### Guile
###### Corner case: Multiple versions of Guile on one system
-It is recommended to only install one version of Guile, so that build systems do
+It is recommended to only install the required version of Guile, so that build systems do
not get confused about which Guile to use.
-However, if you insist on having both Guile v2.2 and Guile v3.0 installed on
-your system, then you need to **consistently** specify one of
-`GUILE_EFFECTIVE_VERSION=3.0` or `GUILE_EFFECTIVE_VERSION=2.2` to all
+However, if you insist on having more versions of Guile installed on
+your system, then you need to **consistently** specify
+`GUILE_EFFECTIVE_VERSION=3.0` to all
`./configure` invocations for Guix and its dependencies.
##### Installing Guile
-Guile is most likely already packaged for your distribution, so after you have
-[chosen a Guile version](#choosing-a-guile-version-and-sticking-to-it), install
-it via your distribution's package manager.
-
If your distribution splits packages into `-dev`-suffixed and
non-`-dev`-suffixed sub-packages (as is the case for Debian-derived
distributions), please make sure to install both. For example, to install Guile
-v2.2 on Debian/Ubuntu:
+v3.0 on Debian/Ubuntu:
```sh
-apt install guile-2.2 guile-2.2-dev
+apt install guile-3.0 guile-3.0-dev
```
#### Mixing distribution packages and source-built packages
@@ -258,16 +206,16 @@ source-built packages, you will need to augment the `GUILE_LOAD_PATH` and
`GUILE_LOAD_COMPILED_PATH` environment variables so that Guile will look
under the right prefix and find your source-built packages.
-For example, if you are using Guile v2.2, and have Guile packages in the
+For example, if you are using Guile v3.0, and have Guile packages in the
`/usr/local` prefix, either add the following lines to your `.profile` or
`.bash_profile` so that the environment variable is properly set for all future
shell logins, or paste the lines into a POSIX-style shell to temporarily modify
the environment variables of your current shell session.
```sh
-# Help Guile v2.2.x find packages in /usr/local
-export GUILE_LOAD_PATH="/usr/local/share/guile/site/2.2${GUILE_LOAD_PATH:+:}$GUILE_LOAD_PATH"
-export GUILE_LOAD_COMPILED_PATH="/usr/local/lib/guile/2.2/site-ccache${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_COMPILED_LOAD_PATH"
+# Help Guile v3.0.x find packages in /usr/local
+export GUILE_LOAD_PATH="/usr/local/share/guile/site/3.0${GUILE_LOAD_PATH:+:}$GUILE_LOAD_PATH"
+export GUILE_LOAD_COMPILED_PATH="/usr/local/lib/guile/3.0/site-ccache${GUILE_LOAD_COMPILED_PATH:+:}$GUILE_COMPILED_LOAD_PATH"
```
Note that these environment variables are used to check for packages during
@@ -352,7 +300,7 @@ Relevant for:
- Those installing `guile-git` from their distribution where `guile-git` is
built against `libgit2 < 1.1`
-As of v0.4.0, `guile-git` claims to only require `libgit2 >= 0.28.0`, however,
+As of v0.5.2, `guile-git` claims to only require `libgit2 >= 0.28.0`, however,
it actually requires `libgit2 >= 1.1`, otherwise, it will be confused by a
reference of `origin/keyring`: instead of interpreting the reference as "the
'keyring' branch of the 'origin' remote", the reference is interpreted as "the
@@ -366,20 +314,6 @@ Should you be in this situation, you need to build both `libgit2 v1.1.x` and
Source: https://logs.guix.gnu.org/guix/2020-11-12.log#232527
-##### `{scheme,guile}-bytestructures` v1.0.8 and v1.0.9 are broken for Guile v2.2
-
-Relevant for:
-- Those building `{scheme,guile}-bytestructures` from source against Guile v2.2
-
-Commit
-[707eea3](https://github.com/TaylanUB/scheme-bytestructures/commit/707eea3a85e1e375e86702229ebf73d496377669)
-introduced a regression for Guile v2.2 and was first included in v1.0.8, this
-was later corrected in commit
-[ec9a721](https://github.com/TaylanUB/scheme-bytestructures/commit/ec9a721957c17bcda13148f8faa5f06934431ff7)
-and included in v1.1.0.
-
-TL;DR If you decided to use Guile v2.2, do not use `{scheme,guile}-bytestructures` v1.0.8 or v1.0.9.
-
### Building and Installing Guix itself
Start by cloning Guix:
@@ -390,6 +324,7 @@ cd guix
```
You will likely want to build the latest release.
+At the time of writing (November 2023), the latest release was `v1.4.0`.
```
git branch -a -l 'origin/version-*' # check for the latest release
@@ -723,26 +658,18 @@ $ bzcat /var/log/guix/drvs/../...-foo-3.6.12.drv.bz2 | less
times, it may be `/tmp/...drv-1` or `/tmp/...drv-2`. Always consult the build
failure output for the most accurate, up-to-date information.
-### openssl-1.1.1l and openssl-1.1.1n
-
-OpenSSL includes tests that will fail once some certificate has expired. A workaround
-is to change your system clock:
-
-```sh
-sudo timedatectl set-ntp no
-sudo date --set "28 may 2022 15:00:00"
-sudo --login guix build --cores=1 /gnu/store/g9alz81w4q03ncm542487xd001s6akd4-openssl-1.1.1l.drv
-sudo --login guix build --cores=1 /gnu/store/mw6ax0gk33gh082anrdrxp2flrbskxv6-openssl-1.1.1n.drv
-sudo timedatectl set-ntp yes
-```
-
### python(-minimal): [Errno 84] Invalid or incomplete multibyte or wide character
This error occurs when your `$TMPDIR` (default: /tmp) exists on a filesystem
which rejects characters not present in the UTF-8 character code set. An example
is ZFS with the utf8only=on option set.
-More information: https://bugs.python.org/issue37584
+More information: https://github.com/python/cpython/issues/81765
+
+### openssl-1.1.1l and openssl-1.1.1n
+
+OpenSSL includes tests that will fail once some certificate has expired.
+The workarounds from the GnuTLS section immediately below can be used.
### GnuTLS: test-suite FAIL: status-request-revoked
@@ -778,13 +705,41 @@ authorized.
This workaround was described [here](https://issues.guix.gnu.org/44559#5).
Basically:
-1. Turn off networking
2. Turn off NTP
3. Set system time to 2020-10-01
4. guix build --no-substitutes /gnu/store/vhphki5sg9xkdhh2pbc8gi6vhpfzryf0-gnutls-3.6.12.drv
5. Set system time back to accurate current time
6. Turn NTP back on
-7. Turn networking back on
+
+For example,
+
+```sh
+sudo timedatectl set-ntp no
+sudo date --set "01 oct 2020 15:00:00"
+guix build /gnu/store/vhphki5sg9xkdhh2pbc8gi6vhpfzryf0-gnutls-3.6.12.drv
+sudo timedatectl set-ntp yes
+```
+
+#### Workaround 3: Disable the tests in the Guix source code for this single derivation
+
+If all of the above workarounds fail, you can also disable the `tests` phase of
+the derivation via the `arguments` option, as described in the official
+[`package`
+reference](https://guix.gnu.org/manual/en/html_node/package-Reference.html).
+
+For example, to disable the openssl-1.1 check phase:
+
+```diff
+diff --git a/gnu/packages/tls.scm b/gnu/packages/tls.scm
+index f1e844b..1077c4b 100644
+--- a/gnu/packages/tls.scm
++++ b/gnu/packages/tls.scm
+@@ -494,4 +494,5 @@ (define-public openssl-1.1
+ (arguments
+ `(#:parallel-tests? #f
++ #:tests? #f
+ #:test-target "test"
+```
### coreutils: FAIL: tests/tail-2/inotify-dir-recreate
@@ -793,7 +748,7 @@ The inotify-dir-create test fails on "remote" filesystems such as overlayfs
as non-remote.
A relatively easy workaround to this is to make sure that a somewhat traditional
-filesystem is mounted at `/tmp` (where `guix-daemon` performs its builds), see [/tmp on tmpfs](#consider-tmp-on-tmpfs). For
+filesystem is mounted at `/tmp` (where `guix-daemon` performs its builds). For
Docker users, this might mean [using a volume][docker/volumes], [binding
mounting][docker/bind-mnt] from host, or (for those with enough RAM and swap)
[mounting a tmpfs][docker/tmpfs] using the `--tmpfs` flag.
diff --git a/contrib/guix/README.md b/contrib/guix/README.md
index 6bde770c62..6fb647f8a9 100644
--- a/contrib/guix/README.md
+++ b/contrib/guix/README.md
@@ -11,7 +11,7 @@ We achieve bootstrappability by using Guix as a functional package manager.
# Requirements
-Conservatively, you will need an x86_64 machine with:
+Conservatively, you will need:
- 16GB of free disk space on the partition that /gnu/store will reside in
- 8GB of free disk space **per platform triple** you're planning on building
diff --git a/contrib/guix/manifest.scm b/contrib/guix/manifest.scm
index 9206973953..7335596107 100644
--- a/contrib/guix/manifest.scm
+++ b/contrib/guix/manifest.scm
@@ -525,5 +525,5 @@ inspecting signatures in Mach-O binaries.")
((string-contains target "-linux-")
(list (make-bitcoin-cross-toolchain target)))
((string-contains target "darwin")
- (list clang-toolchain-15 binutils cmake-minimal python-signapple zip))
+ (list clang-toolchain-17 binutils cmake-minimal python-signapple zip))
(else '())))))
diff --git a/contrib/macdeploy/detached-sig-create.sh b/contrib/macdeploy/detached-sig-create.sh
index 626381cf43..097a7c35ee 100755
--- a/contrib/macdeploy/detached-sig-create.sh
+++ b/contrib/macdeploy/detached-sig-create.sh
@@ -24,7 +24,7 @@ fi
rm -rf ${TEMPDIR}
mkdir -p ${TEMPDIR}
-${SIGNAPPLE} sign -f --detach "${TEMPDIR}/${OUTROOT}" "$@" "${BUNDLE}"
+${SIGNAPPLE} sign -f --detach "${TEMPDIR}/${OUTROOT}" "$@" "${BUNDLE}" --hardened-runtime
tar -C "${TEMPDIR}" -czf "${OUT}" .
rm -rf "${TEMPDIR}"
diff --git a/contrib/seeds/README.md b/contrib/seeds/README.md
index 6db77cbbea..ad1ac4a64d 100644
--- a/contrib/seeds/README.md
+++ b/contrib/seeds/README.md
@@ -4,7 +4,7 @@ Utility to generate the seeds.txt list that is compiled into the client
(see [src/chainparamsseeds.h](/src/chainparamsseeds.h) and other utilities in [contrib/seeds](/contrib/seeds)).
Be sure to update `PATTERN_AGENT` in `makeseeds.py` to include the current version,
-and remove old versions as necessary (at a minimum when GetDesirableServiceFlags
+and remove old versions as necessary (at a minimum when SeedsServiceFlags()
changes its default return value, as those are the services which seeds are added
to addrman with).
diff --git a/contrib/seeds/makeseeds.py b/contrib/seeds/makeseeds.py
index f03c2ab5e8..79bb178b21 100755
--- a/contrib/seeds/makeseeds.py
+++ b/contrib/seeds/makeseeds.py
@@ -27,6 +27,7 @@ MIN_BLOCKS = 730000
PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):(\d+)$")
PATTERN_IPV6 = re.compile(r"^\[([0-9a-z:]+)\]:(\d+)$")
PATTERN_ONION = re.compile(r"^([a-z2-7]{56}\.onion):(\d+)$")
+PATTERN_I2P = re.compile(r"^([a-z2-7]{52}\.b32.i2p):(\d+)$")
PATTERN_AGENT = re.compile(
r"^/Satoshi:("
r"0.14.(0|1|2|3|99)|"
@@ -40,7 +41,8 @@ PATTERN_AGENT = re.compile(
r"22.(0|1|99)|"
r"23.(0|1|99)|"
r"24.(0|1|99)|"
- r"25.99"
+ r"25.(0|1|99)|"
+ r"26.(0|99)|"
r")")
def parseline(line: str) -> Union[dict, None]:
@@ -65,7 +67,13 @@ def parseline(line: str) -> Union[dict, None]:
if m is None:
m = PATTERN_ONION.match(sline[0])
if m is None:
- return None
+ m = PATTERN_I2P.match(sline[0])
+ if m is None:
+ return None
+ else:
+ net = 'i2p'
+ ipstr = sortkey = m.group(1)
+ port = int(m.group(2))
else:
net = 'onion'
ipstr = sortkey = m.group(1)
@@ -140,6 +148,7 @@ def filterbyasn(asmap: ASMap, ips: list[dict], max_per_asn: dict, max_per_net: i
# Sift out ips by type
ips_ipv46 = [ip for ip in ips if ip['net'] in ['ipv4', 'ipv6']]
ips_onion = [ip for ip in ips if ip['net'] == 'onion']
+ ips_i2p = [ip for ip in ips if ip['net'] == 'i2p']
# Filter IPv46 by ASN, and limit to max_per_net per network
result = []
@@ -163,6 +172,7 @@ def filterbyasn(asmap: ASMap, ips: list[dict], max_per_asn: dict, max_per_net: i
# Add back Onions (up to max_per_net)
result.extend(ips_onion[0:max_per_net])
+ result.extend(ips_i2p[0:max_per_net])
return result
def ip_stats(ips: list[dict]) -> str:
@@ -172,7 +182,7 @@ def ip_stats(ips: list[dict]) -> str:
if ip is not None:
hist[ip['net']] += 1
- return f"{hist['ipv4']:6d} {hist['ipv6']:6d} {hist['onion']:6d}"
+ return f"{hist['ipv4']:6d} {hist['ipv6']:6d} {hist['onion']:6d} {hist['i2p']:6d}"
def parse_args():
argparser = argparse.ArgumentParser(description='Generate a list of bitcoin node seed ip addresses.')
@@ -194,7 +204,7 @@ def main():
ips = [parseline(line) for line in lines]
print('Done.', file=sys.stderr)
- print('\x1b[7m IPv4 IPv6 Onion Pass \x1b[0m', file=sys.stderr)
+ print('\x1b[7m IPv4 IPv6 Onion I2P Pass \x1b[0m', file=sys.stderr)
print(f'{ip_stats(ips):s} Initial', file=sys.stderr)
# Skip entries with invalid address.
ips = [ip for ip in ips if ip is not None]
@@ -208,11 +218,12 @@ def main():
# Require service bit 1.
ips = [ip for ip in ips if (ip['service'] & 1) == 1]
print(f'{ip_stats(ips):s} Require service bit 1', file=sys.stderr)
- # Require at least 50% 30-day uptime for clearnet, 10% for onion.
+ # Require at least 50% 30-day uptime for clearnet, 10% for onion and i2p.
req_uptime = {
'ipv4': 50,
'ipv6': 50,
'onion': 10,
+ 'i2p' : 10,
}
ips = [ip for ip in ips if ip['uptime'] > req_uptime[ip['net']]]
print(f'{ip_stats(ips):s} Require minimum uptime', file=sys.stderr)
diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt
index 100fe09685..be7607c0f7 100644
--- a/contrib/seeds/nodes_main.txt
+++ b/contrib/seeds/nodes_main.txt
@@ -1,894 +1,1746 @@
-1.65.195.98:8333 # AS4760
-2.59.236.56:8333 # AS24904
-2.83.114.20:8333 # AS8657
-2.248.194.16:8333 # AS3301
-5.2.154.6:8333 # AS8708
-5.101.140.30:8333 # AS42831
+1.253.159.19:8333 # AS9318
+2.152.74.211:8333 # AS12430
+5.2.23.226:8333 # AS21472
5.128.87.126:8333 # AS31200
-5.144.21.49:8333 # AS15600
-5.172.132.104:8333 # AS15600
+5.157.103.202:8333 # AS35612
5.188.62.18:8333 # AS34665
-5.200.2.180:8333 # AS49544
+5.253.18.218:8333 # AS58073
+5.255.109.160:8333 # AS60404
8.129.184.255:8333 # AS37963
-8.209.105.138:8333 # AS45102
+8.209.70.77:8333 # AS45102
+8.210.18.56:8333 # AS45102
12.34.98.148:8333 # AS7018
-14.199.102.151:8333 # AS9269
18.27.79.17:8333 # AS3
-18.27.124.231:8333 # AS3
-18.216.249.151:8333 # AS16509
-23.88.155.58:8333 # AS10242
-23.93.101.158:8333 # AS46375
-23.109.156.76:8333 # AS7979
-23.175.0.220:8333 # AS395502
+23.93.170.118:8333 # AS46375
+23.154.136.144:8333 # AS54002
+23.175.0.212:8333 # AS395502
23.175.0.222:8333 # AS395502
-24.232.36.225:8333 # AS7303
+24.84.164.50:8333 # AS6327
+24.86.90.127:8333 # AS6327
+24.101.126.194:8333 # AS27364
+24.183.75.154:8333 # AS20115
27.124.108.19:8333 # AS58511
27.148.206.140:8333 # AS4134
-31.7.70.195:8333 # AS49666
31.25.98.16:8333 # AS48635
31.41.23.249:8333 # AS31287
-31.47.102.92:8333 # AS8251
31.47.202.112:8333 # AS34385
-31.165.78.146:8333 # AS6730
-31.165.228.138:8333 # AS6730
-34.64.101.4:8333 # AS139070
-34.105.19.97:8333 # AS15169
-34.126.107.179:8333 # AS396982
-34.126.115.35:8333 # AS396982
-35.245.186.117:8333 # AS15169
+31.156.128.248:8333 # AS30722
+31.164.160.162:8333 # AS6730
+31.201.190.134:8333 # AS50266
+31.208.34.61:8333 # AS29518
+34.78.14.25:8333 # AS15169
+34.80.134.68:8333 # AS15169
+35.137.133.225:8333 # AS7843
+35.193.192.48:8333 # AS396982
+35.194.39.250:8333 # AS396982
37.15.60.144:8333 # AS12479
-37.16.105.63:8333 # AS20904
-37.120.155.34:8333 # AS9009
+37.60.228.251:8333 # AS31214
+37.60.229.117:8333 # AS31214
+37.110.132.94:8333 # AS42610
37.120.179.29:8333 # AS47147
37.139.102.73:8333 # AS35816
-37.193.227.16:8333 # AS31200
+37.157.192.94:8333 # AS197019
37.220.135.151:8333 # AS41206
-38.53.129.67:8333 # AS40237
+38.9.81.160:8333 # AS16904
+38.21.221.252:8333 # AS40545
38.54.14.89:8333 # AS138915
-38.141.134.140:8333 # AS174
-38.145.151.150:8333 # AS40545
-41.72.154.66:8333 # AS37153
-43.143.203.198:8333 # AS45090
-45.15.124.117:8333 # AS35913
-45.43.97.103:8333 # AS26827
-45.44.213.116:8333 # AS54198
-45.58.187.101:8333 # AS46844
-45.79.192.236:8333 # AS63949
-45.81.241.97:8333 # AS30823
-45.83.220.102:8333 # AS39351
-45.83.241.46:8333 # AS206238
-45.87.106.57:8333 # AS39238
-45.129.38.5:8333 # AS49666
-45.130.20.177:8333 # AS3214
-45.134.142.40:8333 # AS60068
-45.135.4.143:8333 # AS25596
-45.135.92.127:8333 # AS12555
-45.145.188.112:8333 # AS206805
-46.23.87.218:8333 # AS51088
-46.32.50.98:8333 # AS39642
-46.32.78.17:8333 # AS48416
-46.59.40.91:8333 # AS8473
-46.138.246.77:8333 # AS8359
+38.91.106.111:8333 # AS63023
+38.102.85.36:8333 # AS174
+42.2.162.218:8333 # AS4760
+43.129.75.20:8333 # AS132203
+43.159.61.16:8333 # AS132203
+43.225.62.107:8333 # AS63953
+43.245.196.214:8333 # AS63916
+45.13.7.221:8333 # AS60377
+45.44.213.123:8333 # AS54198
+45.48.75.224:8333 # AS20001
+45.79.76.12:8333 # AS63949
+45.94.209.127:8333 # AS13789
+45.130.23.57:8333 # AS3214
+45.132.118.25:8333 # AS208451
+45.144.249.207:8333 # AS203936
+45.145.40.43:8333 # AS63213
+45.155.169.30:8333 # AS62000
+46.17.99.13:8333 # AS57043
+46.17.99.26:8333 # AS57043
+46.21.250.25:8333 # AS24875
+46.28.204.161:8333 # AS197988
+46.128.199.26:8333 # AS16097
+46.164.59.139:8333 # AS21283
46.166.142.2:8333 # AS43350
-46.166.162.59:8333 # AS16125
-46.175.178.3:8333 # AS28725
-46.188.15.6:8333 # AS39153
-46.188.30.118:8333 # AS39153
-46.223.223.216:8333 # AS51185
-46.226.18.135:8333 # AS52176
-47.88.86.79:8333 # AS45102
-47.148.7.69:8333 # AS5650
-47.198.223.60:8333 # AS5650
-50.2.13.164:8333 # AS62904
-50.4.135.84:8333 # AS12083
-50.53.39.237:8333 # AS20055
+46.172.233.241:8333 # AS6752
+46.252.5.112:8333 # AS206774
+47.28.85.71:8333 # AS20115
+47.176.248.250:8333 # AS5650
+47.198.60.180:8333 # AS5650
+50.27.22.141:8333 # AS19108
+50.39.170.149:8333 # AS20055
50.53.250.162:8333 # AS20055
-50.68.121.44:8333 # AS6327
-50.117.132.178:8333 # AS577
51.154.62.103:8333 # AS15796
51.158.150.155:8333 # AS12876
-51.250.46.215:8333 # AS200350
-54.176.63.16:8333 # AS16509
-58.158.0.86:8333 # AS2519
+51.174.206.76:8333 # AS29695
+54.217.136.122:8333 # AS16509
+54.253.15.33:8333 # AS16509
+57.128.96.115:8333 # AS8220
+57.128.148.169:8333 # AS8220
+58.6.46.171:8333 # AS7545
+58.96.77.114:8333 # AS10143
+58.96.123.120:8333 # AS38195
+58.168.253.35:8333 # AS1221
+59.167.191.60:8333 # AS4739
60.205.205.119:8333 # AS37963
+60.212.189.151:8333 # AS4837
61.74.99.193:8333 # AS4766
-61.92.59.104:8333 # AS9269
-62.122.173.171:8333 # AS50245
+62.24.76.122:8333 # AS16019
+62.106.70.249:8333 # AS8100
+62.168.65.42:8333 # AS5578
62.171.129.32:8333 # AS51167
-62.178.27.239:8333 # AS8412
-62.209.210.3:8333 # AS6855
-62.215.127.73:8333 # AS21050
-62.238.148.104:8333 # AS15435
-62.245.153.8:8333 # AS8767
-64.146.136.45:8333 # AS16713
-65.21.134.184:8333 # AS24940
-66.18.13.146:8333 # AS13767
-66.23.233.43:8333 # AS19318
-66.27.98.216:8333 # AS20001
-66.29.129.218:8333 # AS22612
-66.38.94.13:8333 # AS11979
+62.245.75.70:8333 # AS16019
+62.248.8.167:8333 # AS16010
+64.23.150.211:8333 # AS3064
+64.98.119.136:8333 # AS32133
+65.24.75.34:8333 # AS7843
+65.175.185.101:8333 # AS11776
66.45.141.46:8333 # AS11232
-66.58.243.215:8333 # AS8047
-66.114.33.49:8333 # AS23175
-66.198.211.167:8333 # AS10835
-66.208.64.128:8333 # AS10352
-66.219.196.170:8333 # AS29933
+66.58.163.185:8333 # AS8047
+66.85.133.182:8333 # AS12189
+66.206.22.26:8333 # AS29802
+67.40.102.33:8333 # AS209
+67.43.210.62:8333 # AS394883
+67.82.136.177:8333 # AS6128
+67.193.87.50:8333 # AS7992
67.210.228.203:8333 # AS7819
-68.183.75.251:8333 # AS14061
-68.194.125.140:8333 # AS6128
-68.199.120.17:8333 # AS6128
+67.211.211.118:8333 # AS19318
+67.231.246.58:8333 # AS40244
+68.6.84.222:8333 # AS22773
+68.48.136.216:8333 # AS7922
+68.69.170.92:8333 # AS6315
69.4.94.226:8333 # AS36352
69.8.175.201:8333 # AS21766
-69.59.18.22:8333 # AS397444
+69.57.160.49:8333 # AS22612
+69.112.103.124:8333 # AS6128
69.196.152.33:8333 # AS5645
-69.228.219.124:8333 # AS7018
-70.64.27.12:8333 # AS6327
-70.160.240.132:8333 # AS22773
-71.79.109.128:8333 # AS7843
-71.184.193.75:8333 # AS701
-72.15.59.173:8333 # AS21949
-72.48.253.168:8333 # AS7459
-72.207.171.210:8333 # AS22773
-73.117.132.138:8333 # AS7922
-73.212.226.59:8333 # AS7922
-74.76.151.110:8333 # AS7843
-74.91.115.229:8333 # AS14586
+71.19.148.180:8333 # AS6939
+73.227.153.213:8333 # AS1351
+74.50.81.93:8333 # AS19318
+74.101.205.214:8333 # AS701
74.118.137.119:8333 # AS20326
74.213.175.108:8333 # AS21949
74.213.251.239:8333 # AS14978
74.220.255.190:8333 # AS23175
-74.221.189.109:8333 # AS26827
-75.83.203.225:8333 # AS20001
-75.172.52.186:8333 # AS209
-76.24.143.22:8333 # AS1351
-76.69.202.247:8333 # AS577
-76.73.198.242:8333 # AS12083
-76.119.248.240:8333 # AS1351
77.20.48.144:8333 # AS3209
-77.22.152.239:8333 # AS204028
-77.37.224.222:8333 # AS42610
-77.48.196.234:8333 # AS16019
-77.70.16.245:8333 # AS8717
+77.21.149.160:8333 # AS204028
+77.37.240.209:8333 # AS42610
+77.43.14.68:8333 # AS5396
+77.111.57.109:8333 # AS3212
77.162.190.90:8333 # AS1136
-78.20.227.249:8333 # AS6848
-78.21.167.8:8333 # AS6848
+77.173.132.140:8333 # AS1136
+77.202.10.220:8333 # AS15557
+78.27.139.13:8333 # AS6723
+78.31.71.190:8333 # AS24961
78.35.147.203:8333 # AS8422
-78.108.108.25:8333 # AS8251
-78.154.237.60:8333 # AS9155
-79.11.31.76:8333 # AS3269
-79.87.88.235:8333 # AS15557
-79.101.1.25:8333 # AS8400
-79.124.7.241:8333 # AS203380
+78.42.144.24:8333 # AS51185
+78.43.153.185:8333 # AS51185
+78.56.89.146:8333 # AS8764
+78.70.208.53:8333 # AS3301
+79.109.120.38:8333 # AS12430
+79.116.56.89:8333 # AS57269
79.124.7.253:8333 # AS203380
-79.150.68.42:8333 # AS3352
-79.249.10.53:8333 # AS3320
-80.82.21.77:8333 # AS42927
-80.82.76.59:8333 # AS202425
-80.88.172.227:8333 # AS31263
-80.93.213.246:8333 # AS42910
-80.111.142.213:8333 # AS6830
-80.208.227.134:8333 # AS62282
-80.208.228.9:8333 # AS62282
-80.209.64.86:8333 # AS31027
+79.136.250.162:8333 # AS9049
+80.83.186.25:8333 # AS33891
+80.98.75.248:8333 # AS21334
80.229.28.60:8333 # AS2856
-81.7.16.182:8333 # AS35366
+80.244.26.192:8333 # AS35432
+81.4.110.168:8333 # AS198203
+81.7.17.202:8333 # AS35366
81.19.10.2:8333 # AS24641
-81.162.196.43:8333 # AS34955
+81.83.214.134:8333 # AS6848
+81.170.142.100:8333 # AS8473
81.171.22.143:8333 # AS60781
-81.172.221.4:8333 # AS12430
-81.224.44.164:8333 # AS3301
-81.245.96.36:8333 # AS5432
-82.1.68.54:8333 # AS5089
+81.242.239.139:8333 # AS5432
82.66.10.11:8333 # AS12322
-82.66.211.31:8333 # AS12322
-82.71.4.154:8333 # AS13037
+82.66.204.177:8333 # AS12322
82.96.96.40:8333 # AS29686
-82.116.50.101:8333 # AS30936
-82.136.98.249:8333 # AS8821
-82.195.237.253:8333 # AS1836
-83.137.41.10:8333 # AS31394
-83.171.175.5:8333 # AS8767
+82.149.225.249:8333 # AS29551
+82.155.148.211:8333 # AS8657
+82.181.218.133:8333 # AS16086
+83.99.247.25:8333 # AS24651
+83.136.232.21:8333 # AS29182
+83.192.226.66:8333 # AS3215
83.208.193.242:8333 # AS5610
-83.233.76.165:8333 # AS29518
-83.240.89.196:8333 # AS31246
-84.38.3.249:8333 # AS196691
-84.54.23.48:8333 # AS35913
-84.126.216.77:8333 # AS12430
+83.240.118.196:8333 # AS31246
+84.7.219.130:8333 # AS15557
+84.52.64.82:8333 # AS25408
+84.64.99.78:8333 # AS5378
+84.112.60.16:8333 # AS8412
+84.113.129.195:8333 # AS8412
84.211.187.211:8333 # AS41164
-84.246.200.122:8333 # AS42455
-84.255.244.61:8333 # AS34779
-85.165.42.115:8333 # AS2119
-85.194.238.134:8333 # AS47605
-85.208.69.21:8333 # AS25091
-85.208.71.36:8333 # AS42275
-85.209.240.91:8333 # AS205581
+84.217.134.213:8333 # AS2119
+84.247.128.15:8333 # AS49788
+84.247.132.27:8333 # AS29286
+84.247.173.117:8333 # AS29286
+84.247.179.51:8333 # AS49788
+84.255.245.194:8333 # AS34779
+85.145.79.26:8333 # AS50266
+85.173.165.66:8333 # AS12389
+85.195.196.86:8333 # AS13030
85.214.118.71:8333 # AS6724
-85.214.161.252:8333 # AS6724
-85.236.190.252:8333 # AS35032
-85.243.115.136:8333 # AS8657
86.22.20.13:8333 # AS5089
-86.49.34.92:8333 # AS16019
-86.95.8.249:8333 # AS1136
-86.104.228.10:8333 # AS31638
-86.104.228.23:8333 # AS31638
+86.45.238.115:8333 # AS5466
+86.182.223.189:8333 # AS2856
+86.215.168.115:8333 # AS3215
87.79.94.221:8333 # AS8422
-88.10.89.23:8333 # AS3352
+87.90.94.120:8333 # AS5410
+87.92.171.53:8333 # AS16086
+87.236.195.198:8333 # AS35592
+87.236.199.197:8333 # AS35592
+88.6.31.66:8333 # AS3352
+88.9.73.252:8333 # AS3352
88.84.223.30:8333 # AS21453
-88.86.125.50:8333 # AS39392
-88.90.77.100:8333 # AS2119
-88.97.40.50:8333 # AS13037
-88.137.109.62:8333 # AS15557
-88.147.244.250:8333 # AS12389
-88.208.115.70:8333 # AS29208
-88.212.53.246:8333 # AS42841
-89.35.142.168:8333 # AS34977
-89.78.111.197:8333 # AS6830
-89.117.59.129:8333 # AS1239
-89.147.108.200:8333 # AS44735
-89.163.132.180:8333 # AS24961
+88.146.114.173:8333 # AS29208
+89.35.142.177:8333 # AS34977
+89.44.41.142:8333 # AS56478
+89.116.25.234:8333 # AS398465
+89.117.58.113:8333 # AS1239
+89.117.172.121:8333 # AS3320
89.165.232.242:8333 # AS48161
-89.216.21.96:8333 # AS31042
-90.50.172.182:8333 # AS3215
-90.146.130.214:8333 # AS12605
-90.146.208.162:8333 # AS12605
+89.190.142.56:8333 # AS38919
+89.216.91.120:8333 # AS31042
+89.247.224.28:8333 # AS8881
+90.146.207.67:8333 # AS12605
90.156.26.148:8333 # AS12741
-90.163.172.139:8333 # AS12479
-90.177.163.77:8333 # AS5610
-91.67.145.110:8333 # AS3209
-91.93.194.154:8333 # AS34984
+90.163.172.78:8333 # AS12479
+90.192.118.202:8333 # AS5607
+90.208.159.11:8333 # AS5607
+90.247.70.31:8333 # AS5378
+91.86.25.207:8333 # AS47377
91.123.182.164:8333 # AS51648
91.123.183.219:8333 # AS51792
+91.134.145.202:8333 # AS16276
91.135.0.187:8333 # AS12496
-91.147.232.98:8333 # AS5483
-91.184.168.249:8333 # AS9063
-91.193.237.116:8333 # AS42916
-91.199.41.45:8333 # AS6866
+91.152.122.36:8333 # AS6667
+91.184.174.191:8333 # AS9063
91.204.149.5:8333 # AS42765
+91.206.17.195:8333 # AS13259
+91.209.51.131:8333 # AS48239
91.215.91.254:8333 # AS48078
-91.219.25.232:8333 # AS50448
+91.231.182.53:8333 # AS44103
+91.236.251.137:8333 # AS57944
+91.236.251.139:8333 # AS57944
91.237.88.218:8333 # AS56813
92.27.150.46:8333 # AS13285
92.27.150.47:8333 # AS13285
-92.221.20.232:8333 # AS29695
-92.221.126.65:8333 # AS29695
-93.33.192.204:8333 # AS12874
-93.41.237.78:8333 # AS12874
-93.95.88.13:8333 # AS35434
-93.95.227.125:8333 # AS44735
+92.42.110.219:8333 # AS1273
+92.43.187.34:8333 # AS8359
+92.206.105.31:8333 # AS20880
+92.233.2.59:8333 # AS5089
+92.240.181.45:8333 # AS16246
+93.51.13.120:8333 # AS12874
+93.57.81.162:8333 # AS12874
+93.71.19.130:8333 # AS30722
+93.81.254.159:8333 # AS8402
+93.90.82.227:8333 # AS47626
+93.100.35.189:8333 # AS35807
93.103.13.1:8333 # AS34779
-93.115.86.239:8333 # AS3223
93.123.180.164:8333 # AS35539
-93.186.201.173:8333 # AS24961
-93.190.117.26:8333 # AS196881
+93.177.188.74:8333 # AS16010
+93.188.102.53:8333 # AS43989
94.19.7.55:8333 # AS35807
-94.23.21.80:8333 # AS16276
-94.23.205.110:8333 # AS16276
-94.131.0.73:8333 # AS29632
-94.142.237.4:8333 # AS48926
-94.154.159.99:8333 # AS62240
-94.202.50.200:8333 # AS15802
+94.63.75.74:8333 # AS12353
+94.72.141.61:8333 # AS57344
+94.72.143.47:8333 # AS203380
+94.105.53.124:8333 # AS47377
+94.181.46.106:8333 # AS9049
94.231.253.18:8333 # AS35224
95.42.140.142:8333 # AS8866
-95.67.18.100:8333 # AS34867
-95.70.238.176:8333 # AS12735
-95.83.73.31:8333 # AS8359
-95.90.128.3:8333 # AS204028
+95.82.130.223:8333 # AS31246
+95.88.61.176:8333 # AS204028
+95.105.172.171:8333 # AS15962
95.110.234.93:8333 # AS31034
-95.161.12.45:8333 # AS39598
-95.172.62.167:8333 # AS201826
-95.179.128.87:8333 # AS20473
+95.164.182.44:8333 # AS29632
95.191.130.100:8333 # AS12389
-95.214.53.154:8333 # AS201814
96.3.53.254:8333 # AS11232
-97.75.145.12:8333 # AS22709
-97.81.198.180:8333 # AS20115
-97.87.216.110:8333 # AS20115
-99.229.210.111:8333 # AS812
+97.75.144.9:8333 # AS22709
+98.17.95.93:8333 # AS398465
+98.128.230.186:8333 # AS8473
+98.163.242.149:8333 # AS22773
+98.229.126.23:8333 # AS1351
+99.233.20.215:8333 # AS812
99.246.87.2:8333 # AS812
-101.43.124.195:8333 # AS45090
-102.132.192.141:8333 # AS37680
-103.21.3.89:8333 # AS38195
-103.35.121.72:8333 # AS9498
-103.99.168.100:8333 # AS6939
-103.99.168.140:8333 # AS6939
+101.51.138.194:8333 # AS38040
+102.130.113.94:8333 # AS328364
103.99.170.210:8333 # AS54415
103.99.170.220:8333 # AS54415
-103.105.202.50:8333 # AS137764
-104.238.220.199:8333 # AS23470
-104.243.33.165:8333 # AS23470
+103.156.165.171:8333 # AS63859
+103.219.169.49:8333 # AS13335
+104.171.202.244:8333 # AS30496
+104.225.220.33:8333 # AS29802
104.244.73.6:8333 # AS53667
-108.26.125.214:8333 # AS701
+104.244.79.131:8333 # AS53667
+108.49.65.132:8333 # AS701
109.86.60.33:8333 # AS13188
+109.91.141.145:8333 # AS3209
109.99.63.159:8333 # AS9050
109.120.194.136:8333 # AS34569
-109.123.233.138:8333 # AS15685
-109.123.240.53:8333 # AS15685
-109.153.94.35:8333 # AS2856
-109.173.126.157:8333 # AS42610
-109.193.76.200:8333 # AS51185
-109.221.229.197:8333 # AS3215
-109.236.90.117:8333 # AS49981
-109.248.206.13:8333 # AS203493
-111.90.140.23:8333 # AS45839
+109.196.124.182:8333 # AS196883
+109.201.168.32:8333 # AS41750
+109.224.84.149:8333 # AS197197
111.90.140.46:8333 # AS45839
-111.90.145.37:8333 # AS18106
-114.173.159.209:8333 # AS4713
+112.139.10.25:8333 # AS10010
+114.34.130.206:8333 # AS3462
116.58.171.67:8333 # AS2514
+116.86.195.192:8333 # AS4657
119.31.179.202:8333 # AS17408
119.42.55.203:8333 # AS133159
-122.222.160.190:8333 # AS2519
+120.226.39.100:8333 # AS9808
+120.226.39.103:8333 # AS9808
+121.6.69.73:8333 # AS9506
+121.99.240.87:8333 # AS9790
+122.148.147.136:8333 # AS4826
+122.199.40.21:8333 # AS38195
123.60.213.192:8333 # AS55990
+123.202.193.121:8333 # AS9269
+124.170.182.194:8333 # AS7545
124.197.54.113:8333 # AS9790
-125.168.140.108:8333 # AS4826
+125.168.110.28:8333 # AS4826
+125.227.178.68:8333 # AS3462
128.0.190.26:8333 # AS30764
-128.65.194.136:8333 # AS29222
-129.13.189.212:8333 # AS34878
129.13.189.215:8333 # AS34878
-129.226.216.148:8333 # AS132203
-131.188.40.191:8333 # AS680
-134.65.9.63:8333 # AS19653
-134.122.200.160:8333 # AS64050
-134.195.185.52:8333 # AS13536
+130.44.176.111:8333 # AS6079
+130.204.161.3:8333 # AS8717
+131.153.232.139:8333 # AS12189
+131.188.40.47:8333 # AS680
+134.65.193.149:8333 # AS19037
+135.19.41.208:8333 # AS5769
135.19.253.101:8333 # AS5769
-136.29.109.58:8333 # AS19165
-136.32.238.6:8333 # AS16591
-136.49.201.24:8333 # AS16591
+135.23.204.98:8333 # AS5645
+135.181.215.237:8333 # AS24940
+136.55.46.15:8333 # AS16591
+136.62.58.224:8333 # AS16591
+136.175.8.175:8333 # AS14315
+136.244.19.126:8333 # AS397412
137.226.34.46:8333 # AS680
-138.207.211.189:8333 # AS11776
-139.130.41.82:8333 # AS1221
+138.59.20.209:8333 # AS28201
+139.59.70.163:8333 # AS14061
140.238.220.99:8333 # AS31898
+141.193.68.11:8333 # AS396998
142.54.181.218:8333 # AS32097
-142.166.19.23:8333 # AS855
-142.254.87.115:8333 # AS46375
-143.177.229.149:8333 # AS50266
-144.2.101.21:8333 # AS3303
+142.115.140.2:8333 # AS577
+142.188.125.200:8333 # AS577
+143.110.252.124:8333 # AS14061
144.24.236.64:8333 # AS31898
-145.40.51.52:8333 # AS49808
+144.137.29.181:8333 # AS1221
146.71.69.103:8333 # AS7782
-146.120.241.173:8333 # AS208515
-147.50.238.53:8333 # AS45265
-148.103.101.132:8333 # AS28118
-149.75.48.92:8333 # AS6079
+149.28.159.141:8333 # AS20473
+149.143.32.26:8333 # AS15435
+149.202.79.199:8333 # AS16276
+149.248.1.254:8333 # AS20473
+151.248.221.197:8333 # AS8821
152.44.137.83:8333 # AS11404
-154.0.3.194:8333 # AS37680
+152.230.180.115:8333 # AS14259
154.26.137.105:8333 # AS174
-154.26.154.73:8333 # AS1299
-154.57.5.11:8333 # AS200736
-155.4.55.21:8333 # AS8473
-156.146.137.142:8333 # AS1448
-156.146.177.221:8333 # AS1448
-157.22.72.175:8333 # AS397379
-157.97.0.118:8333 # AS43571
-158.140.141.69:8333 # AS132132
-158.181.132.84:8333 # AS41750
-159.2.215.98:8333 # AS855
-159.196.3.239:8333 # AS4764
-159.224.189.250:8333 # AS13188
-160.80.12.16:8333 # AS137
-161.230.38.160:8333 # AS12353
-161.246.11.230:8333 # AS9486
-162.0.210.152:8333 # AS22612
-162.62.18.226:8333 # AS132203
-162.254.118.20:8333 # AS6130
-163.158.168.181:8333 # AS15435
-165.173.19.33:8333 # AS132132
-165.228.174.117:8333 # AS1221
+154.92.111.100:8333 # AS141356
+157.131.20.174:8333 # AS46375
+158.129.140.201:8333 # AS5479
+158.181.114.196:8333 # AS8821
+158.220.85.82:8333 # AS8556
+158.220.121.93:8333 # AS8556
+159.2.191.175:8333 # AS855
+159.224.238.145:8333 # AS13188
+161.97.167.10:8333 # AS51167
+162.213.119.12:8333 # AS2711
+162.226.61.8:8333 # AS7018
+162.254.171.209:8333 # AS17210
+163.114.159.205:8333 # AS15830
+163.172.84.134:8333 # AS12876
165.255.241.184:8333 # AS327693
-167.88.11.203:8333 # AS20278
167.179.147.155:8333 # AS4764
+169.150.206.206:8333 # AS60068
170.17.151.235:8333 # AS3303
-170.64.174.230:8333 # AS15108
+170.254.147.116:8333 # AS265398
172.92.102.115:8333 # AS11404
172.105.21.216:8333 # AS63949
-172.111.176.244:8333 # AS46562
-172.255.98.108:8333 # AS7979
-173.82.5.202:8333 # AS35916
+172.219.229.252:8333 # AS852
+172.251.101.27:8333 # AS20001
+173.12.119.133:8333 # AS7922
+173.19.176.228:8333 # AS30036
173.181.35.50:8333 # AS395570
-173.212.253.137:8333 # AS51167
-173.235.73.87:8333 # AS11272
-174.30.29.85:8333 # AS209
-174.141.209.40:8333 # AS6461
+173.212.98.0:8333 # AS11260
+173.241.227.243:8333 # AS19009
+173.246.31.114:8333 # AS1403
+174.20.57.30:8333 # AS209
+175.27.247.104:8333 # AS45090
+175.136.174.174:8333 # AS4788
176.9.17.121:8333 # AS24940
-176.12.16.135:8333 # AS8717
+176.37.82.83:8333 # AS39608
176.74.136.237:8333 # AS35613
-176.74.139.120:8333 # AS35613
-176.122.122.134:8333 # AS50581
-176.126.167.10:8333 # AS8449
-176.151.244.130:8333 # AS5410
-176.186.19.106:8333 # AS5410
-176.212.185.153:8333 # AS9049
-177.142.146.193:8333 # AS4230
+176.118.220.29:8333 # AS60042
+176.138.233.166:8333 # AS5410
+177.32.50.167:8333 # AS28573
178.21.118.178:8333 # AS49544
-178.61.141.198:8333 # AS21050
-178.124.162.209:8333 # AS6697
-178.143.25.194:8333 # AS15962
-178.154.233.197:8333 # AS200350
+178.41.11.254:8333 # AS6855
+178.79.83.147:8333 # AS3212
+178.88.189.254:8333 # AS9198
+178.154.222.104:8333 # AS200350
178.159.98.133:8333 # AS202390
-178.232.186.191:8333 # AS41164
-178.236.137.63:8333 # AS44843
-179.60.149.4:8333 # AS395839
-184.160.110.104:8333 # AS5769
-184.174.37.139:8333 # AS1239
-185.8.104.179:8333 # AS16125
-185.14.30.25:8333 # AS21100
+178.198.23.120:8333 # AS3303
+178.250.232.111:8333 # AS31197
+182.229.145.161:8333 # AS3786
+183.88.223.208:8333 # AS45758
+183.129.178.205:8333 # AS4134
185.25.48.184:8333 # AS61272
+185.26.99.171:8333 # AS44066
+185.31.136.246:8333 # AS47605
185.52.93.45:8333 # AS39449
-185.64.116.15:8333 # AS31736
-185.69.105.117:8333 # AS6855
-185.98.54.20:8333 # AS39572
+185.69.53.153:8333 # AS62282
+185.84.224.116:8333 # AS8816
185.107.83.55:8333 # AS43350
-185.132.109.122:8333 # AS38919
-185.135.81.50:8333 # AS57494
-185.140.253.169:8333 # AS200735
+185.116.94.239:8333 # AS39184
+185.140.209.159:8333 # AS44901
185.148.3.227:8333 # AS47605
-185.154.2.3:8333 # AS29119
-185.162.92.36:8333 # AS41722
-185.163.44.36:8333 # AS39798
+185.152.138.74:8333 # AS6697
+185.153.196.14:8333 # AS15836
+185.153.196.162:8333 # AS15836
+185.156.37.30:8333 # AS202605
+185.156.154.129:8333 # AS41897
+185.158.113.172:8333 # AS28917
185.165.170.19:8333 # AS3223
-185.167.113.59:8333 # AS207054
-185.185.59.12:8333 # AS48614
+185.190.24.72:8333 # AS9002
+185.199.209.52:8333 # AS49666
185.203.41.148:8333 # AS9009
185.209.12.76:8333 # AS212323
-185.209.70.17:8333 # AS204568
185.210.125.33:8333 # AS205671
185.233.189.210:8333 # AS61303
-185.238.131.19:8333 # AS206238
-185.239.220.210:8333 # AS61282
-185.239.221.5:8333 # AS61282
-185.250.90.246:8333 # AS61955
-186.249.217.25:8333 # AS7195
-186.250.95.132:8333 # AS262967
+185.250.36.66:8333 # AS1239
+185.254.97.164:8333 # AS44486
+186.235.86.249:8333 # AS263097
+188.27.79.235:8333 # AS8708
188.35.167.14:8333 # AS34123
188.68.53.44:8333 # AS47147
-188.120.255.115:8333 # AS29182
-189.6.195.111:8333 # AS28573
-190.2.130.44:8333 # AS49981
-190.13.122.89:8333 # AS33576
-190.123.27.11:8333 # AS52468
-190.145.127.254:8333 # AS14080
-191.220.156.64:8333 # AS8167
-192.31.136.90:8333 # AS54098
-192.69.53.43:8333 # AS11142
+188.119.67.137:8333 # AS9002
+188.127.243.41:8333 # AS56694
+188.138.112.60:8333 # AS20773
+188.142.199.17:8333 # AS21334
+188.155.72.160:8333 # AS6730
+188.214.129.52:8333 # AS16125
+188.214.129.139:8333 # AS16125
+188.215.62.122:8333 # AS203600
+188.237.167.51:8333 # AS8926
+188.246.224.12:8333 # AS49505
+189.6.221.37:8333 # AS28573
+190.2.146.90:8333 # AS49981
+190.17.18.190:8333 # AS7303
+190.210.98.253:8333 # AS16814
+192.3.11.24:8333 # AS36352
+192.69.53.18:8333 # AS11142
192.146.137.44:8333 # AS25376
-192.174.121.33:8333 # AS11492
-192.222.147.175:8333 # AS1403
-193.198.34.24:8333 # AS2108
-193.222.130.14:8333 # AS29208
-194.35.185.167:8333 # AS9063
-194.54.83.234:8333 # AS41018
-194.233.84.100:8333 # AS141995
-195.2.73.88:8333 # AS48282
-195.48.12.8:8333 # AS1836
-195.154.200.157:8333 # AS12876
-197.211.133.15:8333 # AS51265
-198.84.146.8:8333 # AS5645
-198.98.55.86:8333 # AS53667
-199.247.7.208:8333 # AS20473
-200.116.154.131:8333 # AS13489
-201.191.6.103:8333 # AS11830
-201.221.234.200:8333 # AS27928
-202.47.225.242:8333 # AS9931
-202.107.219.130:8333 # AS4134
-202.108.211.135:8333 # AS4837
-202.138.13.122:8333 # AS4826
-203.86.195.32:8333 # AS23655
-203.184.52.247:8333 # AS9790
-204.111.163.114:8333 # AS4922
-205.178.41.124:8333 # AS11039
+193.22.128.12:8333 # AS39647
+193.39.142.89:8333 # AS60781
+193.46.74.252:8333 # AS395003
+193.46.74.254:8333 # AS395003
+193.95.249.3:8333 # AS5603
+193.149.176.200:8333 # AS40676
+193.151.155.122:8333 # AS49666
+193.187.90.122:8333 # AS3399
+193.196.37.62:8333 # AS34878
+194.35.184.95:8333 # AS9063
+194.165.30.20:8333 # AS35162
+194.191.232.153:8333 # AS1836
+195.32.108.164:8333 # AS3269
+195.56.63.11:8333 # AS5483
+195.56.63.12:8333 # AS5483
+195.123.217.63:8333 # AS21100
+195.128.248.153:8333 # AS25229
+195.140.226.154:8333 # AS35614
+195.160.222.81:8333 # AS31148
+195.206.105.7:8333 # AS9009
+199.36.253.252:8333 # AS16713
+199.58.100.115:8333 # AS25961
+202.90.242.93:8333 # AS4764
+202.112.238.128:8333 # AS4538
+202.186.38.99:8333 # AS9930
+203.12.0.167:8333 # AS134697
+203.12.10.224:8333 # AS134697
+203.210.193.21:8333 # AS45899
+204.228.142.211:8333 # AS6315
+205.178.182.133:8333 # AS396998
+206.55.178.157:8333 # AS10242
206.192.203.0:8333 # AS7029
-207.229.46.80:8333 # AS852
-207.244.248.81:8333 # AS40021
+207.98.253.88:8333 # AS12083
+207.115.84.47:8333 # AS18530
207.255.193.47:8333 # AS11776
-208.59.133.63:8333 # AS11039
-209.58.145.157:8333 # AS394380
-209.97.189.249:8333 # AS14061
-209.177.138.245:8333 # AS7832
+208.104.92.74:8333 # AS14615
+209.38.244.87:8333 # AS2914
+209.204.29.18:8333 # AS395439
+209.205.204.218:8333 # AS55081
209.237.133.54:8333 # AS53859
-210.54.37.190:8333 # AS4648
-210.54.39.238:8333 # AS4648
-212.34.225.118:8333 # AS44395
-212.41.9.30:8333 # AS49505
-212.51.132.176:8333 # AS13030
-212.69.60.77:8333 # AS12496
+210.6.95.127:8333 # AS9269
+210.205.146.114:8333 # AS9318
+211.221.42.143:8333 # AS4766
+212.5.157.40:8333 # AS8866
+212.51.136.50:8333 # AS13030
212.86.32.106:8333 # AS15366
-213.47.64.105:8333 # AS8412
+212.162.152.149:8333 # AS24875
+212.227.150.147:8333 # AS8560
+212.227.155.170:8333 # AS8560
+212.251.162.190:8333 # AS2119
+213.109.236.129:8333 # AS47702
213.141.154.201:8333 # AS12714
-213.142.148.169:8333 # AS6762
-213.184.244.24:8333 # AS60280
-213.227.147.244:8333 # AS60781
-213.250.21.112:8333 # AS5603
-216.146.251.8:8333 # AS54579
-216.232.157.104:8333 # AS395570
-217.15.178.11:8333 # AS25534
-217.26.32.10:8333 # AS197312
+213.193.83.251:8333 # AS6830
+213.193.83.252:8333 # AS6830
+213.202.225.122:8333 # AS24961
+216.83.150.142:8333 # AS5048
+216.186.236.98:8333 # AS12083
+216.232.33.24:8333 # AS395570
+217.64.47.138:8333 # AS39324
217.64.47.200:8333 # AS39324
-217.76.51.25:8333 # AS39597
+217.76.61.78:8333 # AS39597
217.92.55.246:8333 # AS3320
+217.113.121.169:8333 # AS8416
+217.155.244.170:8333 # AS13037
217.170.124.170:8333 # AS35401
+217.173.236.25:8333 # AS8447
+217.180.192.116:8333 # AS30600
217.180.221.162:8333 # AS30600
-217.180.238.137:8333 # AS30600
-220.84.232.46:8333 # AS4766
-220.133.39.61:8333 # AS3462
-220.233.91.182:8333 # AS38195
-[2001:19f0:1000:1db3:5400:4ff:fe56:5a8d]:8333 # AS20473
-[2001:19f0:5:24da:3eec:efff:feb9:f36e]:8333 # AS20473
-[2001:19f0:5:24da::]:8333 # AS20473
-[2001:19f0:5:4535:3eec:efff:feb9:87e4]:8333 # AS20473
-[2001:19f0:5:4535::]:8333 # AS20473
+218.43.123.236:8333 # AS4713
+219.77.79.128:8333 # AS4760
+223.18.222.210:8333 # AS9304
+223.167.75.165:8333 # AS4837
+[2001:1620:5566:100::62c]:8333 # AS13030
+[2001:1620:a21:0:da5e:d3ff:fee3:68a0]:8333 # AS13030
+[2001:19f0:4401:e8a:5400:4ff:fe8e:d398]:8333 # AS20473
[2001:1bc0:c1::2000]:8333 # AS29686
-[2001:1c04:4008:6300:8a5f:2678:114b:a660]:8333 # AS6830
-[2001:41d0:203:3739::]:8333 # AS16276
-[2001:41d0:203:8f49::]:8333 # AS16276
-[2001:41d0:203:bb0a::]:8333 # AS16276
-[2001:41d0:2:bf8f::]:8333 # AS16276
-[2001:41d0:303:de8b::]:8333 # AS16276
+[2001:4060:4419:8001::42]:8333 # AS6772
+[2001:41d0:203:8f46::]:8333 # AS16276
+[2001:41d0:30e:8e00::]:8333 # AS16276
[2001:41d0:403:3d61::]:8333 # AS16276
-[2001:41d0:405:9600::]:8333 # AS16276
+[2001:41d0:405:6e00::]:8333 # AS16276
+[2001:41d0:8:83cf:195b:b202:9271:cc5b]:8333 # AS16276
[2001:41d0:8:ed7f::1]:8333 # AS16276
[2001:41d0:a:69a2::1]:8333 # AS16276
-[2001:41f0::62:6974:636f:696e]:8333 # AS6830
+[2001:41d0:a:6b4d::1]:8333 # AS16276
+[2001:470:1b55::]:8333 # AS6939
[2001:470:1b62::]:8333 # AS6939
-[2001:470:1f05:43b:2831:8530:7179:5864]:8333 # AS6939
[2001:470:1f09:b14::11]:8333 # AS6939
-[2001:470:1f15:106:e2d5:5eff:fe42:7ae5]:8333 # AS6939
-[2001:470:1f1b:365:aa20:66ff:fe3f:1909]:8333 # AS6939
+[2001:470:1f0a:89a::2]:8333 # AS6939
[2001:470:1f1b:5a6:216:3eff:fe24:1162]:8333 # AS6939
-[2001:470:6a7c::]:8333 # AS6939
[2001:470:75e9:1::10]:8333 # AS6939
-[2001:470:8ca0:2:4e72:b9ff:fe56:f8b8]:8333 # AS6939
-[2001:470:dbc7:0:1010::100]:8333 # AS6939
-[2001:4ba0:cafe:14cc::1]:8333 # AS24961
-[2001:4ba0:ffff:24::1]:8333 # AS24961
+[2001:470:88ff:2e::1]:8333 # AS6939
+[2001:470:8ca0:2:7646:a0ff:fe9b:e662]:8333 # AS6939
+[2001:470:a:c13::2]:8333 # AS6939
+[2001:470:c:1077::2]:8333 # AS6939
[2001:4dd0:3564:0:30b7:1d7b:6fec:4c5c]:8333 # AS8422
[2001:4dd0:3564:0:88e:b4ff:2ad0:699b]:8333 # AS8422
[2001:4dd0:3564:0:9c1c:cc31:9fe8:5505]:8333 # AS8422
[2001:4dd0:3564:0:a0c4:d41f:4c4:1bb0]:8333 # AS8422
+[2001:4dd0:3564:0:fd76:c1d3:1854:5bd9]:8333 # AS8422
[2001:4dd0:3564:1::7676:8090]:8333 # AS8422
[2001:4dd0:3564:1:b977:bd71:4612:8e40]:8333 # AS8422
[2001:4dd0:af0e:3564::69:1]:8333 # AS8422
[2001:4dd0:af0e:3564::69:90]:8333 # AS8422
[2001:560:441f:1::4]:8333 # AS18530
-[2001:638:a000:4140::ffff:191]:8333 # AS680
-[2001:67c:25dc:91::2]:8333 # AS41018
+[2001:5a8:40c7:f500:7a0d:d50:255e:dbac]:8333 # AS46375
+[2001:638:a000:4140::ffff:47]:8333 # AS680
[2001:67c:26b4:ff00::44]:8333 # AS25376
-[2001:67c:2db8:6::36]:8333 # AS39798
+[2001:67c:440:688:91:236:251:137]:8333 # AS57944
+[2001:67c:440:688:91:236:251:139]:8333 # AS57944
[2001:7c0:2310:0:f816:3eff:fe6c:4f58]:8333 # AS34878
-[2001:861:3242:8420::40]:8333 # AS5410
-[2001:8b0:1301:1000::60]:8333 # AS20712
-[2001:b030:2422::208d]:8333 # AS3462
-[2001:b07:2ef:6e4a:3d:974e:784a:684b]:8333 # AS12874
-[2001:b07:5d32:b142:8f77:3c7d:a2fd:ed2e]:8333 # AS12874
+[2001:861:c62:2fd0:ca7f:54ff:fece:6d9]:8333 # AS5410
+[2001:871:23d:d5d1:5a47:caff:fe71:c8d]:8333 # AS8447
+[2001:910:109d:2c03:d217:c2ff:fe07:2cd9]:8333 # AS20766
[2001:b07:6461:7811:489:d2da:e07:1af7]:8333 # AS12874
[2001:b07:646b:8074:32e8:9243:a337:e60a]:8333 # AS12874
-[2001:b07:646b:8074:4cc6:79a5:3af7:7132]:8333 # AS12874
-[2001:b07:ad4:ca4b:7dd5:8471:50c3:5363]:8333 # AS12874
+[2001:bc8:1201:715:ca1f:66ff:fec9:5ff0]:8333 # AS12876
[2001:bc8:1201:71a:2e59:e5ff:fe42:52f4]:8333 # AS12876
[2001:bc8:1600:0:208:a2ff:fe0c:8a2e]:8333 # AS12876
-[2001:bc8:323c:ff:a634:384f:1849:f4bc]:8333 # AS12876
-[2001:bc8:323c:ff:d217:c2ff:fe07:2cd9]:8333 # AS12876
-[2001:bc8:700:2b14::1]:8333 # AS12876
-[2001:bc8:700:8d16::1]:8333 # AS12876
-[2001:e68:5400:58d0:bd15:ea8c:5b20:7523]:8333 # AS4788
-[2400:2411:a3e1:4900:7298:f550:67e7:b99b]:8333 # AS17676
-[2400:8901::f03c:93ff:fe2b:5c0b]:8333 # AS63949
-[2400:8901::f03c:93ff:fe5a:685c]:8333 # AS63949
+[2003:dc:2f4a:eb00:4ecc:6aff:fe25:c9a3]:8333 # AS3320
+[2003:f6:3f31:600:4c9f:7620:8324:d4a7]:8333 # AS3320
+[2400:6180:100:d0::848:5001]:8333 # AS14061
+[2400:6180:100:d0::940:4001]:8333 # AS14061
+[2400:6180:100:d0::953:8001]:8333 # AS14061
+[2400:6180:100:d0::a02:2001]:8333 # AS14061
+[2400:6180:100:d0::a0f:9001]:8333 # AS14061
+[2400:6180:100:d0::a3d:b001]:8333 # AS14061
+[2400:6180:100:d0::a3f:1001]:8333 # AS14061
+[2400:6180:100:d0::a49:a001]:8333 # AS14061
+[2400:6180:100:d0::a56:d001]:8333 # AS14061
+[2400:6180:100:d0::a56:e001]:8333 # AS14061
[2401:b140:1::100:210]:8333 # AS54415
[2401:b140:1::100:220]:8333 # AS54415
-[2401:d002:3902:700:d72c:5e22:4e95:389d]:8333 # AS38195
-[2404:4408:63a4:a01::250]:8333 # AS9790
+[2402:e280:3d17:945:1889:d3c6:8e85:d3c4]:8333 # AS134674
+[2403:6200:8821:2fdf:3903:a2b1:9f:c897]:8333 # AS20473
[2406:3400:216:8b00:211:32ff:feca:336b]:8333 # AS10143
-[2406:8c00:0:3422:133:18:228:108]:8333 # AS24282
-[2406:da11:169:b03:32b5:f901:9f7c:3e4b]:8333 # AS16509
-[2406:da18:9f1:f301:7d2e:c256:c112:f2be]:8333 # AS16509
-[2406:da18:9f1:f303:c1c9:c569:b799:2057]:8333 # AS16509
-[2406:da1e:a4e:8a00:20db:dd8d:3670:28f0]:8333 # AS16509
-[2406:da1e:a4e:8a03:2aad:496b:768d:e497]:8333 # AS16509
+[2406:da14:335:b600:eb14:5fd:2072:3653]:8333 # AS16509
+[2406:da1c:50b:cd00:3cae:1728:ecfc:4334]:8333 # AS16509
+[2406:da1c:50b:cd03:36d6:13fa:eba8:6543]:8333 # AS16509
+[2406:da1e:a4e:8a03:d90a:fbb0:23d3:ccb4]:8333 # AS16509
[2407:3640:2107:1278::1]:8333 # AS141995
-[2407:3640:3010:4012::1]:8333 # AS141995
-[2407:8800:bc61:2202:d63d:7eff:fe6c:dc36]:8333 # AS7545
-[2600:1700:5c5b:b0:aaa1:59ff:fe5f:615a]:8333 # AS7018
-[2600:1700:ec7b:5730::48]:8333 # AS7018
-[2600:1900:4000:4cc4:0:1::]:8333 # AS15169
-[2600:1900:4000:4cc4:0:2::]:8333 # AS15169
-[2600:1900:4000:4cc4:0:3::]:8333 # AS15169
-[2600:1900:4000:4cc4::]:8333 # AS15169
-[2600:1900:4030:a25e::]:8333 # AS15169
-[2600:1f14:40e:e301:afdd:ad00:e568:d220]:8333 # AS16509
-[2600:1f1c:2d3:2400:f15e:2f2a:760d:a33d]:8333 # AS16509
+[2407:7000:9f71:2d00:1c5a:5292:5108:c734]:8333 # AS9500
+[2408:8207:2655:fae0::10b]:8333 # AS4837
+[2408:8207:5456:d8d0::5c6]:8333 # AS4837
+[2409:250:60a0:2600:a971:1cdd:3d5b:654d]:8333 # AS55392
+[240d:1a:4b1:e700:19:d9ef:7f3:8e75]:8333 # AS2527
+[2600:1700:3948:82f:ce04:d382:5226:4cac]:8333 # AS7018
+[2600:1f16:a08:b900:4bfe:2f81:ae31:5f5]:8333 # AS16509
+[2600:1f1c:2d3:2401:6989:b1fd:d2a6:fbc8]:8333 # AS16509
+[2600:1f1e:2fe:3601:63a8:ebf6:83e4:1932]:8333 # AS16509
[2600:2104:1003:c5ab:dc5e:90ff:fe18:1d08]:8333 # AS11404
-[2600:3c00::f03c:92ff:fe92:2745]:8333 # AS63949
-[2600:3c00::f03c:92ff:fecf:61b6]:8333 # AS63949
-[2600:3c00:e002:2e32::1:14]:8333 # AS63949
-[2600:3c01::f03c:93ff:fe2a:5266]:8333 # AS63949
-[2600:3c01::f03c:93ff:fe74:5f59]:8333 # AS63949
-[2600:3c01::f03c:93ff:fee6:2146]:8333 # AS63949
-[2600:3c02::f03c:92ff:fe5d:9fb]:8333 # AS63949
-[2600:4040:2004:3201:459f:8fe8:444d:baf1]:8333 # AS13786
-[2600:4040:4541:4900:4e1:b58a:8438:450e]:8333 # AS13786
+[2600:3c00::f03c:91ff:fe4b:c52]:8333 # AS63949
+[2600:3c00:e002:2e32::1:c8]:8333 # AS63949
+[2600:3c02::f03c:94ff:fecc:c99c]:8333 # AS63949
+[2600:6c4e:a00:cd0:428d:5cff:fe58:4884]:8333 # AS20115
[2600:6c54:7100:1ad1:c92e:36d:651:bd18]:8333 # AS20115
-[2600:8801:2f80:477::141c]:8333 # AS22773
-[2600:8801:8d00:3eb0:20c:29ff:fec3:d799]:8333 # AS22773
-[2600:8805:2400:14e:12dd:b1ff:fef2:3013]:8333 # AS22773
[2601:184:300:156c:ba4c:30:9da:6c06]:8333 # AS7922
-[2601:346:d7f:fff7:18c6:4856:ef75:744c]:8333 # AS7922
-[2601:405:4a00:876:c8d3:f081:2ce8:ba8e]:8333 # AS7922
-[2602:24c:b8f:cd90::7840]:8333 # AS46375
-[2602:fec3:0:1::69]:8333 # AS62563
-[2602:ff16:1:0:1:412:0:1]:8333 # AS29802
-[2603:3001:2618:c000:2ec1:df1f:a463:9119]:8333 # AS7922
+[2601:185:8302:12f0:1ab2:2840:9de4:1550]:8333 # AS7922
[2603:3003:11b:e100:20c:29ff:fe38:bbc0]:8333 # AS7922
[2603:3004:6a1:3800:851f:584d:7aba:affb]:8333 # AS7922
-[2603:3004:6a1:3800::7bba]:8333 # AS7922
-[2603:3004:6a1:3800::f667]:8333 # AS7922
-[2603:3024:1606:1400::29ec]:8333 # AS7922
[2603:3024:18ee:8000:20e:c4ff:fed1:ef15]:8333 # AS7922
-[2603:6000:a400:9300::2000]:8333 # AS7843
-[2603:6010:7001:4830::2:1]:8333 # AS7843
[2603:8080:1f07:6fdd:7de2:d969:78c9:b7ea]:8333 # AS7843
-[2603:8080:d600:1800:7ce1:74a2:6a8a:4643]:8333 # AS7843
-[2603:8081:6c00:306e:215:5dff:fe02:150a]:8333 # AS7843
-[2604:3d09:7182:8700:bba9:cde6:5b37:a8df]:8333 # AS6327
-[2604:4080:1036:80b1::3be]:8333 # AS11404
-[2604:a00:3:1223:216:3eff:fe27:76e0]:8333 # AS19318
-[2604:a880:400:d0::261f:6001]:8333 # AS14061
-[2604:a880:4:1d0::13e:f000]:8333 # AS14061
-[2604:a880:4:1d0::17a:7000]:8333 # AS14061
-[2604:a880:4:1d0::c1:3000]:8333 # AS14061
-[2604:a880:4:1d0::e5:b000]:8333 # AS14061
-[2605:4a80:a302:7940:7254:1ed4:90d7:4f39]:8333 # AS11232
-[2605:4a80:a302:7940::2]:8333 # AS11232
+[2604:4080:1036:80b1:50e1:43ff:fe0e:9df5]:8333 # AS11404
[2605:6400:30:f220::]:8333 # AS53667
-[2605:a140:3010:4014::1]:8333 # AS40021
-[2605:ae00:203::203]:8333 # AS7819
-[2605:b40:14d0:5b00:7988:eb8:6bb6:66e2]:8333 # AS174
+[2605:6400:30:fd6f::4]:8333 # AS53667
[2605:c000:2a0a:1::102]:8333 # AS7393
+[2606:6d00:100:5102:3d2:f06a:c2e8:a54]:8333 # AS1403
+[2607:5300:60:2e54::1]:8333 # AS16276
[2607:5300:61:854::1]:8333 # AS16276
[2607:9280:b:73b:250:56ff:fe14:25b5]:8333 # AS395502
[2607:9280:b:73b:250:56ff:fe21:9c2f]:8333 # AS395502
[2607:9280:b:73b:250:56ff:fe21:bf32]:8333 # AS395502
[2607:9280:b:73b:250:56ff:fe33:4d1b]:8333 # AS395502
[2607:9280:b:73b:250:56ff:fe3d:401]:8333 # AS395502
-[2620:6e:a000:1:42:42:42:42]:8333 # AS397444
-[2620:a6:2000:1:1:0:5:1601]:8333 # AS27566
-[2620:a6:2000:1:2:0:9:900b]:8333 # AS27566
-[2620:a6:2000:1:2:0:b:300e]:8333 # AS27566
-[2800:150:11d:d2f:bdac:7807:2f5:4aa0]:8333 # AS22047
-[2803:9800:a007:82ba:650b:82b8:8377:d0]:8333 # AS19037
-[2804:14c:155:45e0:1e86:15a3:efd9:7287]:8333 # AS28573
-[2804:14c:657d:4030:28b4:eff:fe9b:8894]:8333 # AS28573
-[2804:14d:1087:9434::1002]:8333 # AS4230
-[2804:954:24:2:b390:d83b:358a:db53]:8333 # AS263073
-[2804:d57:554d:de00:3e7c:3fff:fe7b:80aa]:8333 # AS8167
-[2a00:1028:838c:563a:fd25:87b6:5a54:811]:8333 # AS5610
+[2620:a6:2000:1:1:0:d:3015]:8333 # AS27566
+[2620:a6:2000:1:2:0:3:266c]:8333 # AS27566
+[2620:a6:2000:1:2:0:9:930b]:8333 # AS27566
+[2620:a6:2000:1:2:0:b:3011]:8333 # AS27566
+[2800:150:11d:2426:62b:b164:704a:6962]:8333 # AS22047
+[2800:300:8251:b50::d]:8333 # AS27651
+[2800:300:8251:b50:e92:64f5:22af:c31e]:8333 # AS27651
+[2800:40:15:6ad:48e8:2200:a882:e08e]:8333 # AS16814
+[2803:5180:4100:4000::2]:8333 # AS52468
+[2803:9800:9447:84bb:cab8:d2f5:388c:9a57]:8333 # AS19037
+[2804:14d:7e33:83b0:6e41:1ccc:cf20:aff9]:8333 # AS4230
+[2804:431:e038:cd01:aaa1:59ff:fe0d:44b8]:8333 # AS27699
+[2804:d57:450d:f00:a422:9828:b00e:91e9]:8333 # AS8167
+[2806:2f0:5020:d287:4dcd:6204:909b:4125]:8333 # AS17072
[2a00:1298:8001::6542]:8333 # AS5578
-[2a00:1398:4:2a03:215:5dff:fed6:1033]:8333 # AS34878
+[2a00:12e0:101:99:20c:29ff:fe29:d03f]:8333 # AS6798
+[2a00:1398:4:2a03:3eec:efff:fe05:d93e]:8333 # AS34878
[2a00:1398:4:2a03::bc03]:8333 # AS34878
[2a00:1768:2001:27::ef6a]:8333 # AS43350
[2a00:1f40:5001:108:5d17:7703:b0f5:4133]:8333 # AS42864
[2a00:23c5:fe80:7301:d6ae:52ff:fed5:56a5]:8333 # AS2856
-[2a00:6020:13dc:bc00:5559:258:27d:b52b]:8333 # AS60294
-[2a00:6020:4503:3700:20c:29ff:fe61:4a4c]:8333 # AS60294
-[2a00:6020:b434:eb00:dea6:32ff:fe0d:a5c0]:8333 # AS60294
+[2a00:23c6:5c8a:5c00:c05a:4dff:fe65:9d69]:8333 # AS2856
+[2a00:6020:4503:3700:5054:ff:fe90:640e]:8333 # AS60294
[2a00:6020:b489:2000:5054:ff:fefc:5ed8]:8333 # AS60294
-[2a00:7c80:0:10c::2]:8333 # AS49981
-[2a00:7c80:0:25::e37a]:8333 # AS49981
[2a00:8a60:e012:a00::21]:8333 # AS680
-[2a00:bbe0:cc:0:5a11:22ff:feb4:8f5c]:8333 # AS47605
-[2a00:bbe0:cc:0:62a4:4cff:fe23:7510]:8333 # AS47605
-[2a00:ca8:a15:9a5b:8b42:a886:7d48:7a21]:8333 # AS30764
-[2a00:ca8:a1f:f9b7:cb55:5766:524b:acaa]:8333 # AS30764
-[2a00:d4e0:ff:fc02:5e55:4a7c:b83b:e5a1]:8333 # AS15600
+[2a00:bbe0:0:221f::246]:8333 # AS47605
[2a00:d520:9:9300:420b:544e:8019:6d3a]:8333 # AS15600
-[2a00:d880:5:c2::d329]:8333 # AS198203
-[2a00:ee2:1200:1900:8d3:d2ff:feb1:bc58]:8333 # AS5603
-[2a01:4f8:173:230a::2]:8333 # AS24940
+[2a00:fd40:c:c::c]:8333 # AS3269
+[2a01:4f8:171:1f16::2]:8333 # AS24940
[2a01:4f8:200:7222::2]:8333 # AS24940
-[2a01:4f8:202:3e6::2]:8333 # AS24940
-[2a01:4f8:221:44d7::2]:8333 # AS24940
-[2a01:4f8:231:915::2]:8333 # AS24940
-[2a01:4f8:261:2bcd::2]:8333 # AS24940
-[2a01:4f8:261:3cae::2]:8333 # AS24940
+[2a01:4f8:202:4205::2]:8333 # AS24940
+[2a01:4f8:242:2016::2]:8333 # AS24940
[2a01:4f8:261:420c::2]:8333 # AS24940
+[2a01:4f8:272:4cd9::2]:8333 # AS24940
+[2a01:4f9:1a:a966::2]:8333 # AS24940
+[2a01:4f9:1a:af0d::2]:8333 # AS24940
[2a01:4f9:2b:29a::2]:8333 # AS24940
-[2a01:4f9:3a:2dd2::2]:8333 # AS24940
+[2a01:4f9:5a:44a5::2]:8333 # AS24940
[2a01:7a7:2:2804:ae1f:6bff:fe9d:6c94]:8333 # AS20773
-[2a01:7c8:aac2:180:5054:ff:fe56:8d10]:8333 # AS20857
-[2a01:7c8:aac9:c9:5054:ff:fedf:ff95]:8333 # AS20857
-[2a01:7e01::f03c:93ff:fe49:2f5b]:8333 # AS63949
[2a01:8740:1:753::e5cb]:8333 # AS57344
+[2a01:8740:1:ff2e::9428]:8333 # AS57344
[2a01:8740:1:ffc5::8c6a]:8333 # AS57344
-[2a01:cb00:b63:c000:227:eff:fe28:c565]:8333 # AS3215
-[2a01:cb19:688:e900:aa60:b6ff:fe29:bbae]:8333 # AS3215
-[2a01:e0a:163:c0b0:9da5:1690:a12b:bede]:8333 # AS12322
-[2a01:e0a:282:67b0:b4f4:aaff:fe7c:44a6]:8333 # AS12322
+[2a01:cb00:790:f500:110b:b446:2260:7d2c]:8333 # AS3215
+[2a01:cb10:336:cb00:61ac:d15d:4ac0:2cbd]:8333 # AS3215
+[2a01:cb10:336:cb00:d237:45ff:fec5:2cd0]:8333 # AS3215
+[2a01:cb15:804c:8000:21e:6ff:fe51:2c32]:8333 # AS3215
+[2a01:e0a:185:55f0:a0ba:9eaf:9853:92b7]:8333 # AS12322
[2a01:e0a:301:7010:b87d:e14b:cea9:b998]:8333 # AS12322
-[2a01:e0a:320:39a0:325a:3aff:fe02:3180]:8333 # AS12322
-[2a01:e0a:351:9fb0:6bf2:95d6:b7bd:b846]:8333 # AS12322
-[2a01:e0a:5fa:a0a0:ca1f:66ff:fece:b8a2]:8333 # AS12322
-[2a01:e0a:83d:dd30:3676:5d8e:8a6f:115a]:8333 # AS12322
-[2a01:e0a:9e9:c240:7b44:f32a:6ec0:a8af]:8333 # AS12322
+[2a01:e0a:3b3:1420:7ca0:3a9a:5cc3:b644]:8333 # AS12322
+[2a01:e0a:5:9390:bf35:4d41:8a2a:570]:8333 # AS12322
+[2a01:e0a:9e9:c240:8e3a:af64:4f0:8f79]:8333 # AS12322
+[2a01:e0a:b0f:37e0:a13f:e65:ac42:8e36]:8333 # AS12322
[2a01:e0a:b5:7f50:c257:a55b:4846:97e1]:8333 # AS12322
-[2a01:e11:100c:70:cbc8:9e31:4b77:1626]:8333 # AS12322
-[2a02:1210:2cdf:4600:2bc:e03e:43e8:4718]:8333 # AS3303
+[2a01:e0a:bf6:8d70:20c:29ff:fe30:4fd2]:8333 # AS12322
+[2a01:e11:100c:70:39f3:e3c9:832f:37a]:8333 # AS12322
+[2a01:e34:ec1d:7100:8aae:ddff:fe02:4159]:8333 # AS12322
+[2a02:1210:7c92:5100:211:32ff:feae:152d]:8333 # AS3303
[2a02:1210:86bf:f100:a9ac:d041:1f8e:6925]:8333 # AS3303
-[2a02:1210:94c3:3400:d8c3:743c:90f6:a48a]:8333 # AS3303
-[2a02:168:2000:96::12]:8333 # AS13030
-[2a02:168:420b:a::20]:8333 # AS13030
-[2a02:168:676e:0:e65f:1ff:fe09:3591]:8333 # AS13030
-[2a02:1748:f39f:5872:216:3eff:fe21:266]:8333 # AS51184
-[2a02:180:1:1::517:10b6]:8333 # AS35366
-[2a02:2780:9000:70::7]:8333 # AS35434
-[2a02:2780:9000:70::f]:8333 # AS35434
-[2a02:2780::e01a]:8333 # AS35434
-[2a02:2f05:6008:ce00::1]:8333 # AS48571
+[2a02:22a0:bbb3:dc10:50e1:57ff:fe70:9492]:8333 # AS1136
+[2a02:247a:215:3e00:1::1]:8333 # AS8560
+[2a02:2c60:f103:7c0:1a31:bfff:fecc:5d91]:8333 # AS9063
+[2a02:3102:4d5c:f000:dea6:32ff:febb:b9cb]:8333 # AS6805
+[2a02:3102:bc00:10e9:ca5:9dff:fea9:1cbb]:8333 # AS6805
[2a02:390:9000:0:aaa1:59ff:fe43:b57b]:8333 # AS12496
-[2a02:578:85ce:1600:1e1b:dff:fee3:774b]:8333 # AS9031
[2a02:768:f92b:db46:5e46:772b:71d:29b7]:8333 # AS44489
-[2a02:7a01::91:228:45:130]:8333 # AS16019
-[2a02:7b40:50d0:e386::1]:8333 # AS62282
-[2a02:7b40:50d1:e35b::1]:8333 # AS62282
-[2a02:7b40:5928:89::1]:8333 # AS62282
-[2a02:7b40:b945:344d::1]:8333 # AS62282
-[2a02:7b40:d418:6d9a::1]:8333 # AS62282
-[2a02:8070:b84:6ae0:f9c6:fbb9:1c41:81aa]:8333 # AS51185
-[2a02:8070:f186:38e0::d5a6]:8333 # AS51185
-[2a02:8084:103:6810:1e69:7aff:fea2:1acc]:8333 # AS6830
-[2a02:8308:8081:f300:3b8:7ec0:2837:1b57]:8333 # AS16019
+[2a02:8070:f181:f600:bcb:2d1:d790:78ff]:8333 # AS51185
+[2a02:8071:6380:c500:7285:c2ff:feb5:a39c]:8333 # AS3209
+[2a02:8084:2021:73f3::66e6]:8333 # AS6830
+[2a02:8308:8188:5100:6d8b:4531:4331:eee2]:8333 # AS16019
[2a02:8388:e302:7980:6f85:a0b3:4b4d:8b0f]:8333 # AS8412
[2a02:8388:e5c3:4a80:201:2eff:fe82:b3cc]:8333 # AS8412
-[2a02:842a:1df:8a01:1e1b:dff:fe0b:236d]:8333 # AS15557
-[2a02:a210:28be:5f80::111]:8333 # AS6830
-[2a02:a44b:5cf9:1:b62e:99ff:fe49:d492]:8333 # AS1136
-[2a02:a44d:14d6:1:2c0:8ff:fe8f:b3b2]:8333 # AS1136
+[2a02:a31a:e03d:9400:3f18:2729:c86:d754]:8333 # AS6830
[2a02:a45a:94cd:f00d::1]:8333 # AS1136
-[2a02:a45f:3b9d:31::199]:8333 # AS1136
-[2a02:a464:3d6b::1:2]:8333 # AS1136
-[2a02:a46c:7f8e:1:35bf:3aeb:137c:1d35]:8333 # AS1136
-[2a02:a46d:36f:1:20d:b9ff:fe4e:6398]:8333 # AS1136
-[2a02:c205:2021:4216::1]:8333 # AS51167
-[2a02:c206:2044:9826::1]:8333 # AS51167
-[2a02:c206:2075:3351::1]:8333 # AS51167
-[2a02:c207:0:3829::1]:8333 # AS51167
-[2a02:c207:2014:4199::1]:8333 # AS51167
-[2a02:c207:2014:8757::1]:8333 # AS51167
-[2a02:c207:2026:6682::1]:8333 # AS51167
+[2a02:a465:80f4:1:f369:4ef5:aa12:7566]:8333 # AS1136
+[2a02:ab88:20b:ce00:223:24ff:fe56:6202]:8333 # AS21334
+[2a02:c206:2016:2394::1]:8333 # AS51167
+[2a02:c206:2162:5603::1]:8333 # AS51167
+[2a02:c206:2162:5605::1]:8333 # AS51167
+[2a02:c206:2162:5606::1]:8333 # AS51167
+[2a02:c206:2162:5856::1]:8333 # AS51167
+[2a02:c206:2162:7348::1]:8333 # AS51167
+[2a02:c206:2162:7352::1]:8333 # AS51167
+[2a02:c206:2162:8026::1]:8333 # AS51167
[2a02:c207:2034:7358::1]:8333 # AS51167
-[2a02:c207:3002:7468::1]:8333 # AS51167
-[2a02:c207:3008:4592::1]:8333 # AS51167
-[2a02:cb43:4000::178]:8333 # AS33891
-[2a02:e5e:1:10::27]:8333 # AS25057
-[2a02:e98:20:1504::1]:8333 # AS24641
-[2a03:4000:28:68:7411:53ff:fe4c:21d]:8333 # AS47147
-[2a03:4000:65:fdc:3462:66ff:fe05:ec5c]:8333 # AS47147
-[2a03:6000:870:0:46:23:87:218]:8333 # AS51088
-[2a03:94e0:ffff:185:243:218:0:19]:8333 # AS56655
-[2a03:b0c0:1:e0::397:6001]:8333 # AS14061
-[2a03:b0c0:1:e0::794:9001]:8333 # AS14061
-[2a03:b0c0:2:f0::288:c001]:8333 # AS14061
-[2a03:b0c0:2:f0::30c:1]:8333 # AS14061
-[2a03:b0c0:3:d0::e3b:5001]:8333 # AS14061
-[2a03:cfc0:8000:7::5fd6:3557]:8333 # AS201814
-[2a04:2180:dc05:2::3b]:8333 # AS61272
-[2a04:2180:ffff:fffe::d]:8333 # AS61272
-[2a04:52c0:103:c455::1]:8333 # AS60404
-[2a04:bc40:1dc3:8d::2:1001]:8333 # AS35277
-[2a05:3580:dc0b:1600:def4:5a62:de42:324a]:8333 # AS20764
-[2a05:d014:a55:4000:8dde:69f:4ac7:b26]:8333 # AS16509
-[2a05:d016:98f:5201:6be0:a4de:80c7:32d5]:8333 # AS16509
-[2a05:d018:a75:6c03:75b:2c73:8caa:414b]:8333 # AS16509
-[2a05:f480:1800:697:5400:2ff:feb6:c36d]:8333 # AS20473
-[2a06:e040:7603:2918:c6ef:464e:9fe5:73ec]:8333 # AS198507
-[2a07:abc4::89:234:180:194]:8333 # AS62000
-[2a07:d884::127e]:8333 # AS6762
-[2a09:2681:1010:10::5]:8333 # AS61282
-[2a09:2681:102::210]:8333 # AS61282
-[2a0b:f300:2:6::2]:8333 # AS62240
-[2a0d:8340:24::2]:8333 # AS50113
-[2a0e:8f02:21d1:144::101]:8333 # AS20473
-[2a0e:b780::55d1:f05b]:8333 # AS205581
-[2a10:3781:2c19::1]:8333 # AS206238
-[2a10:d200:1:33:a6bf:1ff:fe6a:46a9]:8333 # AS212323
-[2a12:8e40:5668:e40a::1]:8333 # AS34465
-[2a12:8e40:5668:e40b::1]:8333 # AS34465
-[2a12:8e40:5668:e40c::1]:8333 # AS34465
-[2a12:8e40:5668:e40d::1]:8333 # AS34465
-[2a12:8e40:5668:e40e::1]:8333 # AS34465
-[2a12:8e40:5668:e40f::1]:8333 # AS34465
-[2a12:8e40:5668:e410::1]:8333 # AS34465
-[2a12:8e40:5668:e411::1]:8333 # AS34465
-[2a12:8e40:5668:e412::1]:8333 # AS34465
-[2a12:8e40:5668:e417::1]:8333 # AS34465
-[2c0f:f8f0:da51:0:3a45:fc57:5e30:2593]:8333 # AS30844
-
-# manually updated 2023-04 for minimal torv3 bootstrap support
-
-2bqghnldu6mcug4pikzprwhtjjnsyederctvci6klcwzepnjd46ikjyd.onion:8333
-4lr3w2iyyl5u5l6tosizclykf5v3smqroqdn2i4h3kq6pfbbjb2xytad.onion:8333
-5g72ppm3krkorsfopcm2bi7wlv4ohhs4u4mlseymasn7g7zhdcyjpfid.onion:8333
-5sbmcl4m5api5tqafi4gcckrn3y52sz5mskxf3t6iw4bp7erwiptrgqd.onion:8333
-776aegl7tfhg6oiqqy76jnwrwbvcytsx2qegcgh2mjqujll4376ohlid.onion:8333
-77mdte42srl42shdh2mhtjr7nf7dmedqrw6bkcdekhdvmnld6ojyyiad.onion:8333
-azbpsh4arqlm6442wfimy7qr65bmha2zhgjg7wbaji6vvaug53hur2qd.onion:8333
-b64xcbleqmwgq2u46bh4hegnlrzzvxntyzbmucn3zt7cssm7y4ubv3id.onion:8333
-bsqbtcparrfihlwolt4xgjbf4cgqckvrvsfyvy6vhiqrnh4w6ghixoid.onion:8333
-bsqbtctulf2g4jtjsdfgl2ed7qs6zz5wqx27qnyiik7laockryvszqqd.onion:8333
-cwi3ekrwhig47dhhzfenr5hbvckj7fzaojygvazi2lucsenwbzwoyiqd.onion:8333
-devinbtcmwkuitvxl3tfi5of4zau46ymeannkjv6fpnylkgf3q5fa3id.onion:8333
-devinbtctu7uctl7hly2juu3thbgeivfnvw3ckj3phy6nyvpnx66yeyd.onion:8333
-devinbtcyk643iruzfpaxw3on2jket7rbjmwygm42dmdyub3ietrbmid.onion:8333
-dtql5vci4iaml4anmueftqr7bfgzqlauzfy4rc2tfgulldd3ekyijjyd.onion:8333
-emzybtc25oddoa2prol2znpz2axnrg6k77xwgirmhv7igoiucddsxiad.onion:8333
-emzybtc3ewh7zihpkdvuwlgxrhzcxy2p5fvjggp7ngjbxcytxvt4rjid.onion:8333
-emzybtc454ewbviqnmgtgx3rgublsgkk23r4onbhidcv36wremue4kqd.onion:8333
-emzybtc5bnpb2o6gh54oquiox54o4r7yn4a2wiiwzrjonlouaibm2zid.onion:8333
-fpz6r5ppsakkwypjcglz6gcnwt7ytfhxskkfhzu62tnylcknh3eq6pad.onion:8333
-hanvo3hzqbhcqm5vahhi5a3czxxdwc7vt56p5gr7bifcvelaqurv6iid.onion:8333
-hz7oqntvj4adrwtqappcgaxfribg5u4rvfkpwlo3xup5fcuyvylkxlqd.onion:8333
-ityrxhidvjnjnf6imzyuqqnkkwridjnebkbokx25so3suq3fzezmksid.onion:8333
-jto2jfbsxhb6yvhcrrjddrgbakte6tgsy3c3z3prss64gndgvovvosyd.onion:8333
-k7nb3r7hxi5exvr4xmvnilhfw6hei7sw4rwz2t6onh4py6wbora6tuyd.onion:8333
-kpgvmscirrdqpekbqjsvw5teanhatztpp2gl6eee4zkowvwfxwenqaid.onion:8333
-l7kw3vjs4cf5mnuejjgqcxrw6wwsjmabllq3h3amy4f5q33d6cgo2kyd.onion:8333
-m7cbpjolo662uel7rpaid46as2otcj44vvwg3gccodnvaeuwbm3anbyd.onion:8333
-mowb2qwpjgs2a6q3yj3xa7nxklfssul4w7ynonyycw3uyopfu3x6ujad.onion:8333
-mwmfluek4au6mxxpw6fy7sjhkm65bdfc7izc7lpz3trewfdghyrzsbid.onion:8333
-rfqmn3qe36uaptkxhdvi74p4hyrzhir6vhmzb2hqryxodig4gue2zbyd.onion:8333
-rsgwtnousfc7zyg4qsm3gvczjx7cihh2njyjbjl3qvcj3xg7wmvhddqd.onion:8333
-s2d52bbttuwcl3pdrwzhxpmhtxn3jg23havjqg5eygwhtiw6lgyelpqd.onion:8333
-upvthy74hgvgbqi6w3zd2mlchoi5tvvw7b5hpmmhcddd5fnnwrixneid.onion:8333
-who3qs4eqlqzoxhqqgan4mg54ua5uz3mk4lj33ag53ei4orvnznrjbad.onion:8333
-wizbit5555bsslwv4ctronnsgk5vh2w2pdx7v7eyuivlyuoteejk7lid.onion:8333
-yrmedr35tt4wqfnwgilltxh5bnukeukxjpgg3jzmmsyld5lgsn5amvyd.onion:8333
-
-# manually updated 2023-04 for minimal i2p bootstrap support
-255fhcp6ajvftnyo7bwz3an3t4a4brhopm3bamyh2iu5r3gnr2rq.b32.i2p:0
-27yrtht5b5bzom2w5ajb27najuqvuydtzb7bavlak25wkufec5mq.b32.i2p:0
-3gocb7wc4zvbmmebktet7gujccuux4ifk3kqilnxnj5wpdpqx2hq.b32.i2p:0
-4fcc23wt3hyjk3csfzcdyjz5pcwg5dzhdqgma6bch2qyiakcbboa.b32.i2p:0
-4osyqeknhx5qf3a73jeimexwclmt42cju6xdp7icja4ixxguu2hq.b32.i2p:0
-4umsi4nlmgyp4rckosg4vegd2ysljvid47zu7pqsollkaszcbpqq.b32.i2p:0
-6j2ezegd3e2e2x3o3pox335f5vxfthrrigkdrbgfbdjchm5h4awa.b32.i2p:0
-6n36ljyr55szci5ygidmxqer64qr24f4qmnymnbvgehz7qinxnla.b32.i2p:0
-72yjs6mvlby3ky6mgpvvlemmwq5pfcznrzd34jkhclgrishqdxva.b32.i2p:0
-a5qsnv3maw77mlmmzlcglu6twje6ttctd3fhpbfwcbpmewx6fczq.b32.i2p:0
-aovep2pco7v2k4rheofrgytbgk23eg22dczpsjqgqtxcqqvmxk6a.b32.i2p:0
-bitcoi656nll5hu6u7ddzrmzysdtwtnzcnrjd4rfdqbeey7dmn5a.b32.i2p:0
-brifkruhlkgrj65hffybrjrjqcgdgqs2r7siizb5b2232nruik3a.b32.i2p:0
-c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p:0
-day3hgxyrtwjslt54sikevbhxxs4qzo7d6vi72ipmscqtq3qmijq.b32.i2p:0
-du5kydummi23bjfp6bd7owsvrijgt7zhvxmz5h5f5spcioeoetwq.b32.i2p:0
-e55k6wu46rzp4pg5pk5npgbr3zz45bc3ihtzu2xcye5vwnzdy7pq.b32.i2p:0
-eciohu5nq7vsvwjjc52epskuk75d24iccgzmhbzrwonw6lx4gdva.b32.i2p:0
-ejlnngarmhqvune74ko7kk55xtgbz5i5ncs4vmnvjpy3l7y63xaa.b32.i2p:0
-fhzlp3xroabohnmjonu5iqazwhlbbwh5cpujvw2azcu3srqdceja.b32.i2p:0
-fx6np3oheacr3t7gluftrqo2qxldbbatgw4hepp7ulb4j5ry57ca.b32.i2p:0
-gehtac45oaghz54ypyopim64mql7oad2bqclla74l6tfeolzmodq.b32.i2p:0
-hhfi4yqkg2twqiwezrfksftjjofbyx3ojkmlnfmcwntgnrjjhkya.b32.i2p:0
-jz3s4eurm5vzjresf4mwo7oni4bk36daolwxh4iqtewakylgkxmq.b32.i2p:0
+[2a02:c207:3006:3185::1]:8333 # AS51167
+[2a03:cfc0:8000:2a::9532:6507]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6510]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6511]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6516]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:651d]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6520]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6522]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:6523]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:659a]:8333 # AS201814
+[2a03:cfc0:8000:2a::9532:659d]:8333 # AS201814
+[2a03:ec0:0:928::701:701]:8333 # AS199669
+[2a04:ee41:86:50b6:fa75:a4ff:fe3c:243f]:8333 # AS15796
+[2a05:d012:42a:5703:4dc5:8116:787c:e016]:8333 # AS16509
+[2a05:d014:a55:4001:f6ab:dd5e:4039:b46c]:8333 # AS16509
+[2a05:d018:a75:6c00:c05b:4d0a:3658:1030]:8333 # AS16509
+[2a07:9a07:3::2:1]:8333 # AS202605
+[2a07:d884::130e]:8333 # AS6762
+[2a0a:ef40:e44:9b01:2746:ca1e:6788:351c]:8333 # AS1273
+[2a0b:f4c0:c1:920e:b25a:daff:fe87:77b4]:8333 # AS205100
+[2a10:c941:100:24::2:1001]:8333 # AS141011
+[2a12:8e40:5668:f001::1]:8333 # AS34465
+[2a12:a302:1:a180::b5ca]:8333 # AS23959
+[2c0f:f4a8:b:b108:807d:b2d6:9146:38be]:8333 # AS37254
+[2c0f:f4a8:b:b108:c458:5c61:dcca:cb10]:8333 # AS37254
+iy7go4454pb4p2zmnkwrgsi6v6oqv53zxnmalz6rnfjemxftapfa.b32.i2p:0
+j225nrmndwviihpe7ib6mm5h723cg62wrb7vnwofopv472ue3zwa.b32.i2p:0
+j2m526lqsujvt6b6xl4ipzbjkvkuecrye3vkggwo6jadvzqu7f7q.b32.i2p:0
+j2pyenyhoppsjexenznxvgqrcs4buv4nssctowgpg6czdoo3nyiq.b32.i2p:0
+j3usxovx7ukl645u77jud2mpmrk7ryh5yaxno6rceu77hqlxkuta.b32.i2p:0
+j42dsnjlg4vv33tshgs5jyham6plf3suj2sn2k6ew4tmcz3fpaqq.b32.i2p:0
+j4tjrfxnwcmbhkixmqlnotginhfxgfdvjahr6yn7j7rkbdqngh4a.b32.i2p:0
+jb3iui7grnljdjmsz7qbustrl5vn3ip3upnkzbaegaiklric7cha.b32.i2p:0
+jbmqtghha7hscwbwpi7ps2dnghq2bvxjnfeb5glngnvgjmeackaq.b32.i2p:0
+jd43pc2l73ek6hk2tp6hiyada7ed7vshqo2fvxbga2daylcghfyq.b32.i2p:0
+jd63whebd5yuls7r34mi3lnnuuhqxxr4lns672tzliru4vk7hwrq.b32.i2p:0
+je6ju6ihybxm5wkw5daeqjet74lscvi4ls5wn5wf7kiaczfggafq.b32.i2p:0
+jeidstlwdlt63lju7cnj2mh4fofysjnc2wcvilphynprd7jw64ma.b32.i2p:0
+jeox5nruuoopedsfpuoi6kwewmhbbsnhf7kib2q6oafvchxvmnnq.b32.i2p:0
+jex3ykw2nmw7owhgbtio5flv7us624bxwp46nr7rhmteujrmtvvq.b32.i2p:0
+jfdh65i4nhpg4obnoe4aqi3vzvbi6fyzjj2ee7s3qm2gbcnllkvq.b32.i2p:0
+jh2qxkjqngj2m5tn2ecaidfqac4awgnmkgsajntoqs5qqyjtp5yq.b32.i2p:0
+jh7ev4a5zfzmeyekinhtbqfi6c7xhvc4msdpyi67j3sxl6r44ukq.b32.i2p:0
+jibaw7ynbnxueqsy7k7jyvoj6ldzbuckppfx5wozt7mftihy5vcq.b32.i2p:0
+jicc5kwy4tv4j2nn6gfbis7e6dxy2kdvet3zpxdbyp74h5gpnxuq.b32.i2p:0
+jimdydczt6e2lceezopnl4fgz7q2jeqqhlqaxrgen33ouxk57xiq.b32.i2p:0
+jjangl6h4py2pd2gwamhqlsymyuocmpioneinzf5bb5qvvdjzzqa.b32.i2p:0
+jk56z3febpco6rbkpzzv3jszf4px5uztmoxzkpss7mxnzqlpsdla.b32.i2p:0
+jkfuajo4ayvo2rbv5qdj443q6adqmnormbhsf2f7rlp5t24xomda.b32.i2p:0
+jkvey2vfdto2ucudi4jlgsbpmlls3uwmlkjonfhk5yminkwzwi2q.b32.i2p:0
+jl4vr5kac7njyltivn7ut5afyq5ipzc5woxl4523emodxixci3zq.b32.i2p:0
+jmebfluhrl6ad5pt4ipevf3g3a4trcu7axalpubpkir6zlwovm5q.b32.i2p:0
+jndr5i4qhxs6aa2bqvufrgttq6enavyghi54dqfuku2qnstdqa5a.b32.i2p:0
+jopiw2tup5h5xh2hwef4oflgskawbpfmswub2iosmqocejijd4fa.b32.i2p:0
+jrert3o2rhbkpquybwg7tq4bdvlxeh6lnlcr5ddexkuguvi2l2pq.b32.i2p:0
+jrobuecgmuuqmpdsbxwbqeldt2735cgcemngoasnbbkdz2ufdlmq.b32.i2p:0
+jrvg22xvbmjyrkqg7mr622zhnda3ijtua65cqngwrven7sf5zd7q.b32.i2p:0
+jsg4dsxvgjcqz3c2qgtwi4ip3l4n4hlxodbvgukwaipycwo26zua.b32.i2p:0
+jt35uwbl5wx7ponyxomksrjjs7zy5yymvtud3nmogt7ci7xxlm2q.b32.i2p:0
+jvaoh33cpczp626ldwr4azh4hb5cjmxlbz3dq3cxisdlzn7z25eq.b32.i2p:0
+jvlj7qyxcmolf76wneyvmdxrpiezsxkiimapwxbdbiw2phvlyjba.b32.i2p:0
+jwqlvqmfvodnrslde2idqt25qxiyvgqdlr2q4uod5s6lkmlempya.b32.i2p:0
+jxjc7oe24vxdepkfvl365qfwrxcad2f3j43fnfuchtvqqkqd2rzq.b32.i2p:0
+k4mch53m72zv7jdda3poa2zn7bi3jacqwfb45peealxbhysdozcq.b32.i2p:0
+k4pjt6m25dcxno3udek6rasooz5ztqnywa3f2owpvcjzvisg7nga.b32.i2p:0
+k5ars7hsrfubadroe5h7oypjnqwi6v2vxxy6rmns7zubf66aivbq.b32.i2p:0
+k6eeshsk4vf34b5gfnraz4p5qb6scv4kw6eiltebel5exw6keppq.b32.i2p:0
+k6gt64xby5igmln5hfcuzspt2tndimzrdvj65yo76h22g5yhlvja.b32.i2p:0
+k7kcnrqe3ybqu2w3fali7zext6na7o5o65rx6f5oqza2lonsry6a.b32.i2p:0
+kbawcieyelwwitrjow537zpmdkncwiq42rhjgayw5o7u562mk23a.b32.i2p:0
+kcqkothplemakipfpeajxmu4xsszpaxpprgtuv5tgfdaqejg2sqq.b32.i2p:0
+kdrcbr6wg2bj6oipsbeqy6bp3v7dqpth6cheviysmvo4bdta7fda.b32.i2p:0
+kehosmgk76fxnjywqjj6nqs4ohg4hsutljdzjo4sswhxlj5l5tca.b32.i2p:0
+khxruoaom7juockko2tbxqo3bnrjmoqjhdoady3yyr4qacz4somq.b32.i2p:0
+kjaa3zlp4sipfxikketgvlx4oxq5ok57ifxenbiewmsrew6lcw7q.b32.i2p:0
+kjvrzgckasb57yqhluvjblx2ngxstumfg6uufz5mc7zyetkjlr7a.b32.i2p:0
+kkihsh2faw2gxil6it4glol4u37ccruuzsusyikquzmkffj3wn6q.b32.i2p:0
+km3b5j6cqrcqewdpuveibptw5gguwktwan36jlow4xykpg2dgr6a.b32.i2p:0
+kppcor54kkge6cgq47nzevlfrhbxingcjfmk2emkrdaejpixkqdq.b32.i2p:0
+kskidltmbigp2etp4pdl67ke2qzjjw66wqairzr4wn2apq4o7bka.b32.i2p:0
+ksxxinje357zctkobwnxsy44ddivq7yp2n3n5gopk4okir2vghaa.b32.i2p:0
+ktua3j43ijxhhhfeljsp32kdiuic5nlnfnkx3ealy7ojva4vwkoq.b32.i2p:0
+kuzu73gzvlnog4cdtdk7edbusxr4pigknvwg2bjo6l46ugsgmrtq.b32.i2p:0
+kw3v6gq5semgt4gg6itum3qtaylanyof7wn6bnbngdeby4xixuoa.b32.i2p:0
+l364nudwoj63fe5nsjmniiun63e3ycdqrjyknbfixxtre5spx7ga.b32.i2p:0
+l3ach5wbdx3n5nq53sv6tagijrbse3nwa2gkqz5oj7aifyaizpcq.b32.i2p:0
+l5fita4r7niir3hxmu7mzcwrigxinkrn4oqeembdkgao7k2yztha.b32.i2p:0
+l5obkk7zzop3nztnt6ijugz4okqsyhhb5o6gkbqottgqzzzcgvla.b32.i2p:0
+lai3534z6zs2tukzixdagrciezum2bkyuask2srxjrn67yu4c57a.b32.i2p:0
+lbif3mgg2b2ir5dkz7u6iatdrui2h2a64vlmffcfgqnpjuvwzaxa.b32.i2p:0
+leu37bptuuu5377mi7cb5t2vsu4hesblyxl5zptnnk4vodhovwea.b32.i2p:0
+lfuvzzzceuik5u5pnd2i67amegel5ua2rrnncxkyyc7bhteq73aa.b32.i2p:0
+lgpojpoix7zd6dhpo5hdrnwm4ueyjvi7tbot4qsqybk3upuocnpa.b32.i2p:0
+lh7qjombcmiekvv6niz5eflr55cnd3oxx7nuus6vmehqfodr67za.b32.i2p:0
+lhupu3owhuc7qwvyfazgkbcmr7sjp5qqxps732vy52v67fsn5guq.b32.i2p:0
+li4vuovafxjrf54kvfg3mjrg2mebs6edpl5yrr2dohddvgmxjyvq.b32.i2p:0
liu75cvktv4icbctg72w7nxbk4eibt7wamizfdii4omz7gcke5vq.b32.i2p:0
+lmlf3yjyg4djrb7wtzmrb4fbkorqba7k4lvk7ax4omay4mbytupa.b32.i2p:0
+lpal67whroip3c2yj4fxbayj46d3tr5osyqog6el5n6ctktdnakq.b32.i2p:0
+lpektonr2uyiohuzi35shtj3oaa77rklmqsivuydxkcxkea2dwuq.b32.i2p:0
+lpffyejskwwap2go7ommmryex2autlkmcnnpk2tm6aitxcalwrha.b32.i2p:0
+lpqkgbek3ci3w4qobpeqepjor3bukz555rzlmghck4o7wwb7ajza.b32.i2p:0
+lprgmkc45te7skx7rffpz72ca5c3zdg3tabiksdboao5w4wceu5a.b32.i2p:0
+lqn32kgic4cincyqlybpwbywcrowcxmscfcm4mqt4fgp24qs3y3q.b32.i2p:0
lrah7acdsgopybg43shadwwiv6igezaw64i6jb5muqdg7dmhj3la.b32.i2p:0
+ls52j74gwtsrqhlgqcai2cjl2rcivfib7jzovc4454h6tq3i6k7q.b32.i2p:0
+ls5otp5mybmxqsaeaid7wlori2ukieehr644adjfwdxux7jxlvga.b32.i2p:0
+lttdnbluvybzbjq52t5vbdkk3pvzc6zyi2oji7yjdpcgtgz732bq.b32.i2p:0
+lunkwblewltvq4spt7j5u2nfpqyndvgepl7edkiru322mmtpy2lq.b32.i2p:0
+lvdbqavgdom5h5denwkmdwslfzxckf6eddwflelbog7tgo2m7usa.b32.i2p:0
+lwjrapkfexjyjqf2rrdr4ghhxmlr3jdygsonetgtheglvmru5x6q.b32.i2p:0
+lyg26sjkcx5ied5a4a7jdxmfeplfcnux3fux5rsxzkm5mgbbsllq.b32.i2p:0
+lyqmygrc6gujxa4xlnwqku3vtfkbrszdiirsagn6xd2yw4kvodrq.b32.i2p:0
lzuu6mjtu7vd55d2biphicihufipoa7vyym6xfnkmmlra3tiziia.b32.i2p:0
+m2k7ajij2wvgfpsbg32zuorbsjt72iye3ozz6dbyxtj57fx7xsqq.b32.i2p:0
+m3hlmj2gz2co5gu4ss3wj4b7ebeg2xbkrr65ogxvhn76uxna5qma.b32.i2p:0
+m4o2kndr75clxemwbq5m6vnok7eiqshf42wjjvag7dtwxtafxhra.b32.i2p:0
m6bpynxkv2ktwxkg6p2gyudjfhdupb6kuzabeqdnckkdkf4kxjla.b32.i2p:0
-m6v454xd6p3bt5swujgmveklsp7lzbkqlqqfc2p36cjlwv5dbucq.b32.i2p:0
-mlgeizrroynuhpxbzeosajt5u4ddcvynxfmcbm6kwjpaufilxigq.b32.i2p:0
+me6x2p4m6jw3cxi2xl4a37u4orzmv3xdopr5t2vgwjmauiuqrmzq.b32.i2p:0
+mf6tmlegp7uga66cdael5376uaz4qd3wacuh44yvepa3kbu4fk3a.b32.i2p:0
+mhgxec57s6h7eixgemsghlcuhmgh7m7p7phqd5kzmm4wovrp2pqq.b32.i2p:0
+mjpulaafdyuanouslfpjcsvumi4edtckfu3ffn3ipabkxj4sn35q.b32.i2p:0
+mlakhs4ixcqwvk4vo4ce3loa54wmdlfingk73jookrkbra6ppq4q.b32.i2p:0
+mnkqn3r4jmg6vrmlprabenndyft2z2jw6g4nsnolt434coiklmyq.b32.i2p:0
+mnrbc3qi4zuk2tzghmy55kplawncih6jkmt75qczfu27enu3gcea.b32.i2p:0
+mnrrefebq3yxr2avprp3ay7w42sx27ijv6stjljzpwohnfnkg26a.b32.i2p:0
+mo27t6wym666b3wfauhndqocbetdsssxksep6x4dcpuh5dxe76oa.b32.i2p:0
+mo6mp2tymma5l2swob6kqzzb25ccmgccfj5pic6omjkktv4wve2q.b32.i2p:0
+mpi7bivbr2pywsgasslw5we766m757os2667h3hqnhcftaszdv3a.b32.i2p:0
+mpqb3jdmdibarrflyiik5wj3ekitxpe2oqieztlax3uomxspgsvq.b32.i2p:0
+mqocuhx3qwcwfuuin42yuhtqgm76drlmfvzikf7urot75qw3ykpa.b32.i2p:0
+mrbhw6ow77bjqmb67rurbkcl4xs2ocj4pti6hnz4wcsg6bduwtya.b32.i2p:0
+mrypjr2fagjhg6z4ixr73f5npkeyoxsjamcdv5uc6oj5oi2ylsvq.b32.i2p:0
+msjl4a7mdp7x2bcllmbxurhfmtxvolykonz45psmh7j6pptfyy5a.b32.i2p:0
+mtlznxqya5nbuyorybzul4cpdlrnvlrhalx2eogwjce5j32js5wa.b32.i2p:0
+mv7b44duaxqpzbdztnrdvnj6ypsp7yhs4z3dc2q64jov6pritmja.b32.i2p:0
+mvs5a3s6rgfbvvgq44wzyd57vf5pr3jcthc5qdo75xgj4slsm7tq.b32.i2p:0
+mwcqoe2lu7u6ogwo77kr5sr4wx6pxnotkdeck3yyjfh4uklytj2a.b32.i2p:0
+mwevh5r5dkzddlo2ol6bojpdds3kno4xqoy6p6ulid3paamgrtla.b32.i2p:0
+mwyjzdrgtypbwjyulw4ifetejz6xusqstvzylztsphpg2r2zf7ua.b32.i2p:0
+my66tuvzfyy6kkbdeqvgfpk3xuoxerucxt73tw6wxv3ian2p2snq.b32.i2p:0
+n3f4ngbs2igvp3j27vsi7thguqxoyvbfenaqhgypuqdz5iovek2a.b32.i2p:0
+n3fa2yuf3i3opdktiwyxzhbpudcut73valxdrlre2xs2ooepddaa.b32.i2p:0
+n47e4gkf5xujcamnsarfuy7435hfsgs4zhndcxaw2evafn6r2rma.b32.i2p:0
+n4n7bivjb2mffgll2ulpwyb4m2oomv5roxtdj6bmlb4cgpf3wdja.b32.i2p:0
+n4zwusew5coibur4p2g436ktc3cyogz3sklztu6ruulag3je6ita.b32.i2p:0
+n7ykk3cxcqzcoeipo7ghzb62ko4d6bxzfgenzxistvg6fuclebva.b32.i2p:0
+nazasriqoa6qoxdlgzjwsggubxl6i4nge5q7om7nijaqi24ulgua.b32.i2p:0
+ncdjjthck6v6phz4laddyc7a7czoujys55melfcoptvl2h4izqlq.b32.i2p:0
+ndtoi53fz7e6ml6v6jn33675nwciw7mu5msn7afzbhebprusqg7a.b32.i2p:0
+ndunnsjyp6l4w3jebow4zgsfrdsy2lrapjgslb3tv7dg6oypfbwq.b32.i2p:0
+ndx23xqvt4qezezih4wlj7mqtwc4nzbvmgseq6fc6e2ddywrmkwq.b32.i2p:0
+nejmippeopyo75wd3gjrhca3fr5mo2g37owzwdezxmg7uhx6ygxa.b32.i2p:0
+nfsi3fenzrzoccj7bpzuvjbxnij7dmzuprg7ia4geuortoquja7q.b32.i2p:0
+ngn5elnvbm234yyun5kbjyr76oy5nhrvyckn33cqcbx25hw4lfoq.b32.i2p:0
+nhpbv2ravt6t5fhxyvuhrxyma37wph6dzuzpddlw3uoivzl6tx4a.b32.i2p:0
+ni4ns3ou7v6zh5qrawvkwnmshnrzcyc5zojkw647rrniplmurrba.b32.i2p:0
+nigrfbou3zt6wxegn5im4cyminjcjmbsqror7ntcr5i7yv6chwvq.b32.i2p:0
+nij7pzb6mhrra5glb3dyghjt55sngwrikzdlagmpsf7jn2onvoaa.b32.i2p:0
+nisd4was4gm3pkvuwjh3sbaoo35jtxop6y2d7ug4iol4cffkrk5q.b32.i2p:0
+niyz7v5fdhqqtlr4y3tcgdoeu3myntub4trzvgixlgjbmowccgja.b32.i2p:0
+nloq52novup3cawccvaakmbudooatwkw7dqltnr6q3j4qy7r6oia.b32.i2p:0
+nn7p4y7pun3m3txaqbkeptkxykzwrf75ru2zimadnewj7g3r4una.b32.i2p:0
+noj7le7kkj54umo6mdftagvvk327cuir7q75bnvuphrxa7kjujna.b32.i2p:0
+npcmehkhh4z2wtk3f5426izrytvqvyf6aa7hyx6hf6jdbxveqima.b32.i2p:0
+nrrg4p7tztllzthlkqzomqi3dejfcak7t63n7zzuomt5atzz5m4a.b32.i2p:0
+nt3ysas4wpjgkft5pohrfstm2vgj7t2vx34u32voy7rqon7dlbga.b32.i2p:0
+nu2ao72zway2ponkhrf322wyfrrn4mdmyp7n5q5xzmjhcge5odma.b32.i2p:0
+nufliiw3uav3tzdalit224yhbfpcjtgfrm5ic7ob6l3mmsay6cpa.b32.i2p:0
+numilh7hhhf6inzkzway3hzif4kiroqstxqbz7hzvoy2ctgpaqda.b32.i2p:0
+nuwphtuudfrswids22qjq63zgxh5wu7erafl36jyniuxhz75ikyq.b32.i2p:0
+nvmuuajhaw74g565l3a7dpezs4rkzm22ub5jhh6mdvzu43j4a6dq.b32.i2p:0
+nz4lq7pmswngaevv2uqyainqzutfxlkavxgde2w2slo2p6e2kcfq.b32.i2p:0
+o5ijpzor3en5xnndm3ntti7o4fxvv24t3veh4g7mahk7ogesb67a.b32.i2p:0
+o6b747qkpgu6gvsem7leylvmxsaaqby67pu55fmqn52dgazuvbxa.b32.i2p:0
o6t4fr5ayfadzieutstgwcllvwxeuzjlxmzsmpj3hpkvefhzfaea.b32.i2p:0
-ofubxr2ir7u2guzjwyrvujicivzmvinwa36nuzlrg7tnsmebal7a.b32.i2p:0
+o6vbupdnpd5bwvcx7ivaecgyo7x5vdu5em4va6cmx5iwcf5tyaca.b32.i2p:0
+oaeqbkgpek4qnm3nly76x2tfrad2tun2xefliez7a3uxddeq4i4a.b32.i2p:0
+obf5kfk5n4nnsw7ez6ls6chqu4lz4wlck7utwvmjnlin4nzfnspq.b32.i2p:0
+oeydvkjoeqy3473wxkkbmoc6zz5m6zcmf6ov2hfkci54efsityua.b32.i2p:0
+of2gy2vblht57tn6yfczslnmp2xybdiazzta43y24w76tl6tu2xa.b32.i2p:0
+oggn6qbpmbag224gumagzgno53mgozb65tpzt5lezjbfbbiqky4q.b32.i2p:0
+ognn4mwwtmtjbrnq2kur7spcfohivxlrvz3sfamt3t46pk2e2ibq.b32.i2p:0
+ogqdcq2igslh3n5jn3utz2vpevttul366bt2246vilfnowuyvova.b32.i2p:0
+okjamsyd4wutvhfhsffejwk6ioru4mmvwagfssoy5hcocg2gj76a.b32.i2p:0
+om32whhwvcsbrf4g6uh5hupsl67oapccourkxyr7uf5zwaqxtxbq.b32.i2p:0
+ommky7qetuh45h4lk3raili27fnbhsgxv3zucinoaymnymo5735q.b32.i2p:0
+omngcjfwtiyqwbfqqggzbkttqgm3blywu43kpto2py2e4gp7fhra.b32.i2p:0
+opnpvz7mzfw6nypgmnn5zgtlzx7xuc4w7vat5bsr4mdtp77kz7eq.b32.i2p:0
+oqrl573nw6my2o5mup6uq6pm5immw3gnviahig5cceges4wfnyhq.b32.i2p:0
+orvshryqq24l24e4dvockx2ekj4hu42otqxsvyvy7tm7hhdjsz7a.b32.i2p:0
+oukeldqgovavh3npgb2by7w6hug575uae24z6uqfdl6flh7ma6rq.b32.i2p:0
+ovnk3wfbrkvvute6vkn5glhdtlxr6nyvebiflvr5l6ws6sorpa2q.b32.i2p:0
+owexluejb3eszx4p3b6zuxyggsxxtkxfgxoylkagfecs3bgfnpja.b32.i2p:0
oz2ia3flpm3du2tyusulrn7h7e2eo3juzkrmn34bvnrlcrugv7ia.b32.i2p:0
-pohfcrfc7prn4bvn4xstw6nt3e7hjmb7kuj4djtsfqsskwhmhnna.b32.i2p:0
-qd6jlsevsexww3wefpqs7iglxb3f63y4e6ydulfzrvwflpicmdqa.b32.i2p:0
-rfjkzdzv4cwpxo6hzuncicvuyui76wxqx3a23lynq72ktwqs7aja.b32.i2p:0
-rizfinyses2r3or4iubs5wx66gdy6mpf73w7uobfacm2l5cral3q.b32.i2p:0
-sedndhv5vpcgdmykyi5st4yqhdxl3hpdtglta4do435wupahhx6q.b32.i2p:0
-tugq6wa2ls2bv27pr2iy3da3k5ow3fzefbcvjcr22uc7w5vmevja.b32.i2p:0
-usztavbib756k5vqggzgkyswoj6mttihjvp3c2pa642t2mb4pvsa.b32.i2p:0
+oznpphdisfvlcjgkvny6ma62wy637nh4vtpxww47ifpmlqkjv3ba.b32.i2p:0
+p3au2w5jnkqugxnkukj4rusvynvz3oxawdf4ajzeyxvfvyzhmetq.b32.i2p:0
+p4tsqwvdpaitvlgaujfr2m2qbr36qiwusas5zkiut7w2wjcp3sqa.b32.i2p:0
+p6o3tzllswm2j4wah35niry4tcdu6lq5b67ehevcx45sae7pb6da.b32.i2p:0
+p7ifeij3vhds3diihx5qimucyzgck5omfkqxc4pkbbjtfu4hp6wq.b32.i2p:0
+pbag76x5yyo5d3wypvtohxmgbtdrjjb35ljnq4w5fpoguyt5mj6q.b32.i2p:0
+pbftrtdthbj5qcecraden3hdvwomqrgseec6ib5h24n2zcivdqaa.b32.i2p:0
+pc4d5v74tr4vz54pbr57ejga765ep6vwk5kox55gfobi5572apta.b32.i2p:0
+pcc6cnry4maul7zlbd32khalaavkcbw5hdjuk4zjwposaorjicca.b32.i2p:0
+pcdlqw2awppohbiued4rffgs6n3lv3thhon3r67jmx2652qx2khq.b32.i2p:0
+peteksofgwgndsdh6ovh2ydkrgpyqgttit4ususs4bzksvdqkbea.b32.i2p:0
+phendyytrqdr2vfsw3kil6yui5vb2p4v5xuddezg57wsdw5uyquq.b32.i2p:0
+plhoz53xhplmyuejnsg5bkfe24ow3pbldysoovuupu6qwb3nttca.b32.i2p:0
+pm4nukrzndd2lvd3shivpjrcbjlontmxhag2xzdf572snwbr3p6a.b32.i2p:0
+pn5cx32ljrvzj6x7hpgyff3rlftextqpp4zn3nkfufrrpnpuimzq.b32.i2p:0
+pnhspu3rloczdbzsysa2iftsgoiy3zgcd22jodmk7zdjanhiemla.b32.i2p:0
+ppe2jfsb2xrmgwugbq7agy44ucb6yq4qbufaf2sh76b4kwpa4jcq.b32.i2p:0
+ppez53yrs6lanyvyxuxblqxiuvhnqvvtafmwaid2kgp2dx2v5iaq.b32.i2p:0
+pqnqwxl7jsrok7vgpgcvlxwlkg6yckx33n3g4xf5lvuntwn63b6a.b32.i2p:0
+pri376r6uuwgnbnevki7c363h4ryfwjza7pcbfswqqxk6hnrkhja.b32.i2p:0
+pscw5yzaj5js2fn7gzrzoj6teonlsohlbnvdco65ubdefpnpwhpa.b32.i2p:0
+pt3mqmvkv7aleja7vattlysu6x7gjnbwqvwtu4skzabvkjztfi2q.b32.i2p:0
+pu6e2b5bz75qnmp2rox252aksllnitv2grnn7qfyzjkfio7w5h6a.b32.i2p:0
+punslpht6pysnlteht24rgvrkmzdd437lnpflojwakl5dy6mbema.b32.i2p:0
+pv6g7uin653rerdiivdgtoirjvokjowi4b3fwatszdlteyos3i2a.b32.i2p:0
+pvqyvn2lpvoeyhgcgunoqtetkrkp76iegyoii2af4crnlto6gb2q.b32.i2p:0
+pw42656k2vbwxmvrc2qbsz3jslvcxahln7rehsbia5jdio2knh3q.b32.i2p:0
+pxbyhv62tcdqqpl6pbp3og7ajzzcnbximv5kyt3hid3djd3uwkdq.b32.i2p:0
+pyf2csixjugwp6ad3bkry2ulkzj7inc747dsmpk7iebuidk4l3ra.b32.i2p:0
+pyole4gslrmenfcmd4ilqyzvsuyrjyffjbw7angentqjkkljitqq.b32.i2p:0
+q3ueujd332k5qjxdqkjtjlgkm3ktvdy7ats4c2ogcvokog4wm3vq.b32.i2p:0
+q4o7bf37e6afx7evwdyovsqptjwo6td3c6qtjh4rtdngp3trwi3a.b32.i2p:0
+q55g5g6s47hi7pcuomug3vrcd67vji7us2gqmfe7qn2nkq5vz52a.b32.i2p:0
+q6lzsezu4idxpdwro4x6svwz7j6h6gso6enidcxv7jhc2gbepuzq.b32.i2p:0
+q6o3eqnyg44uzjzqeudsankgdouylshkhdhl7b4bqxkbmdnm4iaq.b32.i2p:0
+q76g4lkosb2sxenh47eutqgwwzjyph52rirc635wkwnxsejrzdda.b32.i2p:0
+q7ntdwy6xueyvghbjamfrh62aqtuu3ikwg622em44pa3czomrdjq.b32.i2p:0
+qa77lz7dl64qwtj4fxxlz6otkuvv42dciggnmx62eobs2xqi3vlq.b32.i2p:0
+qaqvxmyvq2m4wombmtaz3our3qmp7eet3qle5flnrs3a5wgfhxba.b32.i2p:0
+qawed5ou5vb42ugi42goxr2s6cqzpyh3s5atkhvfvyhyc6anxyaa.b32.i2p:0
+qddg7myylinn4tw6kdjmmp6fsyetkosnrbp2gsjx77tmkqyqv6ua.b32.i2p:0
+qelsaseevnmz2unpovh4nbpjpshjg45iudiaf5zbngealwwuxe2a.b32.i2p:0
+qfbughfr5hhgoomasyviwk3zin24uerpl6urz5smzxc2div5ixxa.b32.i2p:0
+qfl3i45ipgugo7ueswy3ynnbaet77xawiplvmm3kp4fj72qvzc6a.b32.i2p:0
+qhuk5zq5v7h5p7o62gsxgtqqo7va4i77o5vei6wttxqcgaw47h7a.b32.i2p:0
+qivuqkrr3pv3rul4wgx4o4zon5wegidt5auylv3bhebfuj6oqauq.b32.i2p:0
+qjdftbhcaghdslzxjqx3nmem4z5p5jt7e7ou5bdz5llnqlxshe5a.b32.i2p:0
+qk3iq3wr6emttdilvdqbv6vnqjshuzz6mylwyfo3z6vpjywvnfca.b32.i2p:0
+qkohzoxigef43ro7mf2bd76eyneuuj2vfyremufvufssksbvj3jq.b32.i2p:0
+qksthizqtfdjjxcrahqxkl3bev75k24blagrkoszxen45zelijpa.b32.i2p:0
+qlhklv3q3rrszbrkxw755lpdburxwcj5dkxwicas46flztlkdcja.b32.i2p:0
+qmtg5ukzxemsktsxw2brwmohehyehwlleky3kuzeqzy4ledcou3a.b32.i2p:0
+qndgqhj3cpbxrktu6r7ysaooccqzvselvn2tphu3plx2z5ouocgq.b32.i2p:0
+qnqojlthym7z4gwizcblhpd2thy7v4a6ifme57bzyl3nxzkj6ica.b32.i2p:0
+qorzdjceszf432obxa73tnwhqb7ltxrxlfkkqmw2flmfjhoyv36a.b32.i2p:0
+qp5ppgozzbkuingg22zgamf4ozpe2n5hjlu4i25r6pjqw2ngrhoq.b32.i2p:0
+qpddavnflr5tdmeypeu5lrjjwsgtdhz7hw5emxiyjkcp7m7xysca.b32.i2p:0
+qpo3u565rmgeioruszadbc4vmpgjyoh7qorv4lyefl7geewyyz7a.b32.i2p:0
+qqiakw24obfwz375gfb6muzaz7tr6ani3od6leoox7jwzrizyxkq.b32.i2p:0
+qqmxvujwi4ktgj2cuqmw4kiujkf7ukrkoe5ryy4bjb7tyleplsja.b32.i2p:0
+qrpz67rcwrbpcockid5ml24dtdhhhekty3xd66ekkyatpfjd2wka.b32.i2p:0
+quzkrgzb5pmn4465647ke5lsfbseqnorr6ljvfsxcagj7rzl7hcq.b32.i2p:0
+qv5e4jlcmmkdlmh5spkvv2wgj343vm4yoty2hofuzi4lornn3hzq.b32.i2p:0
+qwhvlprhk3ntswr5xntnc2hhgmvd3bbgzgkbombiibhrsj7k6gyq.b32.i2p:0
+qykavpjbecssape77mrxjxwxces2gbjd6gzewd6zys32uhmnnw3a.b32.i2p:0
+qyqwn5xs24h65rldrle5msyarmqof3lb33uz7sutauwdg5qiuhoq.b32.i2p:0
+r2p5kqr7xjo4ncz7l6ekdx2ge6su2j22j2tdsoxu4jw3u67z7poa.b32.i2p:0
+r4ukdj7c2k557k7qd6siauhhqucshwy2rrkm66twzyh4jiucimaq.b32.i2p:0
+r5d5jgscvs6ix5v646ohwa64vutu7umfeknrc2hrezdjtlr4lm6a.b32.i2p:0
+r6d4moarp22wnnsnmsxqt3s32gzyscaccackcazvimrep7sa26ma.b32.i2p:0
+r6hd3knqi2p6kaw7hybrcf2q5lcarulcczs3sgcuz4yc2saj3gya.b32.i2p:0
+r7bug6wbhevqqlbavouj3ggpa7e57sbd3oivkzqeyagrtxshmjpa.b32.i2p:0
+ra7ztq7oq7jcozpui7c4zv76gh7rjwhq5fkpxp7dvw7ritick66q.b32.i2p:0
+rb7tyjd6gi7evmt5mzvtboramqip43sh72zjxnwhj5k72zfi3g6a.b32.i2p:0
+rb7x26lmepfbcd7wtxu42pf4tdxbe5p5zsf3cwuukd4fs4zhxtba.b32.i2p:0
+rd2cw3iukuth2lwe44q7fipawrne2io6y3fyyv5xew6vd3hos2qa.b32.i2p:0
+refo4v727jmff6ylrpbkvd5emlfr2hamaeh7zho6oval5dmnwlta.b32.i2p:0
+refrtydbdslzcgcsmmph3435qigyajh4q2nvl756f5yojouln4yq.b32.i2p:0
+rfgsjhyvqbunef5b5r2emjuoxx2i7rcsl7gathy2n4gwjyyat6bq.b32.i2p:0
+rg677vpfzyhsckzzcvoyvqdbwtdkqig7lxv4unmxcz63vtr6tgza.b32.i2p:0
+rgbq36syjadm2ex2gftc6xztivckrqzcjszla3jacwfo5hqutzqa.b32.i2p:0
+rizuiypjfhukt3bqnetppoauovuaqq5e6jzgd7tgy24zrwa2ydxq.b32.i2p:0
+rkhb3463btvfozwta37itlkt37iyncpkzak2xhoe4kg7tqafqria.b32.i2p:0
+rl4b3r5h5xodo7kiw4nykd4rhoc4j37kxizzyb6ukgcomyc2qrya.b32.i2p:0
+rnsjgirap5lfhxpb2xczuawgoztb4ptgdwt5rcb2bz72vhtai2jq.b32.i2p:0
+rrm2pems425buhonptp7lbtbprmwwjhbftey4ujvk25nclx7rerq.b32.i2p:0
+rvjzxak3jvwwti7klfb64wrsmlfcs6ceiqhzbbmjynokn5tz3egq.b32.i2p:0
+rwgf2wj2x66xtnjx3dggxhkuy6gvihvur42tbkoej6bd7iukoqiq.b32.i2p:0
+rxatc4b7obgosvznpqrmyrl6ty2yixhi7rpbh45sopqwzglyimga.b32.i2p:0
+ry3iuaabf5ek73otfvchwrqryez3nsgq57bpmzkyzumqhfbhgtaq.b32.i2p:0
+rypsyqod2yq3zagcvvc2643vydtv4zm2ew5r3w5kjzyq2snvzv2a.b32.i2p:0
+s35hlnmumkgdsvj2gepnwro4wo2h7ts7ddjhhihqggywn7qcym2a.b32.i2p:0
+s3rbe5n7lyy6smerpkgr4ictzbvkciu7gxyj6zqw3xyw62rmivha.b32.i2p:0
+s43w4tsmzmddvu2cxugh2lx4o5mup3rkvjhm455u2qqpg4bqlhyq.b32.i2p:0
+s4qlly4iwzevejk4ex5zfqhb4t666o73mvdmy4gpu47tpb775nja.b32.i2p:0
+s5ls42vzfaqzgrjr6cvgkmgifei2rtvj7uzaljkpsmt62jwtmvxq.b32.i2p:0
+s6umfzwe27x7az2yjsgqftjzawoj5lrcrgxldkfwfq2qwobml2ma.b32.i2p:0
+s6vsdby2liaahn2fh7qvrehqfus7gaz3p3u3rpjtfjhm4ahvz46q.b32.i2p:0
+sa3k2xipbuwm62bb5n2mwaqyyjcvxzb53kmzinoojgnjpnqurzeq.b32.i2p:0
+sadnlzguaa4k6kvpiky27izp36er3i5h74l452povbnajqullpca.b32.i2p:0
+saj5uchj7dzmxjv3kdzalgtbqzw6wu4wzxxdiobc23m452ehk3zq.b32.i2p:0
+sbalp2doxyedtr52kj57va2rmbi5npspv4drk4vxnujag72gtpiq.b32.i2p:0
+sdxfzbgwxpf6hbik7k4bqm63wm4xld7qgo3hjlhknnehzxyyeu5a.b32.i2p:0
+sh5hww42vwlsl57cdropaeqmmwozinnr2tg6wq4prg5wrkusvxja.b32.i2p:0
+shpd3cifcjoebw6pskj4pfmrm7lwecrygjnje55heorhsxm2lnrq.b32.i2p:0
+si5x3fon3ew644friidc5o3syrf5v6kk4pxxjvhibev3odxk7nyq.b32.i2p:0
+sikkmrxv6wat265rpay2tk7jywyvlzkekpolmwyp2el5g7iihsvq.b32.i2p:0
+sjpqyf3rq7ojcalldlybvyyh5lqiq5j3ade5w6txe3473ybhk3sa.b32.i2p:0
+sk7aivked563g6g2ri2saggni7jqzxmucuqa6xkudcgjvpbjsyda.b32.i2p:0
+slbbsiq2pmouqht3hznafnowq7sxzlidmwghfch7iiq64rzdhwra.b32.i2p:0
+sle3cbbdom6rknc3drqtawctpy635ica5d5gerjjdahfymkok4ma.b32.i2p:0
+slnmute5o6h23ldim34wro4zh4qa2pchnskmdpek2nzc7u5oz7jq.b32.i2p:0
+snfinsblh4j4wsv2n5kmkfxbvqzcei2ryfyu4heqy6u73mosep6q.b32.i2p:0
+snsw3ewf7wjtwspiuj33h3vtxnybllurzcwm7u62iutf5phoitkq.b32.i2p:0
+sooo7ajo74ajo6m2yomcc6jcofdgkdoyjcbrpl3nyvvusr6fw7ta.b32.i2p:0
+sorobw22rerrhpx5t67joyqai3ou6xsvqxb7wdomtnwnqztm4sga.b32.i2p:0
+sotpvcqqzzmty6llimwlvknqsdcypn4wsnwk677kepzmy76w2gqa.b32.i2p:0
+spbb34lslk2tldwzr4ydi2culk7sxgl3imb2gg746xbxqqcj7vzq.b32.i2p:0
+spuaa2y6qsaywypklz7itcb5klesogef2x66m4flws2r574qjc5a.b32.i2p:0
+sqjjqyrhh45jpgfp66idiirgh5ck7f4s76ee2l5bli4obsotu7zq.b32.i2p:0
+sqjorsqambyienumg5qpw3foftkp44vpsd4lwklgbl4lag4mm6gq.b32.i2p:0
+sqr66feh2g3f6bknt2tnltmnhqdkzoq3jhdaatfusshrv6v2zhma.b32.i2p:0
+stltasmf4b54srrjb3mf7hjtjvmvvms26btxakccdtllgrm2qzgq.b32.i2p:0
+su7d4biurihkyr3qeea7makkxzikxr5zi4znvryh3bjespppfhxq.b32.i2p:0
+swmtaospvaup7me3dvzlw5xoeohhj4zn5q6agivif7kxtseweriq.b32.i2p:0
+syhxehvl6rublw6k5ysmzcsqrzdsnd7eqrbwalfkvhgfccpu2osq.b32.i2p:0
+sykjw3jnb7n6bo574wnpiaxhp2nm4gc6hc4jh4v6trsbpboysooa.b32.i2p:0
+syqxyl67b4hdo5u3jtkkzsabccvtjaerpushov7nrc2f42x67fja.b32.i2p:0
+t2e45js4dn4cfsyyevm26z5ltvmu6lftxziji4fm3v4v2t3ykaoa.b32.i2p:0
+t32qcc2tbjgqxrydr2txgm4ahhhae3zkkojmguehw5gsbtrdvxsa.b32.i2p:0
+t43qqzux7ik7kki2rxtillcgbxrznuhjac7wtqh52sqovk5ay3xq.b32.i2p:0
+t4notlid4bejwz2tzucpvednkeuskenpnu5sqcbdhh3lqouigqxa.b32.i2p:0
+t5cd7q36no6doxduuvk5psdx47zl7ousnckjgw7c6zr3o3ke7ffa.b32.i2p:0
+t7gbmefspnynaezmvx445fjapp24pjjf7wx3evpwlmolzyu3wi5q.b32.i2p:0
+tanmhvkoyd35kf6a2nhj5rmbwpt3shc6thypsle45my565womjya.b32.i2p:0
+tbqehmm3nuuf2spwsjobrc4hg6uxji4mdelivhywz4b7f5lv6rka.b32.i2p:0
+tbrjczwl76v7ob6hon36z6f35otpv5g467q33pgzyyakp525wwfq.b32.i2p:0
+tcx3ftsdl36ukysuuewydapdzuu4alewyg22squei2wda4a74tba.b32.i2p:0
+tetoqjagsf7fpejajiwm4rosqscy5huqbz5hcqgfuha5tdfnlrnq.b32.i2p:0
+tf4tozh5unsgyzpdsmrdcpbgekw2agu7tp5jvyclzcs5kjudwwpa.b32.i2p:0
+tfuvti7yonn5pjptzzvpshh23x4rqjvm2usolrbnlu42laj4mhyq.b32.i2p:0
+tg6goh3flzmcer5voft2nf3tudm7ikyez334zry66vqxmc4ieixa.b32.i2p:0
+tgt7rdhywtlwob47flp6ccq7prrbh4ipnwm3xszuykq7be2pksyq.b32.i2p:0
+th3dj5sqw75lga3tnffbsywajxafv7cvlb7sed6w7q3w3sxuqo6a.b32.i2p:0
+tj2upmck47iktfh4vncmyajnkbatqglqzy4coqef7wioor4hbsjq.b32.i2p:0
+tk63xbzug7def6esivofwq2h2c53ar3ot7hsezdq3amxqqaoyr5a.b32.i2p:0
+tkzuysa4lkad53cywbt6sgpcndvvvdkjeatpkwyfweorx7rfe3ba.b32.i2p:0
+tl3xkknuukvyinyhvt7saz3tvz24ptgyqtzy3igygyfapcf2o3lq.b32.i2p:0
+tl66bkfoqu6eameaqtlwrvfttyc6xj3s57za3hd7omnfnjg3i44a.b32.i2p:0
+tlfttkbshrcixu6i6syntl5xjsoh6mtgfpix54knahyeuhlju4ga.b32.i2p:0
+tmmjmcrwegjke5fzv2hha2wkis7l6xdaa7fkq24ge5rbvqpwxzpa.b32.i2p:0
+tobdew6554c76jhrulcd2ssgvef7dryini2xjxem2zushe37ycua.b32.i2p:0
+trucvlawpufrszky4zzhhxtddnhio4mnqawzc47n7kik6i444m2q.b32.i2p:0
+tsfr6zvcgsmw2ekaxqqtkdrnbib5uio7lgmrtmscrvwe2d46g7jq.b32.i2p:0
+tsrlbxayhihugr723z6rkyafglnhcyzi2zhojzsyfdjsqkkd53bq.b32.i2p:0
+tv3x4kddbu753tnlghgh3txogp26tlydt47rl5scx7eoxgnocf4a.b32.i2p:0
+tvbutrv73xhwqbtosmbp3cesdyc5bbtslay4gjsf7rzdx4ztgzaq.b32.i2p:0
+tvotv5p3emxxnti2bnvucbfy4to7gxptwvh4qznuhy62hghnju4a.b32.i2p:0
+txpr56jvbf3lmqgaozqdqzgckfpugzyd4cwplkjootvf3hk42ibq.b32.i2p:0
+tyfkhz6ggpi2rykez3v3j5f3evnjxfoau7ve7m2heaukrcqiui4a.b32.i2p:0
+tyvsuqy36cx2yvf7jhnkd5ojc52g6vxl2rw5qshqwpk63ptovdda.b32.i2p:0
+tz5txdipkxcnydzcsuqw47qxdvpob644u3cttlbrbfg3zp75vl7q.b32.i2p:0
+tzudbbctweb7rpnf2vswuw26j63ysqztsbt7lfpfj6xautueiklq.b32.i2p:0
+u2tnrysboqqwjn73awg4hfxtfjgbqab6vrdgyu43s672jdcanhca.b32.i2p:0
+u5ixxcd6slvzxouj532njusx7ec4wemrfwmg6gwltlnkruubi63q.b32.i2p:0
+u635477uxqs7z4uvwx224u6ojn3c3ewcb66f3j7qlbzqyrrevxja.b32.i2p:0
+u6wrw47yfjdzk6a7nc6c6scvfokwuqmvuhxehqvymrv7owiajxia.b32.i2p:0
+u7uklnwthbrynr3z2gc3yxfmi5yoemsugjbb4nm44x26f25vxp5q.b32.i2p:0
+u7ygn3heosxu6l2die34y7wteexfp6h2w5j3nhr424yoblysigyq.b32.i2p:0
+uags6hm646f2qsyqfhzjt2xlnjqbiopiodghywosdgz7bwtbggta.b32.i2p:0
+uc52rzz4xu5ikx6hl6r6sqxfmiyyxsffpcu5frrtepczidwjwuha.b32.i2p:0
+udfxh2r5yfu5z7ynzacur7p3g7ug35kfa33ghes2bazpdivxlhsq.b32.i2p:0
+udkwqdo5odg5npn52rueipghn5omhvojthzdmvcvuomgzglum7fa.b32.i2p:0
+udzbx5jyvrp4g3iujlca7jnlaaaa5m3e4jv4sbr7tvp6k6cdjc5q.b32.i2p:0
+ufgoaa6g746zzpphuvxuomuizkyfpz45chqta7skrywqq6cjbqna.b32.i2p:0
+ufittrlr4eautphuqzuotc7b3xx27n4xgy5afm4foc6nsv56q7ka.b32.i2p:0
+ugw5zbhs2pvsgxieklmc6z4z6d5cvyux4pctpf2udhjgxvajot2a.b32.i2p:0
+ujg6b4cyxhi5pf4puwvwupur3iddm23uibapigpwl4bstvlt4cva.b32.i2p:0
+undzufsjeb4qlf7y5llh56tji6zlhtshlsyht4yjdsa2k4ayx7vq.b32.i2p:0
+uobwophnzqq4yhpp54aisud5ojgrxq6pasmq4aq6qw7dhgjcoqpa.b32.i2p:0
+uodycjdscpurlego2nrs7ptoze26p6236t2r2tax5ubdgi6duqaa.b32.i2p:0
+uohuxnjd27cftarbf6kh4czmotwvstpon2sgs2vpffqkgmg7guxa.b32.i2p:0
+up2kudwqomqrwvfognnhz2mjwqvkgpknfyscp4ue5ioev3q4jd5q.b32.i2p:0
+upme7c64dwjgbt7w72yf5ydl3dyp25dtenrkq6z3aw6hbircqzsa.b32.i2p:0
+uppxodf6bz3qibvpzzvtedl5lk3h7fslrwmed2cmqvdpgtvqkv2q.b32.i2p:0
+urqlr3cei7pp2cruga4txxmmvel3bh7nsbqzqzpe7omvmbm4v75a.b32.i2p:0
+usgqijrwhtwgoekjcr26yqcgpncwpsescrr3eek35e3rhkrtptoa.b32.i2p:0
+uu47uxdqqtv2pqorbaxnhhfmcsxmknvpreambqqkosr45b44h5ia.b32.i2p:0
+uv44mjoqrj3m3gzz5wxlnszt5pvgk3iqlc3pmqfe6un6gxays2cq.b32.i2p:0
+uyshm6nokdjyq3l43224at2rigpa4zmiyybuufyq22t4l65ialmq.b32.i2p:0
+uysvdsh2bzicmdqqdl7ezuftxcywzapohbzl5ap5hyiinki354mq.b32.i2p:0
+uyy4dbfyx2i2x3goobc6uxj4nb7ktzsu72zlksypjfisgka3xnta.b32.i2p:0
+uzgfmsjcbjxitt6bed3p3gpdzviyop2rz3cxqyu64ec3z2r5imqa.b32.i2p:0
+vbzp4sjkgqwymn2z4ikbae7rv3clbo7vv4mwv4ft7tu7ubrmbeha.b32.i2p:0
+vcksnyuyw3i6hfviob5yzoynq7okxi677bw7224273fjhsk2kgra.b32.i2p:0
+vdpfoahxse7cjciw5l7ffbwzc6e4xdlf5ulvrk34mzm2gy4mhlwq.b32.i2p:0
+vdv2aitgqica4taqcmjexw5xfbrfbhvf5kuxwvfjf3yiki5a5cjq.b32.i2p:0
+vet6qwwa74jrqrjzcm7ylfprzwpnt3hlzjvkbnaoiv4o2zzkr3sq.b32.i2p:0
+veucihmd74nnumiunvruyjs6kpjs5sqw5dprldlzcf7i3h4igkda.b32.i2p:0
+vewdrismzwnlxlvni7slpq722wlwfami2elghudm2ofcjhpjcs6a.b32.i2p:0
+vf3l3f5unlwrfmr3fiphpomgslxgm6m4chg72itf45yfu3brmy2q.b32.i2p:0
+vfpzasrsrqh3llkudmas5fymwn2ohswqi3vakclgm6fn4nb6s5xq.b32.i2p:0
+vgkou4ysuxvhlxrwf5n2ihn4ffyvvedluun47l6dobi5ycziy3nq.b32.i2p:0
vgu6llqbyjphml25umd5ztvyxrxuplz2g74fzbx75g3kkaetoyiq.b32.i2p:0
-wjrul5jwwb4vqdmkkrjbmly7osj6amecdpsac5xvaoqrti4nb3ha.b32.i2p:0
+vj54d2pkdeqvcuj5ykeggr6jnhhnmq5q6qe7nttvb6yjetweadma.b32.i2p:0
+vlwovj6fxzvtsypnmslocootmphezr5txanyfz2gjhn5lanrn2fa.b32.i2p:0
+vmatpbu2vf5p76k2emzg2tjyqi6p6yj3cl4z32ncdhz37ubprkha.b32.i2p:0
+vmbyttxf6sw6ivdamftxung44mktqb4vphmm4lqzdqqpcmksterq.b32.i2p:0
+vmoogdd5lztt5wpzkwhd67uwnvpupye7ycsbz55jl25sueowcxxq.b32.i2p:0
+vn5rsr26rp7yxrqliq7vo4zb6aoichaybd3urvc5eedaspxjp3la.b32.i2p:0
+vnxjmzogakc2a4xn5w4qormiqt5khnjptnoaro74ehinrv4q3yga.b32.i2p:0
+voi5u3azhajnt7476tcikl5mactxcvtsbnrzixwkj62qhpaw5ujq.b32.i2p:0
+vpevx6tl6ma6mnlj42d4fke57en4v5r76yx6rcmhtvw47guo34uq.b32.i2p:0
+vpmkctqhkdqgkekt72srqm4sqaliug37uq2wp2ywady3p235cpaq.b32.i2p:0
+vptzpxba7oys3w2htjgh4uxogaedursdh2yz5k6e7yh4b3pokuna.b32.i2p:0
+vs67sj5crkcjo7m74tdunzefj6ahgrgohs6egj5jxmneszwaoo7a.b32.i2p:0
+vuqk76jvxfk55bkovqcmmkvycmndee7j3tuv7ezdb2slrfpjyvoa.b32.i2p:0
+vxokhkidetjp4tjrj7idojx45hguhnl2azvqnbulougvdkstf3ma.b32.i2p:0
+vxs2es6f7uw2uuneslb7ipvmg6kqh6ytpjezoj2ptwx7od4jqmxa.b32.i2p:0
+vziy2cbrbvliqpi27feak2hiewovxtlkqppsagtaxeib6nkonknq.b32.i2p:0
+vzqowkd4aoyekapcskylli77aj3e5fomixsjyiawnldzj6c5nxtq.b32.i2p:0
+w2a73mo4grdgwvkzdsh6nyutagd4bmywywacxviodw7xnof72aoa.b32.i2p:0
+w2mgaza75amrvfocl7wt6v7eimprlasuj3bi4xezdr2wyqhkxzwq.b32.i2p:0
+w2zi3xos4jaz3ft5yca2x5zf34esctpmzqlqpdrqntjmi2o3gfba.b32.i2p:0
+w3hyqnlueb4yv5lkzj3wlnrjp7fzpxnig6x6m3w5du2ptfjcm2jq.b32.i2p:0
+w4arykcvc7eckzuqr7kvs2njsjpknzb6vvsodpyzp6tvu27bzoka.b32.i2p:0
+w4k4gm3chiyskfzshilxjchpgtpx2xmc6euvkyzkyjvzvdbqroma.b32.i2p:0
+w55r4ykzu6qt6uhp33exqbqmlt357cts2u2zoi7hkuphqmv5iupa.b32.i2p:0
+w6jl2gubyscdpubizes5bp6s42cito4k27xwcjwh76rvuik2prha.b32.i2p:0
+wacfewi6ehmfxvftxqmracfh7se2t7ozl62u4hsuyd4c5xfzuajq.b32.i2p:0
+weidpvshind3dnblwtb4zpssazeenkf7a63favavkc4crhqdk76a.b32.i2p:0
+wgrbhqemtf7qu4c6acjicb7uyee6rlinafyysvxc2yocq4t2ilca.b32.i2p:0
+wjfukwyohljaxgv4woewdtpoxi3q6hnwcnefpgrtif2kqfrxslnq.b32.i2p:0
+wlepjf4lxs4e553rtpoys6kqp2ozcv4pqjwzoybawcl3zhrdvz2a.b32.i2p:0
+wmly6cz5j54w2g2gibnhlpvuhh3bky26cq3a5jy6dp2hg3hc34oq.b32.i2p:0
+wnp26nyphqfmq3udocgcwenpsgfwk4ssw53st4wvwt6mwf7wm35q.b32.i2p:0
+woanasilvwu3yfurvhvqj3lxd25bzj4fxwy3ef3qjbso3cozvyca.b32.i2p:0
+wpnewole7fofvwvrvkkgf45sgcverlodocu7fstm2axp5jfykraq.b32.i2p:0
+wrqu543ssub7kiwzfug4o7m6lc5ibmaamdc3o4uo6a7ntxiqzd4q.b32.i2p:0
+wsbf5tpo7ecsafusflyym72k6tbyclgvqav56qafvyc4j3spzdoq.b32.i2p:0
+wtfebbwmsxoywu6nw5cowlxqhtokxrxftve2zee6flvrpqg4j6ma.b32.i2p:0
+wtoh5v7xm3wx4rqutbyvqaixybwlprx5ua2yiv2gac3prria5emq.b32.i2p:0
+wuikfwkext6lbl6urhoysr2abcyff5lkm2ojr6mfenqq25nzlluq.b32.i2p:0
+wumjwpr45uhvtggq6jkzfda47e4iqk2onizw6vn5po3bd3uqcduq.b32.i2p:0
+wv335vkr73gsaza4t6foqypnovccubvwfsarkmw3xtc3t3sncmya.b32.i2p:0
+wvktcp7hy4l6immhi5cxyz2dlsbhhvtcmskjemrnqehacnoap23q.b32.i2p:0
+wwbojywnrcf2mci7f3zgbomrukcm4d3nv6pttb3dohjpge2sz27a.b32.i2p:0
wwbw7nqr3ahkqv62cuqfwgtneekvvpnuc4i4f6yo7tpoqjswvcwa.b32.i2p:0
-xfkarmvk43vfkfvhkehy7ioj2b6wtfdlezvmlakblz3q4r7mccfq.b32.i2p:0
+wxfs2ccar4szd66dlmlijh3i3r4muehqjxjmabwbb46cq3gpbsoa.b32.i2p:0
+wy2udklgydh7iknnffbzvldoiwsct6dy3o7fjcsjcdjoq4b65vha.b32.i2p:0
+wzui6sc7667w7aabs6iebiex47o7cysxpryfdaltaklw2z2xgtuq.b32.i2p:0
+wzvki5234ffqhri26fqoxosqq3xengl23eoitkvip4mp7aipo3lq.b32.i2p:0
+x4cetuarbwiqphebitvgv4x4kzh6yhyyvu5c4yjlm4jsyl4bvs5q.b32.i2p:0
+x5qtgyzzgkovoko62l6n54p55xma5pbstbp6t6xc6hbugxz5ck2a.b32.i2p:0
+xasewpiqpzhyggxwsajmnkrppi2ozmapqv6673zuuymoueq67tla.b32.i2p:0
+xbetybs3nyeykskasolpatj4qrfnigz7a2bx7wcsyrniqd3usnaq.b32.i2p:0
+xd2byhr22rqkawocapbxedovmifyk77qrh6br4ctx7ny26hpmusq.b32.i2p:0
+xdoonpwnxhr7sjoyca3lkqsapmefd2puyar22ztocod4drjju6fq.b32.i2p:0
+xdq2g4tkaukzcu6mnvdukchinma7koi6c3noflpjabrzjrgeumfa.b32.i2p:0
+xegcohfrnnnuz3hdmb7r4e6pzxbmtg466n6mty2oz3tcoqutxj7q.b32.i2p:0
+xfyzfugo3qtfpq3s5zccbbqrxfkgy3ttlqhz6t6ovmtgrsuyce7q.b32.i2p:0
+xgbz5vpek6vaeej2zejxrjloqg2sqb67gim72qqpodqfq62rflvq.b32.i2p:0
+xgqzxudkvgbqwosaha7zb26jgza5wb7m66727rk4v2zj72xgg2ia.b32.i2p:0
+xgsk2huqghiftyznr6llr6ztepo523hiwqscxjpawcbme7xtjrta.b32.i2p:0
+xjebyiaydsbb76gqzetsmccgh67oeaxt3c4mkwmt7gjlfym266ea.b32.i2p:0
+xlfxusgnzpmatutaredcvx27zoiecno4tpxm52jicdvn4sr5dyya.b32.i2p:0
+xm55wnfhgmsy4wz24swjs2ziguheut6y72kht4ytwyfdmjsxslnq.b32.i2p:0
+xnb3pxtmai6ofbarycclwwueaarn4r3zt3zgkeepo4pgmswqvfcq.b32.i2p:0
+xnvsgbonlja7cmeokr2msvdelqlasbkwgqndqg7eakw43t3m465q.b32.i2p:0
+xpqubs4ftu7ym4xwrirlz2e36gvyjkil3chvq74bj4lf7djcrw4q.b32.i2p:0
+xrrx2rcpj3zefshtt7kamz3uflnwebpv2gkgd6vlrdazxgln57gq.b32.i2p:0
+xrwuqylcgkr2ovsf4pziosd27ywd7pfaohnreoyzm72qlnvoktrq.b32.i2p:0
+xtxh4wtmbjls76wxnehe57etubuqvsdiunwgve6kwjt4acwswnjq.b32.i2p:0
+xud4fgmeq4hl4cgsbjn3ubz2iyjguogskn7wreesvpsm3ib27kpa.b32.i2p:0
+xuivvnpcj2rhsxmkyyjzmyq6a7gwgusnqwdklgimamvkzu7rnnmq.b32.i2p:0
+xvpzaqftlfx2etqys733mndm7jr3l2j3if3wskfljzaow5s4rrfq.b32.i2p:0
+xvtvmaele7ns725mjaowsajpx4bgfecburyh6pqmdnn37cq7cs2q.b32.i2p:0
+xw6ble42juwkfrjetb3hmk2ep6jnyufhutoenyrou6ieoqiomw4q.b32.i2p:0
+xwlkpubkvsdsyaeylqfmxfk43juk6sz3hxnmwe4zencjq77aznea.b32.i2p:0
+xydzqrwggskdbmeqrhgt6alroglzbkcarzdlhabmvrszm5u6cfuq.b32.i2p:0
+xyhlemqmoeusqbbzr4oqph6kgmvm3a3lrbuanxkmyetwohxoynna.b32.i2p:0
+y365lf3vlh6vg4rs6trnjc4ia2xqplahk26y3tyqjly2q2vpfnqa.b32.i2p:0
+y3equ2tc6zsxqtndugsfzottuenfgxnl7eqgadmnzjkoigxvseka.b32.i2p:0
+y3occl5rqc2mz64esu5mqzoyfzlbxop7tttf2b3gyxjust57txfq.b32.i2p:0
+y45xhqkb43ncokfwhsmr4z6fwykuit6o3p2kbso3emv7stpiwwoq.b32.i2p:0
+y4njm6ftdn562q5thzd3fvb2f5mbi6bglmyupukcmcpt2tuo6slq.b32.i2p:0
+y5wr2bw3rt4rvw7hqqj7qtlf7vdds6zk6cs3mu3myyduasieqoka.b32.i2p:0
+ybjgylnhvk3fzyacxvyh6dwvrh7lk273qh5qws7uquvrhhwr6rka.b32.i2p:0
yc4xwin5ujenvcr6ynwkz7lnmmq3nmzxvfguele6ovqqpxgjvonq.b32.i2p:0
-zdoabsg7ugzothyawodjhq54nvlofa746rxfkxpnjzj6nukmha6a.b32.i2p:0
-zsxwyo6qcn3chqzwxnseusqgsnuw3maqnztkiypyfxtya4snkoka.b32.i2p:0
-zysrlpii5ftrzivfcyhdrwpeyyqddbrdefnfu5q6otk5gtugmh2a.b32.i2p:0
+yemrkyqmjzwwn2yast2ga6dcnsovnxwip2rjpid56grdg7itugpa.b32.i2p:0
+yfplj67xwcblbiu4ozddmzlmjl4ifa7bhkzzu6fu6jkoyqui6v6q.b32.i2p:0
+ygtc5m4mh3qhi7tct44gxqbenhkasp2y4ydjn5qua4l5vh35osdq.b32.i2p:0
+yj3v3ocgldnackxptsjmwasa4xzxj3it6rtuhmlpxvwlq5kmyytq.b32.i2p:0
+yk2srkdlbm7kebv53dx45ss7q2fjcy56m3gywqvw65eya7co7hgq.b32.i2p:0
+ykppjmwunzqzuuqc6qqsijomfzdgieeq2mkidapc4awrww2ninbq.b32.i2p:0
+ykv62rivlxurq2wkecagzs76tulfor765c237bsjn7jt4436kn2q.b32.i2p:0
+yllvqk2utimxjtoyzk7l24s4n5sqp5dbn5vwsbt3g3dd6h4dxseq.b32.i2p:0
+ylpyfcs24ij67dkl7ighyou4z2gpfhjlt2iellj2ad4ddrxci63a.b32.i2p:0
+ymo2cnldmstzqlsdhx7kurii7aaffrhpgafxlli3s47pzbfe5evq.b32.i2p:0
+yny6zqtb7qve7wwfctsozhzhbq4hyitlqco4uhc5q3rvjex77oaq.b32.i2p:0
+ynzhhxlieigtmj6l7f2dq54ypnsaf723au7o3uhnismlgnkmcqjq.b32.i2p:0
+yof4yvv4agwhfmicj5u2drem47nvfkihnp6bil7ocg65gydyzzcq.b32.i2p:0
+yojuyryq6vfoy2mftrdmybmq2hjefuzrwmpqqfvk2kd5hptgr3qa.b32.i2p:0
+ypbq5aleoqqoxto4tkxlmlxh2hrstjxzpgonj3lk7dzweahs3hhq.b32.i2p:0
+yql2k4zjl64dtybuculjgg4v4u6sje4smnyay3vslv7irrigzxka.b32.i2p:0
+ys36rtuedg44sahelbysqi2mbc2l3rcfdy33zdvhvfkx5uocacba.b32.i2p:0
+ys7np3pmfhiyq3z2rcoeylb7agfbyfuhhp7ky2uzvvuzswad6cia.b32.i2p:0
+yuqb55drzrhxfnvobycxqau47kibaaf4voamk3kxl77xbb42xkqa.b32.i2p:0
+ywfauauaekbrxgwaahcjzifemzdq26xsshw54sg4bpr5z74scwiq.b32.i2p:0
+ywpsgu6nlnf2l4sy44tit2av7hfzwwttbjvwbtsbtqur3awiax2a.b32.i2p:0
+z34pw5tlowwi3gpj3ycb2dptgyuq65bpj7w36xahslgikggo5eaa.b32.i2p:0
+z3j2xshl4tpbxaybcprhzq7cuz6urboqoxvvpnfriv4n2lq72jsq.b32.i2p:0
+z3pgyfiwfzcd2g7v4rs6el5tvc55y7a3tai4gcbpso6flaejckea.b32.i2p:0
+z6mlyrxcjddpcaoumxnw5peulnkvj56hgwqmnc5adoutp7piujaa.b32.i2p:0
+z6xsstyq4zynzvagwv3wr7htz4vxttrotzb5izefotlwqm7kjtua.b32.i2p:0
+z7cjxpy4taui2ka3ekfqtoumsb7pg2sok3wfey3m2roeuppcrzhq.b32.i2p:0
+z7cjzfmv6wadjguzaavu7pfsqhujbczspbf5sxxrqndeovu3lt3a.b32.i2p:0
+z7gkesbkbl27lpcpbnhgfofjz5fhnvljzfvyydu7ky3odzdqs4lq.b32.i2p:0
+zafd45c2hzd4w2t24qtjqqbqm3z4hayb6vadj6sd5oukjyij2ara.b32.i2p:0
+zbkqcqtiiw4nwsds5pjel6alr5i4hgiyqf5giwurdygfysacru2a.b32.i2p:0
+zbz722dh7rvu6ugdydmlmtgfyc7rnpeslae525c7mhr7rgsekjba.b32.i2p:0
+zcwgqw7hlw7437a7au6n6obljdb4arnshoibdqo6voree4xiznoq.b32.i2p:0
+zd4ns4zcyvgpwkioftiiftgj74n6mf4m4ieq6aedqaznmdi6rhdq.b32.i2p:0
+zgwseerxwqnid3zhculzuqbkhghthsbvsbnqowredostfqlvawsq.b32.i2p:0
+ziehuxdpyg5dvvnzedmcqxszdcflsrx6fqmgzb7odefqwqaxrs7q.b32.i2p:0
+zk2r7kzzigzu5kz67xnrbe56u5walngylcsk756bkmt66cmeeydq.b32.i2p:0
+zkbjgfp4ouockpsmpbdyli4ilo7f3lbfjsboay3nf47ymir2ldrq.b32.i2p:0
+zki6halesukhfel76pziutgica4zrp5qtbmlmgyqf6dnnomk7hja.b32.i2p:0
+zkij473aummp6rvwvi7wbr5iio6xu2uh4rophbhyot37uxhrygiq.b32.i2p:0
+zpvqqdrcnagad5ayutf7hkp6prtvrbmknhqdul3qweft7oa5ikzq.b32.i2p:0
+zqft7c6riv7aux62qwe5xfqki3dcb4urvbfy6m4wz7f46j2us3la.b32.i2p:0
+zqhoqgf3enj2pv74sjov6dthpr6jqafw5qqzzsvnfdqzycychxpq.b32.i2p:0
+zrrki54mn56fytizkfmhx7eubea37padxa3zliwq6gtknrsxv2aa.b32.i2p:0
+zsfpcnbk4g2bwxl7yy5ebrcvlxd5gpcxatewdrgpige7oqykunwq.b32.i2p:0
+zszq7enaxbz5p3f3idhfkkd2u2ygpeqwj3o6hkofffcmllnymwqa.b32.i2p:0
+ztr3c7qz6v4hrnegmkzjsr52wyi4u6ery4m74sk3m77oup2ws4ka.b32.i2p:0
+ztyxbjae7ucfyupxpy75jwpzdktg4gbvhl43nh2crwqrx2uhveda.b32.i2p:0
+zuamj63ad73jmnw7xnxrmjsbjg7vg23j46w3mpc2udpcgjfkcqcq.b32.i2p:0
+zvchlrjuzqdlx37fhibhnym4y6p56vtlymujjuzhh2cp34yqfrtq.b32.i2p:0
+zxsd3fqczh6ddgejc24nnmb3ww7nalieq3a7cs2mqiy6tmff3wia.b32.i2p:0
+zy2ywvyqds5bgdoo4tgbu3bwjp3ygyn3zfuby44jemc6xa6fbwta.b32.i2p:0
+zzre44vh766jgfordw2ehu2r6p44j23uyovgvm7iwuhp3g5iz4ca.b32.i2p:0
+ycdw2e4ufgfwhcqna4g3m2qsvaly23ozaexawcj3x4gtgcehgwujjgid.onion:8333
+ycfvedulkprd5bmivqejur5aptcs47daqtcvzotnnhfvwu3o6gcp5cyd.onion:8333
+yck6l5ffw6oszgtoc7et4fytvp3sqdf5awyky4tlpgem2n4y6icxqoqd.onion:8333
+ycnepnzktkhfysqijlgbjk5awivls3eiqb5kjudotjvnvlbe6ah2k5yd.onion:8333
+ycwrrabomoixkxggkxldyxkqoc7qqy2t5wxcsxjgodlvuydwch6dqoyd.onion:8333
+ycwwrwkqibvkftpc5kyqs6nf7hrzetrmqgwo4yae7bq5otvubkfsread.onion:8333
+ycxjdh4jr4vun447cdszcoge26pbdnqblfi2osmk5e4uqmrigw7y4byd.onion:8333
+yd2ami3rem3i24q2b76l4ujyq343ycrowrthwqycvpcsofgpwlxyryqd.onion:8333
+yd4nyusqking6tkcwmmopznlxhyfhk3gsw265alz7vpo6toqg3kwn6yd.onion:8333
+yd6b3wtmu6bz5km7hw645omyv65one627xech7f3vnlwkblsvqdtmiyd.onion:8333
+ydforbx54mnz7g5u2mu2ulkomvakdbwxoad6araknijb2i47gkfeh7qd.onion:8333
+ydiqekqpcf536w5uwsdclw5pt4n2fkz52fo4vwdducc5t5l4ghqaxnad.onion:8333
+ydl5kqr2auvie5mtjkm37hzkqh43pobibty4msfzkbu4junpg5gak6yd.onion:8333
+ydojumivjpins2lwgql5xaywbngrmw56nvmtalvfiy7sr42ksvr6apyd.onion:8333
+ydvbxdzs6w5wefifiqsqntpbd7tliofenqih5hlnz34546fvy4ab7iid.onion:8333
+yeat6ea4esvd4nimhg2rcb3ghpusoqzjb44alb3hhdj4d2nimn2vpoad.onion:8333
+yeficzguf443sojjdcmh7lzk7l6y43a6v2jbyk3x2w4n7xokjs4crnqd.onion:8333
+yefjaylovpdhbb5b5bhjx37digt5u62lmzyc54ygtabwdphm3zwd77id.onion:8333
+yeghpcuryadlbxzk6o3ujebmfuumkpoi32dr2ctfmql6vqn5wjioehqd.onion:8333
+yenw26f3i6kf5u2nad6xligxk5iyizjvl7msx3pzjcatiesogdef4zqd.onion:8333
+yeoadueo3ukf6s3fetywtbvgmpvrtkja5rlp7wcp4aich6tfhh35giyd.onion:8333
+yeqjrnnuf4fbgzik74qfhrohcymj7ccbze6ndky4pe673chfsjconfqd.onion:8333
+yernmfgru46g43vsijjv44n7m35tpoznnkd2p2wl3uqzkietukxqxoqd.onion:8333
+yettfzp2vanmkehwxeaugotqcsg3wsomcargvetk4nhwnebrpq7ah2qd.onion:8333
+yfgo33tiu6w3nrvnfyw2nmpcwtfozinctn57566y5l4hfcttuvgff7id.onion:8333
+yfmujam6pa75vm7p5q7gvgkocqzcwm7lgbnodwtmzfw7usy5dvlgqyqd.onion:8333
+yfpqwz4qogg2r5sdweggggz76pmhxtegnisz55urw3egvcq2e3amvkid.onion:8333
+yfpucmv4zspytubs5epnze4xc4joqny52s7ifjk3vu644axwkfyfurad.onion:8333
+yfq3sexjxzuww7tnwc7jj2ethiu5f5r65ewpy66os3ozhoeje7na4hyd.onion:8333
+yftuiua74fspnqanvait246qn6vmab4aoympjd3omppu46jkq777axid.onion:8333
+yfxz53gdbxu5hapg3e5kaa5pyxpbrpiql6j7sfe4i7fqj4blpqpufzyd.onion:8333
+yg5xbesziuiaigwyxjrn5c5hvj6fxef45edl7pir7risnr6un6esjtid.onion:8333
+yg75fc53cicbsarrpfv2s4crpkx6vdjub4va7cvbducwzhsf6qehx5id.onion:8333
+ygczn2llqhks3ohxvfck4ks45ekg4xr3loriyynnejw2jfmi7hjsfead.onion:8333
+ygdfwrg33s3qwiarwxbejalkirmqui3wjz7wfccprjry6bm5la65vhad.onion:8333
+ygh4hx4ugapidwxodkjr6vgl6vkaqvievk2eiie7v3ewuvjvg2mzp5id.onion:8333
+yglvvnb3dk2vh2wwgpcnvm6t4lgbdhnvpy4jfj3ee4ugb4xzvjrrcfqd.onion:8333
+ygospbn7dc5a6haqur4eoe2oj6jttjohs43rhl5m22ltruh4fz5isxyd.onion:8333
+ygowwz67kvvri2lcwknsc5xjdz7ffat5tqkm7fmxrrzfgvqnxoxkvgid.onion:8333
+ygwuwz5autfc4tqluyuoebghc7f6lgjykm6oprynh3h2vfp4xmhiapqd.onion:8333
+yh4edjvpbo55vsankh7e33u77ep7eah5h5gvfgu7t7mbb7kkmjvgirqd.onion:8333
+yh4uoyfzey53dnoj6zm3frihhgwpqfqkw36sjmqsvfnl3rqohs52wqid.onion:8333
+yh5us7dk25ttxkt6miers3bazlm3jiums5nwz6mzd4i6kn5oizjccuqd.onion:8333
+yhddybpp6lgu34i7uurdqg5jznfdajwr7co3twiqf7pgnj4yjgzbnpqd.onion:8333
+yhiswltkrs3upvkrygsuiou5i2njnyxk3gwtsmcr5yn4lfinzifbpkid.onion:8333
+yhjkylctf577degc7ufffvg3gsdxgnx64pdhzfujxjgfhbulmtc7yaad.onion:8333
+yhnzb5pmcbeiqs6bxm3xvzdy2dgblteiswvvtg6vhkum5gjjw7abjzqd.onion:8333
+yhqytulgwdtvozjhuyod2cufnkbh75mgyw43k6w63ah2fzulskfssyid.onion:8333
+yhtxfuf5zxqoqkuodfpmzsnnmtm354y5rtexqplt5l3fkzzksjkkzvyd.onion:8333
+yhvyxjfauptpsjrxrf3oxtv5zlju2gdpitwsabcmj5gdpjr6i4z4ulyd.onion:8333
+yhxcgpy2bwwhhpmgellyghjpkw7cfrjlq6trq2yl3632rxerwbmkvfyd.onion:8333
+yi2k4otmwujg7bi5iw7ewqntnxb26jyplx5xyk7bjvvaut2y2mhcgqid.onion:8333
+yi32omh7hh54oeot4i2ze2tif4l4cwdhzxxn4bzmtqrotfxrepttfead.onion:8333
+yi4gxqy63csutkea3zss2oryz4get22hcfginwcejy65g35ec5t4uzad.onion:8333
+yi4nvghovjd5bzcbhitvezh4uwg32n6r23et633odlacu4eamfym5mad.onion:8333
+yi5x6isngj7pivr5wt6i3drntlqsvbzijpdy254lbjdnihxmfy2cdgad.onion:8333
+yi6umkklbb6vr4j75buoss7kqkgcsdsx5fvgi57h7j5bzuleoe3ae4qd.onion:8333
+yibgffpo7dimyvjlbzfr3dnmnl2r5hbrpxbtcpksthsko6udsrk5uzqd.onion:8333
+yiiyiuwns45zhmkwi3wjumqhnyfkwkahbggd6hrxtnrxfqwn2vdx7pid.onion:8333
+yijdxmlgnfcwrb5zxvchjhgtc5357mecuopminujkono7bwjgqu4acyd.onion:8333
+yise75jksg27th74bxo3a6rcr3huvromhmuhnmy3n3ngcgfpagq445id.onion:8333
+yised7sf3xzsnlggeuioas2of4crrllkpz2gfbdy7c5cysa5sxi23lad.onion:8333
+yisvuvmqtn7wht6dndrqzsdl7vuspxwrmfwwu5o7wldnzn4mbzeb4yad.onion:8333
+yitceyo3wv2mk56omv6mon3n7dcfr7jiggdmzlmtikpoam2otiey64yd.onion:8333
+yiuesqqc73nn7kxadavmlwc7ymciszzk7bxs3bd4fwucaocme6qb7lyd.onion:8333
+yiz7d2lkgk2mftp6i5e2tqhotqkqjgxbdmzbnflwvsioyfydqrvll6qd.onion:8333
+yj3gs4nvumsfztawn7ku4cmner2zlmcn5kke33g4j2vywxsrqmbd7kyd.onion:8333
+yj3q4iustxfcq4bisbuw3jvqc7ph2ggld56mvyxqvgw2tmsinbwlnzyd.onion:8333
+yj666fxjddvz4xzkhtzhh53wvkiobvildczzxb3mixjipqqiqaz3bzid.onion:8333
+yjdhdurh6vqxuykgmuskpabjzjni3ehxxh3zq5redu5hqdmhdw5b5jyd.onion:8333
+yjkojvjsg6yhfj2ln2bpcrh2e6fr42ul3yzsebbz2kkytg7pf2zzjzid.onion:8333
+yjudzsswyvfqyeth2eghfvegxg6z6ubnx72kmqjljhdewrckw56lggyd.onion:8333
+yk2foofoifxgbrp5a45okwbelrsvycgqgw24xv56hmuqxlpmw6msndad.onion:8333
+yk4sercvyzvqxgbgn7srm6eeivlzoa3t4sz363aygcyciubcieihhxqd.onion:8333
+ykh3t44zjojpj76ouqeo662ljhyc2t6e3mike76iqpelcdztgaxuw5id.onion:8333
+ykkhln6x6hcmhyrx5rxaf3c5auh5k4plrpaisits63r33ecwkmtexhqd.onion:8333
+ykqehwl47hwypuhhuuxkpoexocldvllixqhplpsy6ym65vbjfa3yfbid.onion:8333
+yku2clwr3x3ndzfjdk3o4spoztoqy6ndatken5wopgapg7qkvypuqoid.onion:8333
+ykwrwuffwvaxlwivt3hlhyz2yo5xde7dw4x67ygc4xh2t6m4i5cftkid.onion:8333
+yl2preaby2yqyhmviyq46roapupmnijt2g3mzmvwtxptvybz7rbs32ad.onion:8333
+yl2stshaozpyqtut7m6ln47z2qhledknuwhij6kvxsuaai4nwy6fp7qd.onion:8333
+yl37nyh3vujz2fyrz3eoqoteixyiz3dj5rfnnmrglcgcswzbeqbjhiid.onion:8333
+yl3bo5zwwsg5dbhrrcjkvoyvwwxp3kbdgprhe6md52ob2lra7ynrbwid.onion:8333
+ylaoywooejvpfosewxmyxjhc2ahfepjbvuyjc4p7bymwirexlkdituid.onion:8333
+ylaprgwti4dsumx5xvlhul3esf3yi3ebyyubb2dwfgwe3zysv3e6nyad.onion:8333
+ylblnrd2jnfjtustl6yt6pix4mgqr5qqoevunmwk32e6fxq6uj3dchqd.onion:8333
+yldtx7o5y5jf2utrrtqf5yf56akol55wars2uwxuvjoubustrtmuqxid.onion:8333
+ylh3vliup6k27pt2thw4xgfguiziaosb5y3ovee4w6dzwcb6hc6czwqd.onion:8333
+ylsvnjqrcgatkzj5gfkwt6cz236z76yvgpeulggzml3xb7tnbsttjnad.onion:8333
+yluwecwlibf5dw2sup64dq4gs4cfdhtkfhoy5cszrvu75wljeqanr7ad.onion:8333
+ylyuglp5b2p65gmiofhe2irpxswlhecdecg7d27qhcwehegr2efmesyd.onion:8333
+ymgyodvztfs4nnijjnwiv6eadetxjm765iv3ryuyhsq4upnjwncpvsqd.onion:8333
+ymiw3d4klephwuwbkgdpllrs6hssb4svcg2um7sdm3hsnnksbnvj2vqd.onion:8333
+ymnypd7xmz2fka2r4yxvq2ibf7rvdyl6eemppo74rfehu2d2oqkclcqd.onion:8333
+ympp5jlakwfhj2bozw6w33qailkrqbroizxm3pdfxvjdbrkwtyx5iiqd.onion:8333
+ymrunm2vhoarw7rpo6jdmq4mev5hz63umljki65q2v327vmnw6wjyvad.onion:8333
+ymt2hdfgdxo2awvj2k4y5tbpvapj75j7v34tvvlrqy44lsvvdcnjx3qd.onion:8333
+ymuufa5br75liswfrb6pgm3hc6o67gnzhyg7vpfo2qsw3oyw7m7nsaqd.onion:8333
+ymxea74sswjyqvv7jsh74dnvimcsq4rnao5x5g7dfjnbfy67oj37l7id.onion:8333
+yn3avowdk5cox7qz34s3qiz2u5j2xg3irxckhzikfjv5ccjqrdiramid.onion:8333
+yna4zorq57ehghewlega7lb4zgx3t4lgv5k24orv7b4qcg27svymosid.onion:8333
+ync7fc7dz24s32kp6opdkbvohb74obme4jgo3rkkvjzywslxegist2id.onion:8333
+ynilvzuulga2tlv2hcic7ayc5qpd4nz7r7snsyejp4vxwnxlonf4gvid.onion:8333
+ynkv7njh6hj5xewxxy3gvtnu6ocyvu4tgrl3gnw5xxkdpfshalppqmyd.onion:8333
+ynqgzojvdwv2rui2rlechb22e5hwqipltusdnfkv7s65iz6fgrnybnyd.onion:8333
+yo4ykt7hngppavow7f2sz36ajl6w34bw6qrcfee6i3s6jkm6seove7ad.onion:8333
+yoat2b46hzeuhy7n57gjmfxgppei3xnzdxwsl2ipc5ny656j7zp6ovqd.onion:8333
+yobra7r3ketjuhr4g4cfdqumsez4om2eefvmgxrxq7wxnkouzmcemwid.onion:8333
+yogfxdco264tjbbeek22o26lznu2g2kwvs4lmft3ib3xelndagtf3uqd.onion:8333
+yomwxfciljad63gicbd5757og4lypcph5f5mqdou5kj5rowkyotaohid.onion:8333
+yon5gz4q7soici4i7jf2zaciusioym56jo2bat363tr3peoiurransqd.onion:8333
+yoobb72dyt62n5dpsu3aqpqa3lmfj6gfurno46o6vmqdbpwqw32ahjad.onion:8333
+yotcqynj24k2ckilo54hjhftjuvvwiacbzoraqc2kq5vtmsxloswddad.onion:8333
+yp3juo763dmi7ryhkv3kq2l262cllrru6ks5tlzcdlxdakmip3zosuyd.onion:8333
+yp47gud6fjsvjgu54oica4b3ij4zfreactcaon6fx7v7pfbxbrvqhtyd.onion:8333
+yp6klgnrvisq73qg4dk255h7un2k7pbk666jtzc22rxjs2en64ojauqd.onion:8333
+ypaazf2z3t5dqzudlygjjpyb2uvk63guovstzubsohbbeomometn7cad.onion:8333
+ypakyst4bbhh2juqd6r7xymqnrgwx3eajekpg6o5b4fazccy3mwovdqd.onion:8333
+ypkjkt4dnyqy6svecydigttwnsj5x643w6edk6qzhfo2hkxxu4ln6zad.onion:8333
+ypmikts3saaffj2uo5zmkbac5m7xnbblxkbhpw5xtxbamajqf36wgdad.onion:8333
+ypninar2hybv3jdovr7ax7teq6wpzvrw6n74csq7edos3hzumh2h27qd.onion:8333
+ypoinzgql3zo5d3strpmannbkdtndxkxlajwgcpaj4ngbc5mqrzzgpid.onion:8333
+ypp73pv2vcjfq23ltwhojuremxxfknwtgkxsvwe3widlaevyx34pepqd.onion:8333
+yq7s6pe7jzrzj5uxlorytwxd5bs4kljyvp27akdrpang765yd3sexwqd.onion:8333
+yqnal4phy7wz3lsoi23rziyb56bnbzvvypy2mg5ponzrk63qpyvle3qd.onion:8333
+yqoiqt3molj4ygq44zyme5gdbgee7catlf4ndjr4myiicduuwiev3fad.onion:8333
+yqvhbmvc45iy3drl7nceuhugdt2fevwx4x53zafio6h2626kflwtrcqd.onion:8333
+yrambbqlzkm6o5pkc5q563njvrkfallqobvscvpdik5owbdtnhbc5jad.onion:8333
+yrdtnt4lkpysyyrvryqhxw3k427gxwziosdtipf2dcifougwzomdfcqd.onion:8333
+yrlc4r3qfcr4x5wnciutrdvasrpahor3ui25lgdgkxbit3zwtmwfmxad.onion:8333
+yrmpasdjmb77ono4c6rjh24fj5gt7bbjx7nxurytkmxbww2gam6vodyd.onion:8333
+yrqolwaoxpa32cw2zegnaggmniuer66umflznja6dcp7udqpaoanqwqd.onion:8333
+yrwksigpx4foqlwnf6cxwtppx2z2msompig73dkcm34pwsmy5bwwg6yd.onion:8333
+yrybhm2es4siupjnyjffviemvqx24mqj5niwm2wf56spdqlwau44r4id.onion:8333
+yrzwl3rbfjx7eybyjvnjz2y7qmvpnkexkmylqpwsb7ivpg6ch42mmxyd.onion:8333
+ys2muyvcnpdadettzavleh7qrn7t6r7e2tobfp7yxftta7ez2i6rdxad.onion:8333
+yshp2g6b53ndeez34nxnk4bz6cqbzlfxqdggi7btqlwzxzuc7sweqcad.onion:8333
+ysq5rtpfzkz5gt2s62idbsd7secz3jepzlup6hqf5ttdutsdmwg2ryqd.onion:8333
+ysyx5eagwnqpfemz2nhwcxs2c3eueqk5f3jnyvyfqfno3pflcqfw6yqd.onion:8333
+yt2vub6llcegxuucu3iekjqfpmbyz4kreuxx4su2pqcetw7kbkbipzid.onion:8333
+yta7q7v5lkzt4zyp3m44cxcdtymxgmuqdntnagz6h3hwidmqoeavifid.onion:8333
+yti2ofsqg7k4zbln6aqx4zqaor2zpmlsebyljxlu7jczsjqtd4ctd5yd.onion:8333
+ytkkqeik77zjjwabsdlctuum37jr3r2rg6ckxudza7y7tialqr2wfeqd.onion:8333
+ytq4uowr6vwyjmrjvac7aimjjlzylfmhqhn3z4ecenm5dd6u2ccsijyd.onion:8333
+ytqhsolk7pqur5cu2faxruehvx72yiiwb33p4szdnzidjqksanps3nyd.onion:8333
+ytqzrm7fke3kqgh5b62taq7yyejgtd3yxwaifj2pimoqbfq4p7xi7sid.onion:8333
+ytrhvysmp4iq2qumdrpgp54q3ushkf53b6i4oxpddg4rmlk7hbayusqd.onion:8333
+ytyn2e3bkmgavrygpk5rzydfdmhpkercccqcaks3xtnbgq5qsyg4euyd.onion:8333
+ytz6ov6l5ofhjudlfi5k26lsg4v36p7xwciafy2sdau4cn6ozxgmefyd.onion:8333
+ytznm6jwapg5h3firimqb7ao2g7uihakg3gt6hcpfqkkgcyemklfufid.onion:8333
+yu6ilgxjfffdb3fq7srwwmz6ymp3fxberstpl6vdocmxbrrf5e3tw2qd.onion:8333
+yu7c5kjgmlci4arofpgq5d2qs5fvbw3zac52nampn2vc6vximc6qovqd.onion:8333
+yufe3o5x7spybs5tku64r6hzbrc46uq6izky6z3dyvba2ymblvehyiid.onion:8333
+yuhebtpb6urpsrr3g3vk7tcl5lp5dt7kcaj7zpgox5r4x6ptysxzvgqd.onion:8333
+yuqoihr4p76t2yupxuciurcpzsij5i32enjlsynqor25fhdvidx3djid.onion:8333
+yux32z6r5leyhbdrgdpti4sggxyoy336qb73ia6sk5egfli5qsvkxvyd.onion:8333
+yv2ezeqqfeoprti36q4fds3ckq43vdv7vktqfpn2npv6isnbxay47hid.onion:8333
+yv7ainbyxz6wejjhpjgzx6ghcomdwd3k7fclru4woooxcovyjwrp7dqd.onion:8333
+yv7llcydwvi2m4xpnulhgxcrje6vswtsasu5bbmgxuk3lgln37tdvbyd.onion:8333
+yvgzvmh4ngi36zvn7pe3bocsxj6pccafh7v6wmswkdobbxdzh3b56iyd.onion:8333
+yvhvl5bvjp5ljmooujmw74wdyqnhvwlm44766wwgq5thnzctyni6yeyd.onion:8333
+yvnppv3n3hwexlvugfviwv33ycavxdwnh24dps5vp3y7kw6kze36v3qd.onion:8333
+yvsokw66m7kqqqjxb4mntjvwhnpoovoec6rrpqtdze6fdvpbtvt4iyqd.onion:8333
+yvud2f6wb6puec4xq3a6yruax25jydqepowhz65uvlbvblsyi64skoid.onion:8333
+yvvodwqb3szlgkx4egcyq7qmhpyoqxdyxdnksxl6ppnmagnsu4noemqd.onion:8333
+yw7tqaujnglpjmjak5r7sxvjg4gqeubwetm5h54e7fbfn7yx7kgr4kyd.onion:8333
+ywbprsiodgtlc2qoubvot5qm22logutr2dbizmlond4dcifklaxqlcad.onion:8333
+ywkxlaydopi6ygjeggtv5znptkrldzsh7peg6wabkjmcu4k3hmbjivid.onion:8333
+ywmh5zcx3r2rd7zmkyx5kymgxk43lsamie52kbhayqwqyod5togs6aqd.onion:8333
+ywq6oxdfdvlict3cuasd3akvcl47iw6bxykrvkalemrcyqzyzclbf6id.onion:8333
+ywqkdkihpzr3hx6la2lzqsguoqbuwkn36qcrbkhvltd62zdrguprljad.onion:8333
+ywqp3kjwchkto24so4nn4ofq5m5c454btnkux5jxftkkqz66ducu3mad.onion:8333
+ywqygs72qzxbkjekezlhsnrsfnnvm66igkovfoh267ru7ho3qtxtalqd.onion:8333
+ywvpyur4ny6zhfxpsva4mh6cd4htw4q7ylx7tissnxehwg2bid5fumyd.onion:8333
+yx3nnyxy3h4ex22uqdjwephoprte34jelnkpr4ua3d23ks7qxjrqzoqd.onion:8333
+yxa2iu56fp4i4mxzdkmv7xxrluyxtkylqvexuceivx4fqxbjyzme76id.onion:8333
+yxgvp66ll3c6ko7w4hm7xvzofd3cb3ku3jjqc4wihapnyk3wxijafrid.onion:8333
+yxlaxiaatyfnrx3l2vhb4p6d347djzux75gcl2d33aydlwspo5w5wpad.onion:8333
+yxlwpmsjdbpldhi5hlzopision3iqbjzpvyaaeb4yst3z73qbgqy5fad.onion:8333
+yxnuslj7hslwmofh36a37stlm5jjnq46vvvyntf42uw3zuouot3sjaid.onion:8333
+yxq3bjwdrck3lflvwixj2fc2l7pzqnea5l7cucviamoc63a2xozk7iad.onion:8333
+yxreb5ajudnpt3b7z5hyizaj6ufgd46o334wtduuyaakboxwztgji2id.onion:8333
+yy3bnszld2tbbyd45f2j7btrbdz2p5zsuzie27liqr7xgkfh37rcojqd.onion:8333
+yy7rusheh2cq2xghpsdzlrx4gpejgfvsfhq6333d2jttcovhh5jo44ad.onion:8333
+yygxdcvyp6tn46umpmxlsgsi6crg2xjchuhi3okobofsx4dqgwucnnad.onion:8333
+yyo5s4r6wr6p7l5p5umlp7xgb47ugeptugscv4gvpsxvjlwymfpwruyd.onion:8333
+yyr2peqznujer3t63yyhlcasjndbhllvtxxkmcvr7p4yxpuzjrcylcid.onion:8333
+yywmc2hhk7t56e7jun62oidqft6jvtvvlylexihzgcrtkzxe5axsd7id.onion:8333
+yz3izxf6pdtr3ucbriuo4bpgjn2visad4vgocktexnpv3rfgar3kydid.onion:8333
+yz4l7aqcjf3lcdtdcuxoxljedrcrlo3lu6kths2bvjeoil4wqx3d46id.onion:8333
+yz5i6sldywr2mqzh5qmwoqfgsta5f67bgdhqogejjmpengl3llafdjyd.onion:8333
+yzakgornrhzzenpclo4ahyai5lxsg6mjq4zrwlhqt3ff4sblxi42jwad.onion:8333
+yzbka2sygb5eqgrgk2svqin5hl3dfknzfdn6wzwncexsejmrp5wgm4id.onion:8333
+yzh2ineefkzohck7vkwcfe62kvplsly5xn4dmm25fpxbjq2va34bu5id.onion:8333
+yzigosfexpco67cy3e32xehlpwor37fp52my5pwtr2xsnj3mxl7gfoid.onion:8333
+yzijb7pu6mrrdwb7sku2e3epfyrkhl7t2a723vaisqulr3roaxoy4xid.onion:8333
+yzlai35raddd2kdjnukns7u5t4m4ngi5dfrlq72e6lqf2hp5dzkuszqd.onion:8333
+yzo2vz4kuitm53zwynkm7ddfdw5escsp5fp7rgf6uspphe653mvdekqd.onion:8333
+yzqfzw7fgzzs63xpvsgznhnassxcadbfaxxaxbmkffvesgdxizhxkyyd.onion:8333
+yzrw7ukful7rhvlletmabm37wupkhsxwo2esqqotsoh6gxib57ss3tyd.onion:8333
+yzs2bdhwhxfgaozpcic4v66w7wwlxrr3v4xpgzer733qehcwewijipqd.onion:8333
+z23pfizxwpae2sbje722iesvd6rcxntazcaoefabzsudkc4xxmtbqoqd.onion:8333
+z2eky4p4ozlkrrmuq2jqcz6w2k22re6hxrm3um4ypcnmzmpsi4p6l2id.onion:8333
+z2eo4uckd3ymgtsjitag7yqukmjsjpwuf3d3npq4oskeatpkcinxkcad.onion:8333
+z2gnzha7ttijmle75dvqdzaeqz3xyxzjrrqbzribvwbomh74je4xeiad.onion:8333
+z2ihxne7lyodwglkwpvdmz3a6343msirrvjmaf2pytuo3jysabrkiiqd.onion:8333
+z2lhlshxak5owviqqzacj73ioftqmvq5idawmrgt4k347bwr6yubmqad.onion:8333
+z2njilhjl33youet5rbdfmncadpt7tohtconls3qhpvuqfkreoteqfyd.onion:8333
+z2nocd4haqt257cyr6festid7enoe72qpmu27cuvveoon4rcak4femad.onion:8333
+z2yjvxbv3rfpso4cjkxc4i72f55xb5fihthcdbvh6dp7ghxz2q2tabyd.onion:8333
+z33gr6fni32nkhfmkovcbvpuk7s2atoqfbuzdgz2jszh5ua7zdu6uvad.onion:8333
+z36427rantiy4ikleyihwfwh2ga3pyqqz7doezrzkyv52bi3mpcgt2yd.onion:8333
+z3asgzuzdvhrrejqjnkg5qfeynspuwzzrl3sr7seqxlwkiemnrpsrzyd.onion:8333
+z3hdtpvmnaz2izvnlopzmfgdb2synsomzgy62h7vlxvsn3yqhgufqjyd.onion:8333
+z3hgdhj7zxtih2gkjlnex6occtzw3tpd6f5eobwrntrhxtiww6ke43qd.onion:8333
+z3jl2izfxwfmqnbbrac3tustn4bngymj2tia2sn7nuyconbmjskedtyd.onion:8333
+z3m3a6wii62jc37c2fw7huca7mu4eywnssindvhn3hrh3t4y4kwj7dyd.onion:8333
+z3od23fobhkvypxarneq3fqsdsksjt3hmujnlaiwb65hdwa2n5xdjiyd.onion:8333
+z42np5zjd3thnd54h5n45ibynz5vb3flbgypt4me2c3bnvntn4rsgryd.onion:8333
+z4d7f4dvqutzvvqkmj35znzpyorroqg53jhbft34gyk2h34wzorv2rqd.onion:8333
+z4gvqymmj5jmg3dnao7k3vc245pzepqcrevzyh4s5xn5fcc6ape22sqd.onion:8333
+z4mmpbj7md2ljj2nzbk5b6stdromp2sxhysdexiq6kjqp2go2yfhlwyd.onion:8333
+z4pyvdupcieuqtzvhh47sbiahdyegvpgtwgfmlvfsrm4yj6g5mt6cgad.onion:8333
+z4qgvajgk3tr6aomi7zkpiilx5xb6tvavupvw42sgjf3bfqrgwk4tjyd.onion:8333
+z4rgrsudz3wjx7uykg2kmcadwixklibr5b4k5nulwrpxcjkasu6gnjqd.onion:8333
+z4s6g5bqdmo445vu2i6tcm54zjypfhl5uwnxqjq764bbu5h37gkp5gqd.onion:8333
+z4zr3v232rayjy7e4wuxxez2blz6p6apyv4souxjztqnv3mvaytb4nid.onion:8333
+z52bx6657mva3yjtrutjhxojkbwmrmndk3r3nptxc5xqz3nd62frfoqd.onion:8333
+z5ecnh7crpgo54nfll6qbwl4ybvfbq3izazsdu3pp6zqkam47nuux5ad.onion:8333
+z5v63i7lvhkfdqcex3ioeny62glxhptowtrfof54qbl545mlchkul5qd.onion:8333
+z62kddfut74o5njyehkdlj4caa6yg5orz5lznaccpbloqq2siiwbtayd.onion:8333
+z62r52qegmgv4otygobjdsubc6jffaei23he6n553akc4wnf5ryur4ad.onion:8333
+z63d77gd7artekfeamkqycni7tzrkvbc54fqr733veuoaqx45jwmytyd.onion:8333
+z63fpitzdw3ot62wtxtindh5334uatz2flxg6ronyy6jwx2ztjs4meqd.onion:8333
+z642d45aauehr2ycmv4ewv6zkwjlvlhwf5wlueuy5ynpu4qmffc7utyd.onion:8333
+z65lbxuvo5x36vuv5rgwgyoplqjzzciwvb2whvo3tlghzhp6zij6grad.onion:8333
+z6gr5c5yrp5seqsw73b2pkn3i4aqd5idmzgidjchjjm7f2hdgfkl4fad.onion:8333
+z6n3h75u5kkd5xkqfwbqasd2rekxams3jinrrqaj7p33qdxq7fdlmdqd.onion:8333
+z6n5kkyabl2huqtcp332n6xbo7kpilcw4b64govztw3swtzulgtxcjyd.onion:8333
+z6nq6lkmjoyjhqp5j3tg2gcjq4e3hgduo74unmtmnybd7a777hp4asad.onion:8333
+z6nuvxnjicev3v47o4vxjwakfz6g3jvyo3l4rds5qqfjptqie5re27qd.onion:8333
+z6okjxmclwc55pbwioqx5wyua7rjobcmbttpte525tlt2gexjcjtr4qd.onion:8333
+z6qmf32mld7uqjmx6hroqnkieerstp3vle3u3do6odxig3ubmv557qid.onion:8333
+z6s6t6bi4llpuod6rnakc344wn3h6ejpfejxrkjohjjy246shwfd34yd.onion:8333
+z6soa5spkni5ze6p2xg6lnehu3d7hnqn5ddiy34jtedwegf4syqnnaad.onion:8333
+z6t6fxwhgndvi36vra6d5duaryx2m75v6a5yoz3cqjlj53ko4wm7fhyd.onion:8333
+z6tmafvqwf2sd4rchnafg4urcug4xpkylwls2owruyifaduaeneyqkqd.onion:8333
+z6u4s3uz6bxke3tyibyccbg7uaxt4cb4dued3cu3pbjw6frqc5nil5yd.onion:8333
+z72rd3arkarr6eehucg7rrkjmvqnzdbjmppfk7zcvzd7jqrvisf7rpyd.onion:8333
+z745wkcll7vkkrx7zamibvbyqjtcp3y7wdz5kd33gijxfz54cxzg3mad.onion:8333
+z7eb2xkiigjdfay4ch4pubeqxb2jwyzdb5fo5owkbteyhefek76qoqyd.onion:8333
+z7f7lrvup632wkbzinvbkyyrhmguaf4fzt6zleiynk2vuvwdwt6ysnqd.onion:8333
+z7g3tx3nucmd5ozvs7wgq4i2riiufxlutv2usowr3p4lixfbx54fc3yd.onion:8333
+z7g4iekn3i7nliiowlt3ek7o6xlhi5tv2hofycacjqkpeoijghmiyxqd.onion:8333
+z7j2lcfj5b3isqznsb44ivi66lwmidcfspmvdrmhbfuyub2h3wbmnkid.onion:8333
+z7jbbwkyza6e37iqos6u7ln3nedom5i3dcnowdscr7wfj2xygre47aqd.onion:8333
+z7jtpaghm4na5po5p27fwbdh2aq3z4rkpwhhzemlrhsoefru2z5eyvyd.onion:8333
+z7m7rmzhol6swqnk6l4sadrjgxwnggt5zwgp2jx6tadca74o5puyuyid.onion:8333
+z7mcuih5vw5qob6o5qg27jhozuczpqx5lmzl2ghfxra53tov2h5xtmqd.onion:8333
+z7rxmrmvtsbgrrwwh4k37bpkk6dtu3aq7f5d442ys75nepy6r2q2xaad.onion:8333
+z7u326iowflnv6tvy6uiwwkusx4vat5gdaxwamcp6jd2we35ih6zplqd.onion:8333
+za6k2u2t22ohdrpqbirjhl75eadxcjvnqfkl4bzeygbnliqsc45gplyd.onion:8333
+zabx7shizdfchrfthsjcuyypqy473ni23ebi4aedow4bg5c4tl4cxbqd.onion:8333
+zac6qhbqbb5yo4rvcsmbilp33odkzfwrftwma4yo5hor4brj4d3ksiad.onion:8333
+zad5dkykkoelu5tdj7l7mr24pdf6eos4o7cbs5nvx6bcg5443eqwaiid.onion:8333
+zafdafmd2h6ue2pmuj25chhmkqad3jdcxwtaess2opxkrroopwdqfvyd.onion:8333
+zagkhagdzvkgpuo5znflvxcqxal5tweg3vsaoaonsvsl7r7orhlwshqd.onion:8333
+zahrvinucuxpxu56h6nkiiw7cvutxrua65l4jynvwkzt2bzmeuvdpuqd.onion:8333
+zalrhwuj5j47tntffl77xrdehzfwq7c7duhaq4jwnq5vdtdtajwiucad.onion:8333
+zaw7gnlyeqrlpgcmsp3e63anveudschhifaaezu3web3z6pjjdtvviqd.onion:8333
+zayfuym6j35mxprdsm2x7pvws2vyaoinsomdbgrqbe22rcc77j7jtnqd.onion:8333
+zb226sk3eljxccaswfgouu6mitu43sf2dan4feygrqnlvrot6z65oxad.onion:8333
+zb2qixzmsethowd6fqnwikvp3yeeeo3zvhgjmq2yb27tfslscgkp2zid.onion:8333
+zb62u4o5qzst7rzjaq6tafgzoybi2ncogcjp3sf7zbto7b2xmicwvyad.onion:8333
+zbci2c2pkku7hwg64ek4z4cbyn6o5bnzpzyriqwjckzgs34xmu62szid.onion:8333
+zbmhiorqlldelgniyhwogswpvrlcdjqxxcfm6vulenrpwiadvv37anad.onion:8333
+zbnovu66ikceaodzrkpwww4vop6iwvtebbeznngo2mtjkikwknqzgrid.onion:8333
+zbwbqxytihkvupc5zhezoh7oibfb7bopfcw6y4qbhh2kugnsw6zur4qd.onion:8333
+zbwpgu4z2lfuto566v6duz2qw5kkyvor37rpihk244bfjzqiuohdcyid.onion:8333
+zc2c56k7hcdux5wrlpixrx6lfutylfamr676tu2nr5z2vf5gwoyzrnid.onion:8333
+zc4l45jx3txlag7hduov4su5kl633sykaw7guioejg5pq2qyuescabqd.onion:8333
+zcc4wsaenndkzqdp4xsfzn6ilsdhwzpqiswumdc22dv5ejejec3o7qyd.onion:8333
+zcdv7z3vetrpeo7souyie7u3vyy6w43cuautaogldhs4n2fitytsihyd.onion:8333
+zcezifa7mmgv4voul4jf4wbqmr24djgrskwszktkt5hihywblltpahid.onion:8333
+zcif26i4yzp53k3uedswyrqkdmsmkflpmclmasdo6hat57pqjpm2omqd.onion:8333
+zcnl5vojc5aufydmssv4yxeotzeqpvyoxyae4kmoskty77j4dx4aykqd.onion:8333
+zctnwv5ln3yktcyqsbgie3qcee33x44b5quhjdq4zwjprl75r3snduid.onion:8333
+zcugrsfyxb3y5ucbdndifvt5ilp47a2233sv42ryf2cvzoncrgo2mrid.onion:8333
+zcw6xk4bfnl46fx3mkrmlnknbwnpssxsp7hlllj34fdrkutzts6yepyd.onion:8333
+zcyumipuaiotm5fhffmhit3ajzrgqihhibh73lvjo5hdt4aituudguyd.onion:8333
+zd2mgisets23i4mslxjl75froqjygtue4lnoq56qk3ohd4qcxpop7pqd.onion:8333
+zd3fxn7nwlj76qyjseubm4o2gs73jv2g22px6t24z7p5oeogqe3icyid.onion:8333
+zd7irysta3wti4efbjq3di2jfv237nhwotupj3rtufvvav4e5umtkfqd.onion:8333
+zd7uq75dlcseq546lmbqymh37cninokajwkixpvupillb7fgpqgbwjid.onion:8333
+zdi46azujxcjqa2wnvdecld3bdkps5erbodcvw2mn424gk2by5mterad.onion:8333
+zdm5zxotwdsma3jvij3jmlke5wmblwy7qa2kikfctlzltexx6l35u2id.onion:8333
+zdn24r3iovbxfkp5qx5ng7ribn4cqm4v5ers4olnbzugyp2gbhd56yid.onion:8333
+zdovdneke7oxtxdnee7f43vcu5mjzoa5m4bexpxgvopa5kaxyrcwa4qd.onion:8333
+zdovy6gcj6nrmxaygnjqf3ym5hbd3s7h3irznsbrjmgdywd2rkj2m6ad.onion:8333
+zdoyjklv576u3w4paxyjb4jmdhx2id7xoqkd7zn3sspodasmmazbbpqd.onion:8333
+zdqon7u5ofin5gy4rcmkixc7u42xypwklntwceohpektisokskrn5gad.onion:8333
+zdqxfzqxbaa654nsngnaqdz3jfsfe2u4hxs42covbct2dou7z7jpa7id.onion:8333
+zdtchifs5gqldijr7vzcgqqaftlcydhatm57owdwzrgudns5vpdcx3qd.onion:8333
+zdzkcrnoctqhn26hjbngpcl54nmvozbodf4gwf7anfxjrwhjxgurrdad.onion:8333
+zej7mizjlb26qecppzvgyswervt7ov6f4x6fwrot7obvab23xsv5jjid.onion:8333
+zejyatwyaptvvubp6b22cpow3an47bsrve63l6rerkldmuwwb37b74qd.onion:8333
+zepqddw4zaqqawkx7aqezpqwykxmxxeh2opnl3xnq2i6piazcvyb6qid.onion:8333
+zeso2dbskp3curnpgug5mjyvhs7i6rero3zbqo5n534wccstcok6ywad.onion:8333
+zexnlgnfxldyx6leiqvyhuimrfxznjfjoko2ek6rdtu4dvwkvztfysqd.onion:8333
+zf4cm7bgv4qollcjcj7kpx4qrtqzcsa3q7sds2jc3mxu45gvazlts3ad.onion:8333
+zf4k4efdpcwsfyobz444dgdfnsa6tdbd6aor7p2s6mpuol3ladssb6ad.onion:8333
+zf6nwlrrtd6q73svcimgfp54pinn46hbcriqnqqsitz3fbibzmkev3qd.onion:8333
+zf6tbmhchmzo46lmhx6vu3smjj3y4hjjrv4lnwpa3uq7bvtjcwapmqid.onion:8333
+zfhx5nerqkerm3jfoq4763vlmay4pifit5a6a6jtcjxpu7t4galhxwad.onion:8333
+zfo72va3rnioxbhh4kuth4epqwqque74aehlonvde3re6mvhz4uzgaqd.onion:8333
+zfomias3uj7w6sai3ty3coxhnb6voldudbeyldgyedxqo6kfc7rg7sqd.onion:8333
+zg2yslkwabguckkqanyxwbncrtozc2fjivsyesrcd27xxkowkbcwnxqd.onion:8333
+zg7obxhb4c4j3dgzg47zffbetclv2so4foyutdxizfnedhdkhjzo2cid.onion:8333
+zgaubbm4h7qckt4pgtp5zawrcf6aazby2zk7aeo5xsqpgwsc2yrlbiyd.onion:8333
+zgegpxbr7z34gupenib4tuwywyk4nlevo5dkfg3jt6c2jw23len76qad.onion:8333
+zgjrto32gianyp6i4gc73nlilodiqyo2s5dkr5ev73yq4qvcjxkwycad.onion:8333
+zgp3f3dmwbnr7257rouxkgddijr34keobzrtk5gkm2dgfbw2bylcwqyd.onion:8333
+zgrpshddeijmdp34xfyw2kz22la4jxgwce42pupjp3bo6xtchsorrxqd.onion:8333
+zgvklnnz2avqcnyiffw7t6umb3is4tfthnkzbhnyfr76sjtwu5u35pad.onion:8333
+zgwclfbi25s4ta5hfiwylboeitti64xzoan5aewuqimp5j55nye663qd.onion:8333
+zgxg4d4jifuihgozqblrt3kjkrh5zhbr4uyivtrzf2khnbtbe4z3qxad.onion:8333
+zhabxolberrktnga2eixvhe6vmaoxour3ktd6jgjq3emzkgthsmaq3ad.onion:8333
+zhapnpxpk3lmrfsmhluytttodeosmie7yabywa3aaxmtkreh2lmeemqd.onion:8333
+zhdd42th33pv6qnfi7v3w3gddy3tlgu6pjo2bhh5ezuytutxhivbtqqd.onion:8333
+zhea7pvhuzw4cte7pkd7u6lwjyiqczxi7wgvzhfovtjd7qwdc24pleqd.onion:8333
+zhgdvhnh5zymbwrmd2rfjncparbxfiyraqh4imk6kl3tkltgccl5cgqd.onion:8333
+zhhkv5u7pxuu36y7vzu6wlbjpd3wftxfuadsst3ifs3q23eydmako4yd.onion:8333
+zhhxxlz3wvdaj4scdetokkqgs2ndmdvyfwq4qwrn3l3hv2iftlgsucqd.onion:8333
+zhrzks7gkdvyef6s2aogxxuw7iqheixmrdzgkqotpvl5bjz4vq5tkkid.onion:8333
+zhwmsba7q6vn4yfi63p4tc3dobsarso4322ynl5ofggjbyiozefttcid.onion:8333
+zhzpumb4itgdxy53chqowtu43ru23ag3f37r77ydjs3t5o7bookfe3ad.onion:8333
+zi77cxawtknqkjiod4rhf7gsughbvv2z6e7mg5kax465uc4vtg4cwlid.onion:8333
+zike5s7xtcgp6frbjgzjhcz6gsvd3pghkl2jin3sdasrek3vy7l4ibqd.onion:8333
+zip37ysefmcbnyqvt4jiag6dj3h45ie7h56hmw7ktheotkuagippyiyd.onion:8333
+zipzgdr2m6gmjfucup7xpertovt746f57hrgb7lj6m4rxeniem6zdgad.onion:8333
+ziquiv5d3hditb2r2qmt7hn7knosdcokxe3khj3kgn253l6cynl62zyd.onion:8333
+ziyp62u4xfsuljn5ae4n7jea7wfd6vfutket2e73bzrhpstozs5364yd.onion:8333
+zj55khmgsehm24efh4nmye7oao3u3l4tjuk5edghey3mt2ippfste7yd.onion:8333
+zj7jf7o4b3qztdorj2stojv4us7lzqs37fbubqpqq2wu4dxi3cxpa3ad.onion:8333
+zjdf27w3vt4rpyb6usa3r5yi455svyaha4qtsfwvyrmf3hmz5hckbwad.onion:8333
+zjgnxih45rz3kalgxvhyebyavcnohmoa3bcnl5cwkmq5pmbyypavqcyd.onion:8333
+zjx5rmakdzormbwzl27w4xcucehwiat3dnncoqdiwesbmb7dg4fpmgad.onion:8333
+zjy7d5t6rxljc64pvta3hqi6yxzfsnixtbslafamoxiiw6ptcmv3kfyd.onion:8333
+zk3cgisxp3uxevuxmbzbmqyhvkhezspeydo2bmhu72b6mw2kl6v43fqd.onion:8333
+zkc2lid246a5jr2dpxtvmtu2tfiwt5dbry3xybu22b62vguco5a4qvid.onion:8333
+zkisbl3pv7dsz3szdawti4r7mhrhssqxf3uopi3vrib5dpt6u2u7ckyd.onion:8333
+zkjnuuenigzhs6d5y62jct4tira6fzijqx2k3yzsdsyulut6ywp5muid.onion:8333
+zkjoev53w4e547zot35onpmij4fiube4aomnysttqtv576zdr7wex4qd.onion:8333
+zkl2fsiisu3cyhhsua7qlr5afhyvmfh4qmapgubioyhoepqdb46jceqd.onion:8333
+zkl7x3u7365zj6opig53dxtty7ctw2ijidwa4lbdbhcv3wkld22bvxad.onion:8333
+zknqouk6z7g7h5y7rmycqb6sgzykylbbfpvf5efmzibww377iminltyd.onion:8333
+zkq4fgcc4bxksbsi74pjwjfby5tdwn26yhjnmewy2qy6a3l5p6bnaaad.onion:8333
+zkr66xkrvecgu6jkyan6nxvtefynf2mpsls5csvf6lt6ltqvoscw5yqd.onion:8333
+zkxe2fnm4tsmbu4bdge7i7j2cesfrq5oznfzobf4mwtejbhenp7ubxqd.onion:8333
+zkzj45moxjhjvrzqweh5g3iyucdb2qaqby7vdtmlqbvxmm5u337aglid.onion:8333
+zkzj4uhvvpav6ee7djkfj2uem6tyswi7idzupkozspbgr2kfvrk5biid.onion:8333
+zl27cum3gly7nfhwl7ulnob6pyichpxglnss4ffqv3terkquhf3dm7id.onion:8333
+zl3dx4nswje7l5p2fgvypve5wugfqtcru2ud55qo77tqdp2btm6kp3qd.onion:8333
+zl4gt6uafawn452rlqb4w2mujut5tjcnq4ahdr6ucdyeu2gtzlsk2jid.onion:8333
+zl5voqvgyf7deglpxamz6hpg4bierfngqsmmu72wpeut7toja47v6bid.onion:8333
+zliat4frxeuirx3nbijcljvgr5wembicg26fdpgda4pnps4oguaobmid.onion:8333
+zliy5o4uqgpqj2nbgyadqnlomnjtmdlwoxcuduwcfavzsguj4z4iwzqd.onion:8333
+zlkwqytpxbhkg4umwpqiynz6niefzqjbiwzryg2zpwwmvmw6pmssngqd.onion:8333
+zlpztcqey4osd3omtpsm7micrh6jrxuqzeeendpngk25iyfhleieekqd.onion:8333
+zlx2jkuv2iuzffo35hc264rnvoimzccvtlljdbmut4es76qe5pnvs6yd.onion:8333
+zlzhg5hipy7nc4ulsaprgro53f63mjj7je7m5xptgkksibgvbc6r2fyd.onion:8333
+zm2j2k2nl7pug2amadjkrcgs5omdnxctyl7b6kmlywsphcfl6c22gtad.onion:8333
+zmfmdmzlsyy7owe6vpgugvdq664vjhluqura3skjlm6fzpgqe6udm7ad.onion:8333
+zmfmmn72dg5jjkovy4jt56c6btg7pgp7wmeh547zlvavwmlbrbsl5yyd.onion:8333
+zmjncrrwtui476nyn6sqbp67bvgdhotllq33vzwygasumv6d2us64iad.onion:8333
+zmmtddrew2mjtghs7zjiyi2eelmyss7miyj2axzwfgnmvzthx7phevad.onion:8333
+zmn3jyv5a2rod2udnreygi6uan4zq5ul4mhewyfyrf7a3ury72bycuid.onion:8333
+zmqvv2cdxjj3vbclq7l6rfdmjegmixwkxsnzzd6qezwp32vxkr2cbiad.onion:8333
+zmt7psgtnnqxk6tibhvwkdfuhtgtjatz6bpoyyl4ptuv3u6ko2b5o5yd.onion:8333
+zmtd72b4nsa22ocez2hbjsxxrdfuxxyghg3zjtqjob5sgnjpustat4qd.onion:8333
+zmuuhwxhoa6h53jijpb6mczcvtxhw6zyjymm53dwzsbmkc3kkv5v64yd.onion:8333
+zmvriguathsanquofxml7kgcda4tkihm5qked7a6ntbqk7rmz7qadkad.onion:8333
+zmvritlexdmgatfqjlexl7wsx3lmf7y3qxe2kqeergb7ntkfu4nky5ad.onion:8333
+zmyavuyz774c2fo3eb55yokivpr7qfxdpjy2t5wpeygunhulck7yxzid.onion:8333
+zmzjx42yxlpepdgya34rvwb3wc2peggturiedmn4sfjltgy6gjtspsid.onion:8333
+zn3gjkpqkajav76kaem2espqt2bw6ggfvmn4u3gmkonds7pqd5heqkid.onion:8333
+zn3mj2tggwpbzzkvtsovkrbdshbsvac7n676hbi76r72de2b4gknpdyd.onion:8333
+zn5purhx3rnikkks5tx4scnjlhewwll3uzcs4pgde3qeqawof3jefhid.onion:8333
+znaiehv3qrtloxdi5rkbs4eqpmuveazuftob3sqzw3ta5pyakuwhx7qd.onion:8333
+znbv4cupk7rrdk4rqi6xncbouhscxnqdlbxtltp7564isfv5vtbyu7yd.onion:8333
+znc4xhwywjqejoioap3ssxvtsdilsc6i5o5s2rnp2ecmxqe6xe2nh5yd.onion:8333
+znea5ol7qgniizv3og2gfcbxw2wi4qhk7dfkdlt7bbxpy5aflljygbqd.onion:8333
+zngxgkdgkqpfyepa5cvxlaxvlyluzdryhzmviar4ojzaduxw37hhdmqd.onion:8333
+zni7kioacgsy5haqiftnexr74sv7rzvgy5o6lmz6dy26vvwg5lffioad.onion:8333
+znlvmmj4dvpju46kbb6mob4kufyf5a4qivyygmjj36kymbaa4nzi42ad.onion:8333
+znmgbi6qlwwwdlizjxsc6eujnfwgytufu6guo67b54av4y6inwgxllad.onion:8333
+znmwoazdkcffprail6h4p4opy7i4zqomhpdxe5l5nc6ejqagvt4i7yyd.onion:8333
+znt2jb6nivjgl47s2gdcgac3merqjfq5h2n6x6mbjegx6fumtl2ownid.onion:8333
+znvkqu376ienu62x5hprstn36jfqxospcnfhpc3kq5quwcd6436pzuid.onion:8333
+znwekshd4os5a2n222xrllgjuyvsw7hsb2y6br7pkwjatywk5lerbtid.onion:8333
+znxkxyd564sfftgjscsmi3a73jsazxwhsneix3bgto4suyjx356xewid.onion:8333
+zo4fczw4drgcbsumtgmigjkiso4miz34ltauajaawqmqoa6oxmzy4nad.onion:8333
+zo5jasvz5qo7pkgrgn4r45twdic4zake6zpjfemj6x2ioxcwvs7yzlid.onion:8333
+zobj27bempyxsigdvawc7foivyyuek73hemep7zf2tajof54353ok2yd.onion:8333
+zodjfmegrevmjbppq2t46iluruefbgh3b46tbrl2s5qkprvbetk3euyd.onion:8333
+zofseltpp23n2xb6fsmfgkwgqggwhrelxmt7zq7toazybgehbs7d5fad.onion:8333
+zohxazkomcr5ggqlj2edu23zs6xiay7wfsrxuetrn2k2s5gwhwhcngad.onion:8333
+zokmgys3gsgs5oivjcqp3xiki25iexezy33ekzuratdz3j5unqpxrzad.onion:8333
+zosjvclhqzwklml43hvsdmupglajj5lfdb5h5frgym7hsqo25rwrbdad.onion:8333
+zosk6fx2a3mxkfaeayziiuizq3y3j3azzp4ylwyh76wq2sqtaenuwdad.onion:8333
+zovm6wkattzmxc755cgqqd4sxugn3jaxw44izlm4yfpot2ucfeqnukqd.onion:8333
+zowc7rklhd6xhje724xomkftwimuihacwcnxkt7vhbjpvpkdahvlhxid.onion:8333
+zp3vpkpcfdx5lxvnuellqaf5qdvhu4luf4zqfx5xjo2dge7cqsxhsxyd.onion:8333
+zpgobpk2j2suauhuzfmh4iiz3y2zhj3xvb3g2t4a775t72stt3majryd.onion:8333
+zpgybnbaxfvzjeus7qna45zchxdkekjpk5webdkeqtxfwcglgogm2vad.onion:8333
+zphjbml3fqtbez63bjvd4s552yc2xebitadkpw2jon2qkbapbiltijyd.onion:8333
+zpnoo3qordv4xj5hjynkssu6wechvup6to7pamrgbi4ljmfugjyzwwad.onion:8333
+zppmhj76a6dyjch5qtubosxcyvtwjnb6zndsfywxci7dy3vc6lbfusyd.onion:8333
+zpq2nzcnlasmy3rmwtmaybav6t7xfrvorqqdwntnbgbxqujyy3dkwlid.onion:8333
+zpqvo25bxu4n2u3mh2pdzax7wmpsitd3qsszgw2ye3mpfdpjbg52kgid.onion:8333
+zpx2tq27yviwzbpc4nyjfqtlhigoa5k7cwl676nft7bkajo6jq224hid.onion:8333
+zqlwzzfzdoacgngtsnofmyqetag6o44f5r72opj733y434b7npnb4oyd.onion:8333
+zqq4g2eikcfgls64ffstsylfbqrfstm6n2otvrsbtvvjpqwgyqdnmbyd.onion:8333
+zqrj4fhhp4mq5eh5xptzcxjzpae37brkdn3voz32qsohl6noijygdkad.onion:8333
+zqrwah6dn3t5fuj7ohlyka27zzopduhxy4wyknfrtqpx4sykece65fqd.onion:8333
+zqtyvr7h277x5rxin6rhsrsbhwcfsyyiqgghpk6jlbewej2v3tn27yad.onion:8333
+zqv5nepyrwezkym2ba5s2sskmi2qck22snw2rygeke45bxg2o4vckuid.onion:8333
+zqvbnqwwhtoux2sxicng2blfiowk5mvty7c5xnssxwtlsjzalhg3zqqd.onion:8333
+zr222c3ybuqxn6a6piydvfos4zjnaklfgh6kofmujmolpiprfw4z6vqd.onion:8333
+zr6ffisxxo4gelmkoyb7izfm7ehjrbqbnzuguw34to34bqhxeeqzzjad.onion:8333
+zr7sqclimv46jdnmmeazqrhflhiqkhhrz5i3ed7yvyue63swk3qkjnad.onion:8333
+zrrfr5sr5wrgdt6rn44cxnotlvwe7cl67rgssw5dwsax42evokdaw6id.onion:8333
+zrrhgs52ftlylshuwp5e2uesgqnwct7h6cqhzofdduwoi4sz3shmxxad.onion:8333
+zrt3rg4paxmo24ucd56eehl7apindhbubq3ej3q5nhr6i72jv2eznryd.onion:8333
+zrvsjjrb3lgvmeftz2vfjva4pl63htmv5qyviq7zhnfmlk42evrxdpid.onion:8333
+zry2rqlcqf5p5e46wc6nmtcbt5vd45mf4hyf4nxlqogckoniufdjklid.onion:8333
+zs47b66pljpz4ahompanciv73xtztnnzkx4wjklt6hh4drsge4m26iad.onion:8333
+zsalwutefh6m6x6yxccbhulzrz2bmo7dzu2ggu4hxp5zv3xx2j642dyd.onion:8333
+zsbzferezmnyxhpktxtccn2xxuggmdzdnrza7pqjlnwjorgx57y2acyd.onion:8333
+zsgtoyy2svehhfba345dx3dazp7tfdio6o34zxlcgylq6pi67gjq7nqd.onion:8333
+zsi55x2nvjc4oqrpzzopkneukb5fudnm4e6drao4x73lf4zshhcvllqd.onion:8333
+zsipwsjpm4f3p6ueczh7lqei5rp3cusl6t4d6nntnwxq72hori5f7jqd.onion:8333
+zsisadra7jlxp5nhec2vsjwspvvnk6jemjxk7zn7arypl6cm6dy7mwqd.onion:8333
+zsr43xqj6nsrqh6qgxghadctltwytnaw4zmlvx6exqybt2qdt72f5yad.onion:8333
+zsxgefpkofjc3nti4qusk3pdqcfinkljajlwcb2cee2tduxltxbmrpad.onion:8333
+zszufrszpweaoysubpdnqparmyotjnev6nhhcnejhjjftu5sb55kesid.onion:8333
+zt6gkop3n6aggrxucnaqp4yrjeu6htwvuy2nyn3vadjjrodwxfhfv3id.onion:8333
+zt6hvzyoalzm4a576drn7yfvdetdvzwwouvfz435wzrf5pcnxqxplaad.onion:8333
+zt6v7eqh7vvlwy5kjzbdfgkw3syj3nnhckyghlzgmwwfccxvyfusuzqd.onion:8333
+ztcmlrstdkp7coheeolpwj75gp3imzgiw26xnoiucquwhxxcofao63ad.onion:8333
+zthmey4ueoutf7q36nwgujxu7hq76s5ifbtanvze4mxq2s2xq2cmjwad.onion:8333
+ztmwsyo35zkogpftujm2o7oilhucjxe3w6bjagsaiwtb2bu62vgjptid.onion:8333
+ztou4ytvgvpcakjaje2c6l5j53rxcxes7qhkerszi4haffxfpj3kdnyd.onion:8333
+ztwryklhcnfoeck4qntt2aitoilit2cmmr2geyqo6cjc4nwr7jlludid.onion:8333
+zu3ekh3vtqjfnxqjqlmnq3jbqlg2zum4ehgirz5cggwe2thjmgkz4cqd.onion:8333
+zu3yh7mvqw342e7qt5amwtwe2btjubi6t75k7wgcpsyoicsnpgbgj5ad.onion:8333
+zu76ecbahyc6ofjiiutna6myxmfdcsuhcrhtgpifbw3vfo7njd4b5tyd.onion:8333
+zuaotutv2ngbf5ot5kvz75uehbh5e2j726fglhqw7omk3b7xnaastpad.onion:8333
+zubmiztmnfy2vqowqmpyzbqtf2a43jgazsex6zlxokhfmnzmi3rht6yd.onion:8333
+zuc7sobx6ttj7lswk32raexasfbxc5kd6a3l6td35srqzkj3emsv4uid.onion:8333
+zunmnr7czrxvfjgxtvkwk6ziti5kskx4fi3j4dzahhdljfsqtz7yeqyd.onion:8333
+zuoml3m3jdkoh5bdrwfecnew5f4mrlcwhmhkn456qsa72cp274pbgtqd.onion:8333
+zutyd7pzkyejctriyr2lqlrex3arkunntsdjo3kgw2qj5u3fj5uyusyd.onion:8333
+zuzdl7nnjhy6inyqwsc5i7fae2nregm7wnyrtolaxhi6oiufyc7l26qd.onion:8333
+zv2nusexbcrncbutlcprevwhvbtqlyri3stjwmgl23x7fdqkmae6owqd.onion:8333
+zv63heoa7jstwhq3wg2nibip36bw4icd7jphccy3li3nut7gp2gojqqd.onion:8333
+zvbhycudpglrdi3sk7yixe64eknydwzzisc4n6xmxwhb7xyyzevc4nqd.onion:8333
+zvgutw2u7tu4dx7t25leghdp6j5n44u464mmoypafwstayp6ggabtkad.onion:8333
+zvjn5jscn7jncqss44uh53gvi6b4eycjqp42t6pv46bsr7gine5cbrqd.onion:8333
+zvmxfy5z7nxeknglvpbh7rveoppkyvvzvnpwxon2kgkepafnq4igheyd.onion:8333
+zvpcm7eemfvlklgqio3fgzcwa2vukg3n7caov5itik36kdua6mvm43qd.onion:8333
+zvzirfk3h4hk52j4u254y2np6ve2xttd2nugiccsqw2liiw7aqmglkyd.onion:8333
+zw4olgpxujj6iydkmhuxbx37b52syl5bm6embyebesysep2ignp2dgid.onion:8333
+zwbnovgpo4qxidylubpdrhxm34t23iwaniawfshiqrilttwqjnnlohid.onion:8333
+zwbqgh5le73aurfmbwf5ivjb7ycemwnjiq2jnq4sqz6epl7rdtd6rtid.onion:8333
+zweiy44ngrkfzhnaoqov3fopwqd3uhwsen4v6sdyf3ynmhlpuluvzeyd.onion:8333
+zwg2cvvkm37u2hicwbjasqzdqdhcblwvtzsulmz4kpbebf77jheiaaid.onion:8333
+zwrp2kb2covbrr3xdz2pxr6gg6ndnhpcgfvjkjr43eudnl5aswxgvbqd.onion:8333
+zwsapfrsxzsomsoty652jifwii56st6fg7bs2crr6boveh5o6npl7vyd.onion:8333
+zwtjkx5blzs4i6e7hwfeekcwufdl2lba4j65243tvkajder5iodkavad.onion:8333
+zwu3ep3zqki62b7ldjbsxk4dm4rlppkxpzzqfwsfvkoihxltm3y4qaid.onion:8333
+zwwpbfpymszcmkwlfozzl26m66r6n7xzgnw6bs4nf3pypqh36ya2w6yd.onion:8333
+zx37fw5b4eatt3dekaefun3ln67agpt7oqobeacvyq4keurbj26azwid.onion:8333
+zxaujdps5ce6wvk6ykbfquygtbli4ecvpokj7oyfxjqiionn3u3fdsid.onion:8333
+zxbq3k7hwswo2f374ahsmlgkpdj7ju7pyygurkvzqaoh35vmxleewsad.onion:8333
+zxc2bzuqdkippxthxbg7n7e3lznbcnx7zyitlhwvjusbwr5v32oxueid.onion:8333
+zxcnzlo2eigfig66vxyx43znm66a5i4ieuiosycgddgzdff4vhn6zhqd.onion:8333
+zxk4bqrede3tnlb7ymjlsoyupc37r2vqe647otr3nczqmgfeoyiu75id.onion:8333
+zxqdpu4gmvn5vz2kdld6c2swqdzknwh2czwsw55vx323orvtk6a6igyd.onion:8333
+zxqe6efq4odzd2mvyeglqto2cfggagoicgcvlvca4mxycg47jei4uxad.onion:8333
+zxzfz3z4nbb7u3ifcv2p5xenzpbnzuuezelbbjcfrmupxtqyoh7uhyqd.onion:8333
+zxzqhfwi3gdheuxmzagp4aw4aks6cii2llljapcvqhtqrxlksxddo5id.onion:8333
+zy4jeshnpx3i3wjcqrb27qcea4qetpez65wpocat5sqncz24xeo6sxyd.onion:8333
+zyccgvzokepone36ulu74l54ad4dtqv7a2bjzcvopj6rg5xhbc7ihjad.onion:8333
+zydziohabauwybhbqkegn4d5r4257bmfain36fatcxdbj2nw5zoa5vid.onion:8333
+zyetfkanxicfp6tt5tegkxlkoz5rl2i3zsc6hyyqizahywbktezfuwid.onion:8333
+zyjfoui3hrpsw3fo4owxrztclffqhr26wdedizvz5xvlgurgixit2mad.onion:8333
+zyku4bk6pdifla26hympigytlwsx4htajcn43hhobdbrv4tfojv3snqd.onion:8333
+zyl4kfejs3t4vefsvuqrqopboxrmztuun62jick4uh3wpu4mw7dpqlyd.onion:8333
+zyphknlr4ogrknj5t64qya246kdaasgirn4iercvesggqplzzxsisbid.onion:8333
+zyrodumrgvgpinhygbi5molpbhl6ndfs3lwtt55pumd6wy5k7nb3esqd.onion:8333
+zyvgumk5pcanh4zk3z72glefxgbd4dpyhsbzvqlsp2gspaw37lrhjyad.onion:8333
+zyyefl5unnw7lnrjlgfyvnytw4iy4n4cy5bbs2nudjh7wp7psvefmfid.onion:8333
+zznngqwcp6g55wkjg52rzeogk3fcdpopyl3zprh2fz266nykv4sqveyd.onion:8333
+zzntdfpcb3spf5pb3g2gczw2njmhwwksgxt3twbzjhbaisihg7h2ywqd.onion:8333
+zzsi7brufwylb52w3bcbqvp5jx6vribh6geiqfy5jhxpihqjjaox7vad.onion:8333
+zzthz644hdjxn3d54xrfe7snnuyhsx2cguy4kqb6dpc5u7aun5lflbad.onion:8333
+zzuipjogcfvs7uyfhfgesehon6viegga3sc6c6265n235pqmkwyqfmyd.onion:8333
+zzul2xvyhqvajnd6zfs2dzljoppx5lsp2xt4qad7256kpxrv3wzyiuyd.onion:8333
+zzx4r2yrkxul2kg2ojoeijwce3skll4wbkkjw5xprstn2o2xw6n74wid.onion:8333
+zzyp22x6ryzyin43pltkup6jki5ynboh6cwpucscx5a3md2tooqn52yd.onion:8333
+zzzzzzzz5bs2qnoijxlhxd3ibxipajesgprqlrxtpfbygw4zcaf6oaad.onion:8333
# manually updated 2023-04 for minimal cjdns bootstrap support
[fc32:17ea:e415:c3bf:9808:149d:b5a2:c9aa]:8333
diff --git a/contrib/seeds/nodes_main_manual.txt b/contrib/seeds/nodes_main_manual.txt
index 91a64c6e51..a3f00ad52e 100644
--- a/contrib/seeds/nodes_main_manual.txt
+++ b/contrib/seeds/nodes_main_manual.txt
@@ -1,93 +1,1027 @@
-
-# manually updated 2023-04 for minimal torv3 bootstrap support
-
-2bqghnldu6mcug4pikzprwhtjjnsyederctvci6klcwzepnjd46ikjyd.onion:8333
-4lr3w2iyyl5u5l6tosizclykf5v3smqroqdn2i4h3kq6pfbbjb2xytad.onion:8333
-5g72ppm3krkorsfopcm2bi7wlv4ohhs4u4mlseymasn7g7zhdcyjpfid.onion:8333
-5sbmcl4m5api5tqafi4gcckrn3y52sz5mskxf3t6iw4bp7erwiptrgqd.onion:8333
-776aegl7tfhg6oiqqy76jnwrwbvcytsx2qegcgh2mjqujll4376ohlid.onion:8333
-77mdte42srl42shdh2mhtjr7nf7dmedqrw6bkcdekhdvmnld6ojyyiad.onion:8333
-azbpsh4arqlm6442wfimy7qr65bmha2zhgjg7wbaji6vvaug53hur2qd.onion:8333
-b64xcbleqmwgq2u46bh4hegnlrzzvxntyzbmucn3zt7cssm7y4ubv3id.onion:8333
-bsqbtcparrfihlwolt4xgjbf4cgqckvrvsfyvy6vhiqrnh4w6ghixoid.onion:8333
-bsqbtctulf2g4jtjsdfgl2ed7qs6zz5wqx27qnyiik7laockryvszqqd.onion:8333
-cwi3ekrwhig47dhhzfenr5hbvckj7fzaojygvazi2lucsenwbzwoyiqd.onion:8333
-devinbtcmwkuitvxl3tfi5of4zau46ymeannkjv6fpnylkgf3q5fa3id.onion:8333
-devinbtctu7uctl7hly2juu3thbgeivfnvw3ckj3phy6nyvpnx66yeyd.onion:8333
-devinbtcyk643iruzfpaxw3on2jket7rbjmwygm42dmdyub3ietrbmid.onion:8333
-dtql5vci4iaml4anmueftqr7bfgzqlauzfy4rc2tfgulldd3ekyijjyd.onion:8333
-emzybtc25oddoa2prol2znpz2axnrg6k77xwgirmhv7igoiucddsxiad.onion:8333
-emzybtc3ewh7zihpkdvuwlgxrhzcxy2p5fvjggp7ngjbxcytxvt4rjid.onion:8333
-emzybtc454ewbviqnmgtgx3rgublsgkk23r4onbhidcv36wremue4kqd.onion:8333
-emzybtc5bnpb2o6gh54oquiox54o4r7yn4a2wiiwzrjonlouaibm2zid.onion:8333
-fpz6r5ppsakkwypjcglz6gcnwt7ytfhxskkfhzu62tnylcknh3eq6pad.onion:8333
-hanvo3hzqbhcqm5vahhi5a3czxxdwc7vt56p5gr7bifcvelaqurv6iid.onion:8333
-hz7oqntvj4adrwtqappcgaxfribg5u4rvfkpwlo3xup5fcuyvylkxlqd.onion:8333
-ityrxhidvjnjnf6imzyuqqnkkwridjnebkbokx25so3suq3fzezmksid.onion:8333
-jto2jfbsxhb6yvhcrrjddrgbakte6tgsy3c3z3prss64gndgvovvosyd.onion:8333
-k7nb3r7hxi5exvr4xmvnilhfw6hei7sw4rwz2t6onh4py6wbora6tuyd.onion:8333
-kpgvmscirrdqpekbqjsvw5teanhatztpp2gl6eee4zkowvwfxwenqaid.onion:8333
-l7kw3vjs4cf5mnuejjgqcxrw6wwsjmabllq3h3amy4f5q33d6cgo2kyd.onion:8333
-m7cbpjolo662uel7rpaid46as2otcj44vvwg3gccodnvaeuwbm3anbyd.onion:8333
-mowb2qwpjgs2a6q3yj3xa7nxklfssul4w7ynonyycw3uyopfu3x6ujad.onion:8333
-mwmfluek4au6mxxpw6fy7sjhkm65bdfc7izc7lpz3trewfdghyrzsbid.onion:8333
-rfqmn3qe36uaptkxhdvi74p4hyrzhir6vhmzb2hqryxodig4gue2zbyd.onion:8333
-rsgwtnousfc7zyg4qsm3gvczjx7cihh2njyjbjl3qvcj3xg7wmvhddqd.onion:8333
-s2d52bbttuwcl3pdrwzhxpmhtxn3jg23havjqg5eygwhtiw6lgyelpqd.onion:8333
-upvthy74hgvgbqi6w3zd2mlchoi5tvvw7b5hpmmhcddd5fnnwrixneid.onion:8333
-who3qs4eqlqzoxhqqgan4mg54ua5uz3mk4lj33ag53ei4orvnznrjbad.onion:8333
-wizbit5555bsslwv4ctronnsgk5vh2w2pdx7v7eyuivlyuoteejk7lid.onion:8333
-yrmedr35tt4wqfnwgilltxh5bnukeukxjpgg3jzmmsyld5lgsn5amvyd.onion:8333
-
-# manually updated 2023-04 for minimal i2p bootstrap support
-255fhcp6ajvftnyo7bwz3an3t4a4brhopm3bamyh2iu5r3gnr2rq.b32.i2p:0
-27yrtht5b5bzom2w5ajb27najuqvuydtzb7bavlak25wkufec5mq.b32.i2p:0
-3gocb7wc4zvbmmebktet7gujccuux4ifk3kqilnxnj5wpdpqx2hq.b32.i2p:0
-4fcc23wt3hyjk3csfzcdyjz5pcwg5dzhdqgma6bch2qyiakcbboa.b32.i2p:0
-4osyqeknhx5qf3a73jeimexwclmt42cju6xdp7icja4ixxguu2hq.b32.i2p:0
-4umsi4nlmgyp4rckosg4vegd2ysljvid47zu7pqsollkaszcbpqq.b32.i2p:0
-6j2ezegd3e2e2x3o3pox335f5vxfthrrigkdrbgfbdjchm5h4awa.b32.i2p:0
-6n36ljyr55szci5ygidmxqer64qr24f4qmnymnbvgehz7qinxnla.b32.i2p:0
-72yjs6mvlby3ky6mgpvvlemmwq5pfcznrzd34jkhclgrishqdxva.b32.i2p:0
-a5qsnv3maw77mlmmzlcglu6twje6ttctd3fhpbfwcbpmewx6fczq.b32.i2p:0
-aovep2pco7v2k4rheofrgytbgk23eg22dczpsjqgqtxcqqvmxk6a.b32.i2p:0
-bitcoi656nll5hu6u7ddzrmzysdtwtnzcnrjd4rfdqbeey7dmn5a.b32.i2p:0
-brifkruhlkgrj65hffybrjrjqcgdgqs2r7siizb5b2232nruik3a.b32.i2p:0
-c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p:0
-day3hgxyrtwjslt54sikevbhxxs4qzo7d6vi72ipmscqtq3qmijq.b32.i2p:0
-du5kydummi23bjfp6bd7owsvrijgt7zhvxmz5h5f5spcioeoetwq.b32.i2p:0
-e55k6wu46rzp4pg5pk5npgbr3zz45bc3ihtzu2xcye5vwnzdy7pq.b32.i2p:0
-eciohu5nq7vsvwjjc52epskuk75d24iccgzmhbzrwonw6lx4gdva.b32.i2p:0
-ejlnngarmhqvune74ko7kk55xtgbz5i5ncs4vmnvjpy3l7y63xaa.b32.i2p:0
-fhzlp3xroabohnmjonu5iqazwhlbbwh5cpujvw2azcu3srqdceja.b32.i2p:0
-fx6np3oheacr3t7gluftrqo2qxldbbatgw4hepp7ulb4j5ry57ca.b32.i2p:0
-gehtac45oaghz54ypyopim64mql7oad2bqclla74l6tfeolzmodq.b32.i2p:0
-hhfi4yqkg2twqiwezrfksftjjofbyx3ojkmlnfmcwntgnrjjhkya.b32.i2p:0
-jz3s4eurm5vzjresf4mwo7oni4bk36daolwxh4iqtewakylgkxmq.b32.i2p:0
+iy7go4454pb4p2zmnkwrgsi6v6oqv53zxnmalz6rnfjemxftapfa.b32.i2p:0
+j225nrmndwviihpe7ib6mm5h723cg62wrb7vnwofopv472ue3zwa.b32.i2p:0
+j2m526lqsujvt6b6xl4ipzbjkvkuecrye3vkggwo6jadvzqu7f7q.b32.i2p:0
+j2pyenyhoppsjexenznxvgqrcs4buv4nssctowgpg6czdoo3nyiq.b32.i2p:0
+j3usxovx7ukl645u77jud2mpmrk7ryh5yaxno6rceu77hqlxkuta.b32.i2p:0
+j42dsnjlg4vv33tshgs5jyham6plf3suj2sn2k6ew4tmcz3fpaqq.b32.i2p:0
+j4tjrfxnwcmbhkixmqlnotginhfxgfdvjahr6yn7j7rkbdqngh4a.b32.i2p:0
+jb3iui7grnljdjmsz7qbustrl5vn3ip3upnkzbaegaiklric7cha.b32.i2p:0
+jbmqtghha7hscwbwpi7ps2dnghq2bvxjnfeb5glngnvgjmeackaq.b32.i2p:0
+jd43pc2l73ek6hk2tp6hiyada7ed7vshqo2fvxbga2daylcghfyq.b32.i2p:0
+jd63whebd5yuls7r34mi3lnnuuhqxxr4lns672tzliru4vk7hwrq.b32.i2p:0
+je6ju6ihybxm5wkw5daeqjet74lscvi4ls5wn5wf7kiaczfggafq.b32.i2p:0
+jeidstlwdlt63lju7cnj2mh4fofysjnc2wcvilphynprd7jw64ma.b32.i2p:0
+jeox5nruuoopedsfpuoi6kwewmhbbsnhf7kib2q6oafvchxvmnnq.b32.i2p:0
+jex3ykw2nmw7owhgbtio5flv7us624bxwp46nr7rhmteujrmtvvq.b32.i2p:0
+jfdh65i4nhpg4obnoe4aqi3vzvbi6fyzjj2ee7s3qm2gbcnllkvq.b32.i2p:0
+jh2qxkjqngj2m5tn2ecaidfqac4awgnmkgsajntoqs5qqyjtp5yq.b32.i2p:0
+jh7ev4a5zfzmeyekinhtbqfi6c7xhvc4msdpyi67j3sxl6r44ukq.b32.i2p:0
+jibaw7ynbnxueqsy7k7jyvoj6ldzbuckppfx5wozt7mftihy5vcq.b32.i2p:0
+jicc5kwy4tv4j2nn6gfbis7e6dxy2kdvet3zpxdbyp74h5gpnxuq.b32.i2p:0
+jimdydczt6e2lceezopnl4fgz7q2jeqqhlqaxrgen33ouxk57xiq.b32.i2p:0
+jjangl6h4py2pd2gwamhqlsymyuocmpioneinzf5bb5qvvdjzzqa.b32.i2p:0
+jk56z3febpco6rbkpzzv3jszf4px5uztmoxzkpss7mxnzqlpsdla.b32.i2p:0
+jkfuajo4ayvo2rbv5qdj443q6adqmnormbhsf2f7rlp5t24xomda.b32.i2p:0
+jkvey2vfdto2ucudi4jlgsbpmlls3uwmlkjonfhk5yminkwzwi2q.b32.i2p:0
+jl4vr5kac7njyltivn7ut5afyq5ipzc5woxl4523emodxixci3zq.b32.i2p:0
+jmebfluhrl6ad5pt4ipevf3g3a4trcu7axalpubpkir6zlwovm5q.b32.i2p:0
+jndr5i4qhxs6aa2bqvufrgttq6enavyghi54dqfuku2qnstdqa5a.b32.i2p:0
+jopiw2tup5h5xh2hwef4oflgskawbpfmswub2iosmqocejijd4fa.b32.i2p:0
+jrert3o2rhbkpquybwg7tq4bdvlxeh6lnlcr5ddexkuguvi2l2pq.b32.i2p:0
+jrobuecgmuuqmpdsbxwbqeldt2735cgcemngoasnbbkdz2ufdlmq.b32.i2p:0
+jrvg22xvbmjyrkqg7mr622zhnda3ijtua65cqngwrven7sf5zd7q.b32.i2p:0
+jsg4dsxvgjcqz3c2qgtwi4ip3l4n4hlxodbvgukwaipycwo26zua.b32.i2p:0
+jt35uwbl5wx7ponyxomksrjjs7zy5yymvtud3nmogt7ci7xxlm2q.b32.i2p:0
+jvaoh33cpczp626ldwr4azh4hb5cjmxlbz3dq3cxisdlzn7z25eq.b32.i2p:0
+jvlj7qyxcmolf76wneyvmdxrpiezsxkiimapwxbdbiw2phvlyjba.b32.i2p:0
+jwqlvqmfvodnrslde2idqt25qxiyvgqdlr2q4uod5s6lkmlempya.b32.i2p:0
+jxjc7oe24vxdepkfvl365qfwrxcad2f3j43fnfuchtvqqkqd2rzq.b32.i2p:0
+k4mch53m72zv7jdda3poa2zn7bi3jacqwfb45peealxbhysdozcq.b32.i2p:0
+k4pjt6m25dcxno3udek6rasooz5ztqnywa3f2owpvcjzvisg7nga.b32.i2p:0
+k5ars7hsrfubadroe5h7oypjnqwi6v2vxxy6rmns7zubf66aivbq.b32.i2p:0
+k6eeshsk4vf34b5gfnraz4p5qb6scv4kw6eiltebel5exw6keppq.b32.i2p:0
+k6gt64xby5igmln5hfcuzspt2tndimzrdvj65yo76h22g5yhlvja.b32.i2p:0
+k7kcnrqe3ybqu2w3fali7zext6na7o5o65rx6f5oqza2lonsry6a.b32.i2p:0
+kbawcieyelwwitrjow537zpmdkncwiq42rhjgayw5o7u562mk23a.b32.i2p:0
+kcqkothplemakipfpeajxmu4xsszpaxpprgtuv5tgfdaqejg2sqq.b32.i2p:0
+kdrcbr6wg2bj6oipsbeqy6bp3v7dqpth6cheviysmvo4bdta7fda.b32.i2p:0
+kehosmgk76fxnjywqjj6nqs4ohg4hsutljdzjo4sswhxlj5l5tca.b32.i2p:0
+khxruoaom7juockko2tbxqo3bnrjmoqjhdoady3yyr4qacz4somq.b32.i2p:0
+kjaa3zlp4sipfxikketgvlx4oxq5ok57ifxenbiewmsrew6lcw7q.b32.i2p:0
+kjvrzgckasb57yqhluvjblx2ngxstumfg6uufz5mc7zyetkjlr7a.b32.i2p:0
+kkihsh2faw2gxil6it4glol4u37ccruuzsusyikquzmkffj3wn6q.b32.i2p:0
+km3b5j6cqrcqewdpuveibptw5gguwktwan36jlow4xykpg2dgr6a.b32.i2p:0
+kppcor54kkge6cgq47nzevlfrhbxingcjfmk2emkrdaejpixkqdq.b32.i2p:0
+kskidltmbigp2etp4pdl67ke2qzjjw66wqairzr4wn2apq4o7bka.b32.i2p:0
+ksxxinje357zctkobwnxsy44ddivq7yp2n3n5gopk4okir2vghaa.b32.i2p:0
+ktua3j43ijxhhhfeljsp32kdiuic5nlnfnkx3ealy7ojva4vwkoq.b32.i2p:0
+kuzu73gzvlnog4cdtdk7edbusxr4pigknvwg2bjo6l46ugsgmrtq.b32.i2p:0
+kw3v6gq5semgt4gg6itum3qtaylanyof7wn6bnbngdeby4xixuoa.b32.i2p:0
+l364nudwoj63fe5nsjmniiun63e3ycdqrjyknbfixxtre5spx7ga.b32.i2p:0
+l3ach5wbdx3n5nq53sv6tagijrbse3nwa2gkqz5oj7aifyaizpcq.b32.i2p:0
+l5fita4r7niir3hxmu7mzcwrigxinkrn4oqeembdkgao7k2yztha.b32.i2p:0
+l5obkk7zzop3nztnt6ijugz4okqsyhhb5o6gkbqottgqzzzcgvla.b32.i2p:0
+lai3534z6zs2tukzixdagrciezum2bkyuask2srxjrn67yu4c57a.b32.i2p:0
+lbif3mgg2b2ir5dkz7u6iatdrui2h2a64vlmffcfgqnpjuvwzaxa.b32.i2p:0
+leu37bptuuu5377mi7cb5t2vsu4hesblyxl5zptnnk4vodhovwea.b32.i2p:0
+lfuvzzzceuik5u5pnd2i67amegel5ua2rrnncxkyyc7bhteq73aa.b32.i2p:0
+lgpojpoix7zd6dhpo5hdrnwm4ueyjvi7tbot4qsqybk3upuocnpa.b32.i2p:0
+lh7qjombcmiekvv6niz5eflr55cnd3oxx7nuus6vmehqfodr67za.b32.i2p:0
+lhupu3owhuc7qwvyfazgkbcmr7sjp5qqxps732vy52v67fsn5guq.b32.i2p:0
+li4vuovafxjrf54kvfg3mjrg2mebs6edpl5yrr2dohddvgmxjyvq.b32.i2p:0
liu75cvktv4icbctg72w7nxbk4eibt7wamizfdii4omz7gcke5vq.b32.i2p:0
+lmlf3yjyg4djrb7wtzmrb4fbkorqba7k4lvk7ax4omay4mbytupa.b32.i2p:0
+lpal67whroip3c2yj4fxbayj46d3tr5osyqog6el5n6ctktdnakq.b32.i2p:0
+lpektonr2uyiohuzi35shtj3oaa77rklmqsivuydxkcxkea2dwuq.b32.i2p:0
+lpffyejskwwap2go7ommmryex2autlkmcnnpk2tm6aitxcalwrha.b32.i2p:0
+lpqkgbek3ci3w4qobpeqepjor3bukz555rzlmghck4o7wwb7ajza.b32.i2p:0
+lprgmkc45te7skx7rffpz72ca5c3zdg3tabiksdboao5w4wceu5a.b32.i2p:0
+lqn32kgic4cincyqlybpwbywcrowcxmscfcm4mqt4fgp24qs3y3q.b32.i2p:0
lrah7acdsgopybg43shadwwiv6igezaw64i6jb5muqdg7dmhj3la.b32.i2p:0
+ls52j74gwtsrqhlgqcai2cjl2rcivfib7jzovc4454h6tq3i6k7q.b32.i2p:0
+ls5otp5mybmxqsaeaid7wlori2ukieehr644adjfwdxux7jxlvga.b32.i2p:0
+lttdnbluvybzbjq52t5vbdkk3pvzc6zyi2oji7yjdpcgtgz732bq.b32.i2p:0
+lunkwblewltvq4spt7j5u2nfpqyndvgepl7edkiru322mmtpy2lq.b32.i2p:0
+lvdbqavgdom5h5denwkmdwslfzxckf6eddwflelbog7tgo2m7usa.b32.i2p:0
+lwjrapkfexjyjqf2rrdr4ghhxmlr3jdygsonetgtheglvmru5x6q.b32.i2p:0
+lyg26sjkcx5ied5a4a7jdxmfeplfcnux3fux5rsxzkm5mgbbsllq.b32.i2p:0
+lyqmygrc6gujxa4xlnwqku3vtfkbrszdiirsagn6xd2yw4kvodrq.b32.i2p:0
lzuu6mjtu7vd55d2biphicihufipoa7vyym6xfnkmmlra3tiziia.b32.i2p:0
+m2k7ajij2wvgfpsbg32zuorbsjt72iye3ozz6dbyxtj57fx7xsqq.b32.i2p:0
+m3hlmj2gz2co5gu4ss3wj4b7ebeg2xbkrr65ogxvhn76uxna5qma.b32.i2p:0
+m4o2kndr75clxemwbq5m6vnok7eiqshf42wjjvag7dtwxtafxhra.b32.i2p:0
m6bpynxkv2ktwxkg6p2gyudjfhdupb6kuzabeqdnckkdkf4kxjla.b32.i2p:0
-m6v454xd6p3bt5swujgmveklsp7lzbkqlqqfc2p36cjlwv5dbucq.b32.i2p:0
-mlgeizrroynuhpxbzeosajt5u4ddcvynxfmcbm6kwjpaufilxigq.b32.i2p:0
+me6x2p4m6jw3cxi2xl4a37u4orzmv3xdopr5t2vgwjmauiuqrmzq.b32.i2p:0
+mf6tmlegp7uga66cdael5376uaz4qd3wacuh44yvepa3kbu4fk3a.b32.i2p:0
+mhgxec57s6h7eixgemsghlcuhmgh7m7p7phqd5kzmm4wovrp2pqq.b32.i2p:0
+mjpulaafdyuanouslfpjcsvumi4edtckfu3ffn3ipabkxj4sn35q.b32.i2p:0
+mlakhs4ixcqwvk4vo4ce3loa54wmdlfingk73jookrkbra6ppq4q.b32.i2p:0
+mnkqn3r4jmg6vrmlprabenndyft2z2jw6g4nsnolt434coiklmyq.b32.i2p:0
+mnrbc3qi4zuk2tzghmy55kplawncih6jkmt75qczfu27enu3gcea.b32.i2p:0
+mnrrefebq3yxr2avprp3ay7w42sx27ijv6stjljzpwohnfnkg26a.b32.i2p:0
+mo27t6wym666b3wfauhndqocbetdsssxksep6x4dcpuh5dxe76oa.b32.i2p:0
+mo6mp2tymma5l2swob6kqzzb25ccmgccfj5pic6omjkktv4wve2q.b32.i2p:0
+mpi7bivbr2pywsgasslw5we766m757os2667h3hqnhcftaszdv3a.b32.i2p:0
+mpqb3jdmdibarrflyiik5wj3ekitxpe2oqieztlax3uomxspgsvq.b32.i2p:0
+mqocuhx3qwcwfuuin42yuhtqgm76drlmfvzikf7urot75qw3ykpa.b32.i2p:0
+mrbhw6ow77bjqmb67rurbkcl4xs2ocj4pti6hnz4wcsg6bduwtya.b32.i2p:0
+mrypjr2fagjhg6z4ixr73f5npkeyoxsjamcdv5uc6oj5oi2ylsvq.b32.i2p:0
+msjl4a7mdp7x2bcllmbxurhfmtxvolykonz45psmh7j6pptfyy5a.b32.i2p:0
+mtlznxqya5nbuyorybzul4cpdlrnvlrhalx2eogwjce5j32js5wa.b32.i2p:0
+mv7b44duaxqpzbdztnrdvnj6ypsp7yhs4z3dc2q64jov6pritmja.b32.i2p:0
+mvs5a3s6rgfbvvgq44wzyd57vf5pr3jcthc5qdo75xgj4slsm7tq.b32.i2p:0
+mwcqoe2lu7u6ogwo77kr5sr4wx6pxnotkdeck3yyjfh4uklytj2a.b32.i2p:0
+mwevh5r5dkzddlo2ol6bojpdds3kno4xqoy6p6ulid3paamgrtla.b32.i2p:0
+mwyjzdrgtypbwjyulw4ifetejz6xusqstvzylztsphpg2r2zf7ua.b32.i2p:0
+my66tuvzfyy6kkbdeqvgfpk3xuoxerucxt73tw6wxv3ian2p2snq.b32.i2p:0
+n3f4ngbs2igvp3j27vsi7thguqxoyvbfenaqhgypuqdz5iovek2a.b32.i2p:0
+n3fa2yuf3i3opdktiwyxzhbpudcut73valxdrlre2xs2ooepddaa.b32.i2p:0
+n47e4gkf5xujcamnsarfuy7435hfsgs4zhndcxaw2evafn6r2rma.b32.i2p:0
+n4n7bivjb2mffgll2ulpwyb4m2oomv5roxtdj6bmlb4cgpf3wdja.b32.i2p:0
+n4zwusew5coibur4p2g436ktc3cyogz3sklztu6ruulag3je6ita.b32.i2p:0
+n7ykk3cxcqzcoeipo7ghzb62ko4d6bxzfgenzxistvg6fuclebva.b32.i2p:0
+nazasriqoa6qoxdlgzjwsggubxl6i4nge5q7om7nijaqi24ulgua.b32.i2p:0
+ncdjjthck6v6phz4laddyc7a7czoujys55melfcoptvl2h4izqlq.b32.i2p:0
+ndtoi53fz7e6ml6v6jn33675nwciw7mu5msn7afzbhebprusqg7a.b32.i2p:0
+ndunnsjyp6l4w3jebow4zgsfrdsy2lrapjgslb3tv7dg6oypfbwq.b32.i2p:0
+ndx23xqvt4qezezih4wlj7mqtwc4nzbvmgseq6fc6e2ddywrmkwq.b32.i2p:0
+nejmippeopyo75wd3gjrhca3fr5mo2g37owzwdezxmg7uhx6ygxa.b32.i2p:0
+nfsi3fenzrzoccj7bpzuvjbxnij7dmzuprg7ia4geuortoquja7q.b32.i2p:0
+ngn5elnvbm234yyun5kbjyr76oy5nhrvyckn33cqcbx25hw4lfoq.b32.i2p:0
+nhpbv2ravt6t5fhxyvuhrxyma37wph6dzuzpddlw3uoivzl6tx4a.b32.i2p:0
+ni4ns3ou7v6zh5qrawvkwnmshnrzcyc5zojkw647rrniplmurrba.b32.i2p:0
+nigrfbou3zt6wxegn5im4cyminjcjmbsqror7ntcr5i7yv6chwvq.b32.i2p:0
+nij7pzb6mhrra5glb3dyghjt55sngwrikzdlagmpsf7jn2onvoaa.b32.i2p:0
+nisd4was4gm3pkvuwjh3sbaoo35jtxop6y2d7ug4iol4cffkrk5q.b32.i2p:0
+niyz7v5fdhqqtlr4y3tcgdoeu3myntub4trzvgixlgjbmowccgja.b32.i2p:0
+nloq52novup3cawccvaakmbudooatwkw7dqltnr6q3j4qy7r6oia.b32.i2p:0
+nn7p4y7pun3m3txaqbkeptkxykzwrf75ru2zimadnewj7g3r4una.b32.i2p:0
+noj7le7kkj54umo6mdftagvvk327cuir7q75bnvuphrxa7kjujna.b32.i2p:0
+npcmehkhh4z2wtk3f5426izrytvqvyf6aa7hyx6hf6jdbxveqima.b32.i2p:0
+nrrg4p7tztllzthlkqzomqi3dejfcak7t63n7zzuomt5atzz5m4a.b32.i2p:0
+nt3ysas4wpjgkft5pohrfstm2vgj7t2vx34u32voy7rqon7dlbga.b32.i2p:0
+nu2ao72zway2ponkhrf322wyfrrn4mdmyp7n5q5xzmjhcge5odma.b32.i2p:0
+nufliiw3uav3tzdalit224yhbfpcjtgfrm5ic7ob6l3mmsay6cpa.b32.i2p:0
+numilh7hhhf6inzkzway3hzif4kiroqstxqbz7hzvoy2ctgpaqda.b32.i2p:0
+nuwphtuudfrswids22qjq63zgxh5wu7erafl36jyniuxhz75ikyq.b32.i2p:0
+nvmuuajhaw74g565l3a7dpezs4rkzm22ub5jhh6mdvzu43j4a6dq.b32.i2p:0
+nz4lq7pmswngaevv2uqyainqzutfxlkavxgde2w2slo2p6e2kcfq.b32.i2p:0
+o5ijpzor3en5xnndm3ntti7o4fxvv24t3veh4g7mahk7ogesb67a.b32.i2p:0
+o6b747qkpgu6gvsem7leylvmxsaaqby67pu55fmqn52dgazuvbxa.b32.i2p:0
o6t4fr5ayfadzieutstgwcllvwxeuzjlxmzsmpj3hpkvefhzfaea.b32.i2p:0
-ofubxr2ir7u2guzjwyrvujicivzmvinwa36nuzlrg7tnsmebal7a.b32.i2p:0
+o6vbupdnpd5bwvcx7ivaecgyo7x5vdu5em4va6cmx5iwcf5tyaca.b32.i2p:0
+oaeqbkgpek4qnm3nly76x2tfrad2tun2xefliez7a3uxddeq4i4a.b32.i2p:0
+obf5kfk5n4nnsw7ez6ls6chqu4lz4wlck7utwvmjnlin4nzfnspq.b32.i2p:0
+oeydvkjoeqy3473wxkkbmoc6zz5m6zcmf6ov2hfkci54efsityua.b32.i2p:0
+of2gy2vblht57tn6yfczslnmp2xybdiazzta43y24w76tl6tu2xa.b32.i2p:0
+oggn6qbpmbag224gumagzgno53mgozb65tpzt5lezjbfbbiqky4q.b32.i2p:0
+ognn4mwwtmtjbrnq2kur7spcfohivxlrvz3sfamt3t46pk2e2ibq.b32.i2p:0
+ogqdcq2igslh3n5jn3utz2vpevttul366bt2246vilfnowuyvova.b32.i2p:0
+okjamsyd4wutvhfhsffejwk6ioru4mmvwagfssoy5hcocg2gj76a.b32.i2p:0
+om32whhwvcsbrf4g6uh5hupsl67oapccourkxyr7uf5zwaqxtxbq.b32.i2p:0
+ommky7qetuh45h4lk3raili27fnbhsgxv3zucinoaymnymo5735q.b32.i2p:0
+omngcjfwtiyqwbfqqggzbkttqgm3blywu43kpto2py2e4gp7fhra.b32.i2p:0
+opnpvz7mzfw6nypgmnn5zgtlzx7xuc4w7vat5bsr4mdtp77kz7eq.b32.i2p:0
+oqrl573nw6my2o5mup6uq6pm5immw3gnviahig5cceges4wfnyhq.b32.i2p:0
+orvshryqq24l24e4dvockx2ekj4hu42otqxsvyvy7tm7hhdjsz7a.b32.i2p:0
+oukeldqgovavh3npgb2by7w6hug575uae24z6uqfdl6flh7ma6rq.b32.i2p:0
+ovnk3wfbrkvvute6vkn5glhdtlxr6nyvebiflvr5l6ws6sorpa2q.b32.i2p:0
+owexluejb3eszx4p3b6zuxyggsxxtkxfgxoylkagfecs3bgfnpja.b32.i2p:0
oz2ia3flpm3du2tyusulrn7h7e2eo3juzkrmn34bvnrlcrugv7ia.b32.i2p:0
-pohfcrfc7prn4bvn4xstw6nt3e7hjmb7kuj4djtsfqsskwhmhnna.b32.i2p:0
-qd6jlsevsexww3wefpqs7iglxb3f63y4e6ydulfzrvwflpicmdqa.b32.i2p:0
-rfjkzdzv4cwpxo6hzuncicvuyui76wxqx3a23lynq72ktwqs7aja.b32.i2p:0
-rizfinyses2r3or4iubs5wx66gdy6mpf73w7uobfacm2l5cral3q.b32.i2p:0
-sedndhv5vpcgdmykyi5st4yqhdxl3hpdtglta4do435wupahhx6q.b32.i2p:0
-tugq6wa2ls2bv27pr2iy3da3k5ow3fzefbcvjcr22uc7w5vmevja.b32.i2p:0
-usztavbib756k5vqggzgkyswoj6mttihjvp3c2pa642t2mb4pvsa.b32.i2p:0
+oznpphdisfvlcjgkvny6ma62wy637nh4vtpxww47ifpmlqkjv3ba.b32.i2p:0
+p3au2w5jnkqugxnkukj4rusvynvz3oxawdf4ajzeyxvfvyzhmetq.b32.i2p:0
+p4tsqwvdpaitvlgaujfr2m2qbr36qiwusas5zkiut7w2wjcp3sqa.b32.i2p:0
+p6o3tzllswm2j4wah35niry4tcdu6lq5b67ehevcx45sae7pb6da.b32.i2p:0
+p7ifeij3vhds3diihx5qimucyzgck5omfkqxc4pkbbjtfu4hp6wq.b32.i2p:0
+pbag76x5yyo5d3wypvtohxmgbtdrjjb35ljnq4w5fpoguyt5mj6q.b32.i2p:0
+pbftrtdthbj5qcecraden3hdvwomqrgseec6ib5h24n2zcivdqaa.b32.i2p:0
+pc4d5v74tr4vz54pbr57ejga765ep6vwk5kox55gfobi5572apta.b32.i2p:0
+pcc6cnry4maul7zlbd32khalaavkcbw5hdjuk4zjwposaorjicca.b32.i2p:0
+pcdlqw2awppohbiued4rffgs6n3lv3thhon3r67jmx2652qx2khq.b32.i2p:0
+peteksofgwgndsdh6ovh2ydkrgpyqgttit4ususs4bzksvdqkbea.b32.i2p:0
+phendyytrqdr2vfsw3kil6yui5vb2p4v5xuddezg57wsdw5uyquq.b32.i2p:0
+plhoz53xhplmyuejnsg5bkfe24ow3pbldysoovuupu6qwb3nttca.b32.i2p:0
+pm4nukrzndd2lvd3shivpjrcbjlontmxhag2xzdf572snwbr3p6a.b32.i2p:0
+pn5cx32ljrvzj6x7hpgyff3rlftextqpp4zn3nkfufrrpnpuimzq.b32.i2p:0
+pnhspu3rloczdbzsysa2iftsgoiy3zgcd22jodmk7zdjanhiemla.b32.i2p:0
+ppe2jfsb2xrmgwugbq7agy44ucb6yq4qbufaf2sh76b4kwpa4jcq.b32.i2p:0
+ppez53yrs6lanyvyxuxblqxiuvhnqvvtafmwaid2kgp2dx2v5iaq.b32.i2p:0
+pqnqwxl7jsrok7vgpgcvlxwlkg6yckx33n3g4xf5lvuntwn63b6a.b32.i2p:0
+pri376r6uuwgnbnevki7c363h4ryfwjza7pcbfswqqxk6hnrkhja.b32.i2p:0
+pscw5yzaj5js2fn7gzrzoj6teonlsohlbnvdco65ubdefpnpwhpa.b32.i2p:0
+pt3mqmvkv7aleja7vattlysu6x7gjnbwqvwtu4skzabvkjztfi2q.b32.i2p:0
+pu6e2b5bz75qnmp2rox252aksllnitv2grnn7qfyzjkfio7w5h6a.b32.i2p:0
+punslpht6pysnlteht24rgvrkmzdd437lnpflojwakl5dy6mbema.b32.i2p:0
+pv6g7uin653rerdiivdgtoirjvokjowi4b3fwatszdlteyos3i2a.b32.i2p:0
+pvqyvn2lpvoeyhgcgunoqtetkrkp76iegyoii2af4crnlto6gb2q.b32.i2p:0
+pw42656k2vbwxmvrc2qbsz3jslvcxahln7rehsbia5jdio2knh3q.b32.i2p:0
+pxbyhv62tcdqqpl6pbp3og7ajzzcnbximv5kyt3hid3djd3uwkdq.b32.i2p:0
+pyf2csixjugwp6ad3bkry2ulkzj7inc747dsmpk7iebuidk4l3ra.b32.i2p:0
+pyole4gslrmenfcmd4ilqyzvsuyrjyffjbw7angentqjkkljitqq.b32.i2p:0
+q3ueujd332k5qjxdqkjtjlgkm3ktvdy7ats4c2ogcvokog4wm3vq.b32.i2p:0
+q4o7bf37e6afx7evwdyovsqptjwo6td3c6qtjh4rtdngp3trwi3a.b32.i2p:0
+q55g5g6s47hi7pcuomug3vrcd67vji7us2gqmfe7qn2nkq5vz52a.b32.i2p:0
+q6lzsezu4idxpdwro4x6svwz7j6h6gso6enidcxv7jhc2gbepuzq.b32.i2p:0
+q6o3eqnyg44uzjzqeudsankgdouylshkhdhl7b4bqxkbmdnm4iaq.b32.i2p:0
+q76g4lkosb2sxenh47eutqgwwzjyph52rirc635wkwnxsejrzdda.b32.i2p:0
+q7ntdwy6xueyvghbjamfrh62aqtuu3ikwg622em44pa3czomrdjq.b32.i2p:0
+qa77lz7dl64qwtj4fxxlz6otkuvv42dciggnmx62eobs2xqi3vlq.b32.i2p:0
+qaqvxmyvq2m4wombmtaz3our3qmp7eet3qle5flnrs3a5wgfhxba.b32.i2p:0
+qawed5ou5vb42ugi42goxr2s6cqzpyh3s5atkhvfvyhyc6anxyaa.b32.i2p:0
+qddg7myylinn4tw6kdjmmp6fsyetkosnrbp2gsjx77tmkqyqv6ua.b32.i2p:0
+qelsaseevnmz2unpovh4nbpjpshjg45iudiaf5zbngealwwuxe2a.b32.i2p:0
+qfbughfr5hhgoomasyviwk3zin24uerpl6urz5smzxc2div5ixxa.b32.i2p:0
+qfl3i45ipgugo7ueswy3ynnbaet77xawiplvmm3kp4fj72qvzc6a.b32.i2p:0
+qhuk5zq5v7h5p7o62gsxgtqqo7va4i77o5vei6wttxqcgaw47h7a.b32.i2p:0
+qivuqkrr3pv3rul4wgx4o4zon5wegidt5auylv3bhebfuj6oqauq.b32.i2p:0
+qjdftbhcaghdslzxjqx3nmem4z5p5jt7e7ou5bdz5llnqlxshe5a.b32.i2p:0
+qk3iq3wr6emttdilvdqbv6vnqjshuzz6mylwyfo3z6vpjywvnfca.b32.i2p:0
+qkohzoxigef43ro7mf2bd76eyneuuj2vfyremufvufssksbvj3jq.b32.i2p:0
+qksthizqtfdjjxcrahqxkl3bev75k24blagrkoszxen45zelijpa.b32.i2p:0
+qlhklv3q3rrszbrkxw755lpdburxwcj5dkxwicas46flztlkdcja.b32.i2p:0
+qmtg5ukzxemsktsxw2brwmohehyehwlleky3kuzeqzy4ledcou3a.b32.i2p:0
+qndgqhj3cpbxrktu6r7ysaooccqzvselvn2tphu3plx2z5ouocgq.b32.i2p:0
+qnqojlthym7z4gwizcblhpd2thy7v4a6ifme57bzyl3nxzkj6ica.b32.i2p:0
+qorzdjceszf432obxa73tnwhqb7ltxrxlfkkqmw2flmfjhoyv36a.b32.i2p:0
+qp5ppgozzbkuingg22zgamf4ozpe2n5hjlu4i25r6pjqw2ngrhoq.b32.i2p:0
+qpddavnflr5tdmeypeu5lrjjwsgtdhz7hw5emxiyjkcp7m7xysca.b32.i2p:0
+qpo3u565rmgeioruszadbc4vmpgjyoh7qorv4lyefl7geewyyz7a.b32.i2p:0
+qqiakw24obfwz375gfb6muzaz7tr6ani3od6leoox7jwzrizyxkq.b32.i2p:0
+qqmxvujwi4ktgj2cuqmw4kiujkf7ukrkoe5ryy4bjb7tyleplsja.b32.i2p:0
+qrpz67rcwrbpcockid5ml24dtdhhhekty3xd66ekkyatpfjd2wka.b32.i2p:0
+quzkrgzb5pmn4465647ke5lsfbseqnorr6ljvfsxcagj7rzl7hcq.b32.i2p:0
+qv5e4jlcmmkdlmh5spkvv2wgj343vm4yoty2hofuzi4lornn3hzq.b32.i2p:0
+qwhvlprhk3ntswr5xntnc2hhgmvd3bbgzgkbombiibhrsj7k6gyq.b32.i2p:0
+qykavpjbecssape77mrxjxwxces2gbjd6gzewd6zys32uhmnnw3a.b32.i2p:0
+qyqwn5xs24h65rldrle5msyarmqof3lb33uz7sutauwdg5qiuhoq.b32.i2p:0
+r2p5kqr7xjo4ncz7l6ekdx2ge6su2j22j2tdsoxu4jw3u67z7poa.b32.i2p:0
+r4ukdj7c2k557k7qd6siauhhqucshwy2rrkm66twzyh4jiucimaq.b32.i2p:0
+r5d5jgscvs6ix5v646ohwa64vutu7umfeknrc2hrezdjtlr4lm6a.b32.i2p:0
+r6d4moarp22wnnsnmsxqt3s32gzyscaccackcazvimrep7sa26ma.b32.i2p:0
+r6hd3knqi2p6kaw7hybrcf2q5lcarulcczs3sgcuz4yc2saj3gya.b32.i2p:0
+r7bug6wbhevqqlbavouj3ggpa7e57sbd3oivkzqeyagrtxshmjpa.b32.i2p:0
+ra7ztq7oq7jcozpui7c4zv76gh7rjwhq5fkpxp7dvw7ritick66q.b32.i2p:0
+rb7tyjd6gi7evmt5mzvtboramqip43sh72zjxnwhj5k72zfi3g6a.b32.i2p:0
+rb7x26lmepfbcd7wtxu42pf4tdxbe5p5zsf3cwuukd4fs4zhxtba.b32.i2p:0
+rd2cw3iukuth2lwe44q7fipawrne2io6y3fyyv5xew6vd3hos2qa.b32.i2p:0
+refo4v727jmff6ylrpbkvd5emlfr2hamaeh7zho6oval5dmnwlta.b32.i2p:0
+refrtydbdslzcgcsmmph3435qigyajh4q2nvl756f5yojouln4yq.b32.i2p:0
+rfgsjhyvqbunef5b5r2emjuoxx2i7rcsl7gathy2n4gwjyyat6bq.b32.i2p:0
+rg677vpfzyhsckzzcvoyvqdbwtdkqig7lxv4unmxcz63vtr6tgza.b32.i2p:0
+rgbq36syjadm2ex2gftc6xztivckrqzcjszla3jacwfo5hqutzqa.b32.i2p:0
+rizuiypjfhukt3bqnetppoauovuaqq5e6jzgd7tgy24zrwa2ydxq.b32.i2p:0
+rkhb3463btvfozwta37itlkt37iyncpkzak2xhoe4kg7tqafqria.b32.i2p:0
+rl4b3r5h5xodo7kiw4nykd4rhoc4j37kxizzyb6ukgcomyc2qrya.b32.i2p:0
+rnsjgirap5lfhxpb2xczuawgoztb4ptgdwt5rcb2bz72vhtai2jq.b32.i2p:0
+rrm2pems425buhonptp7lbtbprmwwjhbftey4ujvk25nclx7rerq.b32.i2p:0
+rvjzxak3jvwwti7klfb64wrsmlfcs6ceiqhzbbmjynokn5tz3egq.b32.i2p:0
+rwgf2wj2x66xtnjx3dggxhkuy6gvihvur42tbkoej6bd7iukoqiq.b32.i2p:0
+rxatc4b7obgosvznpqrmyrl6ty2yixhi7rpbh45sopqwzglyimga.b32.i2p:0
+ry3iuaabf5ek73otfvchwrqryez3nsgq57bpmzkyzumqhfbhgtaq.b32.i2p:0
+rypsyqod2yq3zagcvvc2643vydtv4zm2ew5r3w5kjzyq2snvzv2a.b32.i2p:0
+s35hlnmumkgdsvj2gepnwro4wo2h7ts7ddjhhihqggywn7qcym2a.b32.i2p:0
+s3rbe5n7lyy6smerpkgr4ictzbvkciu7gxyj6zqw3xyw62rmivha.b32.i2p:0
+s43w4tsmzmddvu2cxugh2lx4o5mup3rkvjhm455u2qqpg4bqlhyq.b32.i2p:0
+s4qlly4iwzevejk4ex5zfqhb4t666o73mvdmy4gpu47tpb775nja.b32.i2p:0
+s5ls42vzfaqzgrjr6cvgkmgifei2rtvj7uzaljkpsmt62jwtmvxq.b32.i2p:0
+s6umfzwe27x7az2yjsgqftjzawoj5lrcrgxldkfwfq2qwobml2ma.b32.i2p:0
+s6vsdby2liaahn2fh7qvrehqfus7gaz3p3u3rpjtfjhm4ahvz46q.b32.i2p:0
+sa3k2xipbuwm62bb5n2mwaqyyjcvxzb53kmzinoojgnjpnqurzeq.b32.i2p:0
+sadnlzguaa4k6kvpiky27izp36er3i5h74l452povbnajqullpca.b32.i2p:0
+saj5uchj7dzmxjv3kdzalgtbqzw6wu4wzxxdiobc23m452ehk3zq.b32.i2p:0
+sbalp2doxyedtr52kj57va2rmbi5npspv4drk4vxnujag72gtpiq.b32.i2p:0
+sdxfzbgwxpf6hbik7k4bqm63wm4xld7qgo3hjlhknnehzxyyeu5a.b32.i2p:0
+sh5hww42vwlsl57cdropaeqmmwozinnr2tg6wq4prg5wrkusvxja.b32.i2p:0
+shpd3cifcjoebw6pskj4pfmrm7lwecrygjnje55heorhsxm2lnrq.b32.i2p:0
+si5x3fon3ew644friidc5o3syrf5v6kk4pxxjvhibev3odxk7nyq.b32.i2p:0
+sikkmrxv6wat265rpay2tk7jywyvlzkekpolmwyp2el5g7iihsvq.b32.i2p:0
+sjpqyf3rq7ojcalldlybvyyh5lqiq5j3ade5w6txe3473ybhk3sa.b32.i2p:0
+sk7aivked563g6g2ri2saggni7jqzxmucuqa6xkudcgjvpbjsyda.b32.i2p:0
+slbbsiq2pmouqht3hznafnowq7sxzlidmwghfch7iiq64rzdhwra.b32.i2p:0
+sle3cbbdom6rknc3drqtawctpy635ica5d5gerjjdahfymkok4ma.b32.i2p:0
+slnmute5o6h23ldim34wro4zh4qa2pchnskmdpek2nzc7u5oz7jq.b32.i2p:0
+snfinsblh4j4wsv2n5kmkfxbvqzcei2ryfyu4heqy6u73mosep6q.b32.i2p:0
+snsw3ewf7wjtwspiuj33h3vtxnybllurzcwm7u62iutf5phoitkq.b32.i2p:0
+sooo7ajo74ajo6m2yomcc6jcofdgkdoyjcbrpl3nyvvusr6fw7ta.b32.i2p:0
+sorobw22rerrhpx5t67joyqai3ou6xsvqxb7wdomtnwnqztm4sga.b32.i2p:0
+sotpvcqqzzmty6llimwlvknqsdcypn4wsnwk677kepzmy76w2gqa.b32.i2p:0
+spbb34lslk2tldwzr4ydi2culk7sxgl3imb2gg746xbxqqcj7vzq.b32.i2p:0
+spuaa2y6qsaywypklz7itcb5klesogef2x66m4flws2r574qjc5a.b32.i2p:0
+sqjjqyrhh45jpgfp66idiirgh5ck7f4s76ee2l5bli4obsotu7zq.b32.i2p:0
+sqjorsqambyienumg5qpw3foftkp44vpsd4lwklgbl4lag4mm6gq.b32.i2p:0
+sqr66feh2g3f6bknt2tnltmnhqdkzoq3jhdaatfusshrv6v2zhma.b32.i2p:0
+stltasmf4b54srrjb3mf7hjtjvmvvms26btxakccdtllgrm2qzgq.b32.i2p:0
+su7d4biurihkyr3qeea7makkxzikxr5zi4znvryh3bjespppfhxq.b32.i2p:0
+swmtaospvaup7me3dvzlw5xoeohhj4zn5q6agivif7kxtseweriq.b32.i2p:0
+syhxehvl6rublw6k5ysmzcsqrzdsnd7eqrbwalfkvhgfccpu2osq.b32.i2p:0
+sykjw3jnb7n6bo574wnpiaxhp2nm4gc6hc4jh4v6trsbpboysooa.b32.i2p:0
+syqxyl67b4hdo5u3jtkkzsabccvtjaerpushov7nrc2f42x67fja.b32.i2p:0
+t2e45js4dn4cfsyyevm26z5ltvmu6lftxziji4fm3v4v2t3ykaoa.b32.i2p:0
+t32qcc2tbjgqxrydr2txgm4ahhhae3zkkojmguehw5gsbtrdvxsa.b32.i2p:0
+t43qqzux7ik7kki2rxtillcgbxrznuhjac7wtqh52sqovk5ay3xq.b32.i2p:0
+t4notlid4bejwz2tzucpvednkeuskenpnu5sqcbdhh3lqouigqxa.b32.i2p:0
+t5cd7q36no6doxduuvk5psdx47zl7ousnckjgw7c6zr3o3ke7ffa.b32.i2p:0
+t7gbmefspnynaezmvx445fjapp24pjjf7wx3evpwlmolzyu3wi5q.b32.i2p:0
+tanmhvkoyd35kf6a2nhj5rmbwpt3shc6thypsle45my565womjya.b32.i2p:0
+tbqehmm3nuuf2spwsjobrc4hg6uxji4mdelivhywz4b7f5lv6rka.b32.i2p:0
+tbrjczwl76v7ob6hon36z6f35otpv5g467q33pgzyyakp525wwfq.b32.i2p:0
+tcx3ftsdl36ukysuuewydapdzuu4alewyg22squei2wda4a74tba.b32.i2p:0
+tetoqjagsf7fpejajiwm4rosqscy5huqbz5hcqgfuha5tdfnlrnq.b32.i2p:0
+tf4tozh5unsgyzpdsmrdcpbgekw2agu7tp5jvyclzcs5kjudwwpa.b32.i2p:0
+tfuvti7yonn5pjptzzvpshh23x4rqjvm2usolrbnlu42laj4mhyq.b32.i2p:0
+tg6goh3flzmcer5voft2nf3tudm7ikyez334zry66vqxmc4ieixa.b32.i2p:0
+tgt7rdhywtlwob47flp6ccq7prrbh4ipnwm3xszuykq7be2pksyq.b32.i2p:0
+th3dj5sqw75lga3tnffbsywajxafv7cvlb7sed6w7q3w3sxuqo6a.b32.i2p:0
+tj2upmck47iktfh4vncmyajnkbatqglqzy4coqef7wioor4hbsjq.b32.i2p:0
+tk63xbzug7def6esivofwq2h2c53ar3ot7hsezdq3amxqqaoyr5a.b32.i2p:0
+tkzuysa4lkad53cywbt6sgpcndvvvdkjeatpkwyfweorx7rfe3ba.b32.i2p:0
+tl3xkknuukvyinyhvt7saz3tvz24ptgyqtzy3igygyfapcf2o3lq.b32.i2p:0
+tl66bkfoqu6eameaqtlwrvfttyc6xj3s57za3hd7omnfnjg3i44a.b32.i2p:0
+tlfttkbshrcixu6i6syntl5xjsoh6mtgfpix54knahyeuhlju4ga.b32.i2p:0
+tmmjmcrwegjke5fzv2hha2wkis7l6xdaa7fkq24ge5rbvqpwxzpa.b32.i2p:0
+tobdew6554c76jhrulcd2ssgvef7dryini2xjxem2zushe37ycua.b32.i2p:0
+trucvlawpufrszky4zzhhxtddnhio4mnqawzc47n7kik6i444m2q.b32.i2p:0
+tsfr6zvcgsmw2ekaxqqtkdrnbib5uio7lgmrtmscrvwe2d46g7jq.b32.i2p:0
+tsrlbxayhihugr723z6rkyafglnhcyzi2zhojzsyfdjsqkkd53bq.b32.i2p:0
+tv3x4kddbu753tnlghgh3txogp26tlydt47rl5scx7eoxgnocf4a.b32.i2p:0
+tvbutrv73xhwqbtosmbp3cesdyc5bbtslay4gjsf7rzdx4ztgzaq.b32.i2p:0
+tvotv5p3emxxnti2bnvucbfy4to7gxptwvh4qznuhy62hghnju4a.b32.i2p:0
+txpr56jvbf3lmqgaozqdqzgckfpugzyd4cwplkjootvf3hk42ibq.b32.i2p:0
+tyfkhz6ggpi2rykez3v3j5f3evnjxfoau7ve7m2heaukrcqiui4a.b32.i2p:0
+tyvsuqy36cx2yvf7jhnkd5ojc52g6vxl2rw5qshqwpk63ptovdda.b32.i2p:0
+tz5txdipkxcnydzcsuqw47qxdvpob644u3cttlbrbfg3zp75vl7q.b32.i2p:0
+tzudbbctweb7rpnf2vswuw26j63ysqztsbt7lfpfj6xautueiklq.b32.i2p:0
+u2tnrysboqqwjn73awg4hfxtfjgbqab6vrdgyu43s672jdcanhca.b32.i2p:0
+u5ixxcd6slvzxouj532njusx7ec4wemrfwmg6gwltlnkruubi63q.b32.i2p:0
+u635477uxqs7z4uvwx224u6ojn3c3ewcb66f3j7qlbzqyrrevxja.b32.i2p:0
+u6wrw47yfjdzk6a7nc6c6scvfokwuqmvuhxehqvymrv7owiajxia.b32.i2p:0
+u7uklnwthbrynr3z2gc3yxfmi5yoemsugjbb4nm44x26f25vxp5q.b32.i2p:0
+u7ygn3heosxu6l2die34y7wteexfp6h2w5j3nhr424yoblysigyq.b32.i2p:0
+uags6hm646f2qsyqfhzjt2xlnjqbiopiodghywosdgz7bwtbggta.b32.i2p:0
+uc52rzz4xu5ikx6hl6r6sqxfmiyyxsffpcu5frrtepczidwjwuha.b32.i2p:0
+udfxh2r5yfu5z7ynzacur7p3g7ug35kfa33ghes2bazpdivxlhsq.b32.i2p:0
+udkwqdo5odg5npn52rueipghn5omhvojthzdmvcvuomgzglum7fa.b32.i2p:0
+udzbx5jyvrp4g3iujlca7jnlaaaa5m3e4jv4sbr7tvp6k6cdjc5q.b32.i2p:0
+ufgoaa6g746zzpphuvxuomuizkyfpz45chqta7skrywqq6cjbqna.b32.i2p:0
+ufittrlr4eautphuqzuotc7b3xx27n4xgy5afm4foc6nsv56q7ka.b32.i2p:0
+ugw5zbhs2pvsgxieklmc6z4z6d5cvyux4pctpf2udhjgxvajot2a.b32.i2p:0
+ujg6b4cyxhi5pf4puwvwupur3iddm23uibapigpwl4bstvlt4cva.b32.i2p:0
+undzufsjeb4qlf7y5llh56tji6zlhtshlsyht4yjdsa2k4ayx7vq.b32.i2p:0
+uobwophnzqq4yhpp54aisud5ojgrxq6pasmq4aq6qw7dhgjcoqpa.b32.i2p:0
+uodycjdscpurlego2nrs7ptoze26p6236t2r2tax5ubdgi6duqaa.b32.i2p:0
+uohuxnjd27cftarbf6kh4czmotwvstpon2sgs2vpffqkgmg7guxa.b32.i2p:0
+up2kudwqomqrwvfognnhz2mjwqvkgpknfyscp4ue5ioev3q4jd5q.b32.i2p:0
+upme7c64dwjgbt7w72yf5ydl3dyp25dtenrkq6z3aw6hbircqzsa.b32.i2p:0
+uppxodf6bz3qibvpzzvtedl5lk3h7fslrwmed2cmqvdpgtvqkv2q.b32.i2p:0
+urqlr3cei7pp2cruga4txxmmvel3bh7nsbqzqzpe7omvmbm4v75a.b32.i2p:0
+usgqijrwhtwgoekjcr26yqcgpncwpsescrr3eek35e3rhkrtptoa.b32.i2p:0
+uu47uxdqqtv2pqorbaxnhhfmcsxmknvpreambqqkosr45b44h5ia.b32.i2p:0
+uv44mjoqrj3m3gzz5wxlnszt5pvgk3iqlc3pmqfe6un6gxays2cq.b32.i2p:0
+uyshm6nokdjyq3l43224at2rigpa4zmiyybuufyq22t4l65ialmq.b32.i2p:0
+uysvdsh2bzicmdqqdl7ezuftxcywzapohbzl5ap5hyiinki354mq.b32.i2p:0
+uyy4dbfyx2i2x3goobc6uxj4nb7ktzsu72zlksypjfisgka3xnta.b32.i2p:0
+uzgfmsjcbjxitt6bed3p3gpdzviyop2rz3cxqyu64ec3z2r5imqa.b32.i2p:0
+vbzp4sjkgqwymn2z4ikbae7rv3clbo7vv4mwv4ft7tu7ubrmbeha.b32.i2p:0
+vcksnyuyw3i6hfviob5yzoynq7okxi677bw7224273fjhsk2kgra.b32.i2p:0
+vdpfoahxse7cjciw5l7ffbwzc6e4xdlf5ulvrk34mzm2gy4mhlwq.b32.i2p:0
+vdv2aitgqica4taqcmjexw5xfbrfbhvf5kuxwvfjf3yiki5a5cjq.b32.i2p:0
+vet6qwwa74jrqrjzcm7ylfprzwpnt3hlzjvkbnaoiv4o2zzkr3sq.b32.i2p:0
+veucihmd74nnumiunvruyjs6kpjs5sqw5dprldlzcf7i3h4igkda.b32.i2p:0
+vewdrismzwnlxlvni7slpq722wlwfami2elghudm2ofcjhpjcs6a.b32.i2p:0
+vf3l3f5unlwrfmr3fiphpomgslxgm6m4chg72itf45yfu3brmy2q.b32.i2p:0
+vfpzasrsrqh3llkudmas5fymwn2ohswqi3vakclgm6fn4nb6s5xq.b32.i2p:0
+vgkou4ysuxvhlxrwf5n2ihn4ffyvvedluun47l6dobi5ycziy3nq.b32.i2p:0
vgu6llqbyjphml25umd5ztvyxrxuplz2g74fzbx75g3kkaetoyiq.b32.i2p:0
-wjrul5jwwb4vqdmkkrjbmly7osj6amecdpsac5xvaoqrti4nb3ha.b32.i2p:0
+vj54d2pkdeqvcuj5ykeggr6jnhhnmq5q6qe7nttvb6yjetweadma.b32.i2p:0
+vlwovj6fxzvtsypnmslocootmphezr5txanyfz2gjhn5lanrn2fa.b32.i2p:0
+vmatpbu2vf5p76k2emzg2tjyqi6p6yj3cl4z32ncdhz37ubprkha.b32.i2p:0
+vmbyttxf6sw6ivdamftxung44mktqb4vphmm4lqzdqqpcmksterq.b32.i2p:0
+vmoogdd5lztt5wpzkwhd67uwnvpupye7ycsbz55jl25sueowcxxq.b32.i2p:0
+vn5rsr26rp7yxrqliq7vo4zb6aoichaybd3urvc5eedaspxjp3la.b32.i2p:0
+vnxjmzogakc2a4xn5w4qormiqt5khnjptnoaro74ehinrv4q3yga.b32.i2p:0
+voi5u3azhajnt7476tcikl5mactxcvtsbnrzixwkj62qhpaw5ujq.b32.i2p:0
+vpevx6tl6ma6mnlj42d4fke57en4v5r76yx6rcmhtvw47guo34uq.b32.i2p:0
+vpmkctqhkdqgkekt72srqm4sqaliug37uq2wp2ywady3p235cpaq.b32.i2p:0
+vptzpxba7oys3w2htjgh4uxogaedursdh2yz5k6e7yh4b3pokuna.b32.i2p:0
+vs67sj5crkcjo7m74tdunzefj6ahgrgohs6egj5jxmneszwaoo7a.b32.i2p:0
+vuqk76jvxfk55bkovqcmmkvycmndee7j3tuv7ezdb2slrfpjyvoa.b32.i2p:0
+vxokhkidetjp4tjrj7idojx45hguhnl2azvqnbulougvdkstf3ma.b32.i2p:0
+vxs2es6f7uw2uuneslb7ipvmg6kqh6ytpjezoj2ptwx7od4jqmxa.b32.i2p:0
+vziy2cbrbvliqpi27feak2hiewovxtlkqppsagtaxeib6nkonknq.b32.i2p:0
+vzqowkd4aoyekapcskylli77aj3e5fomixsjyiawnldzj6c5nxtq.b32.i2p:0
+w2a73mo4grdgwvkzdsh6nyutagd4bmywywacxviodw7xnof72aoa.b32.i2p:0
+w2mgaza75amrvfocl7wt6v7eimprlasuj3bi4xezdr2wyqhkxzwq.b32.i2p:0
+w2zi3xos4jaz3ft5yca2x5zf34esctpmzqlqpdrqntjmi2o3gfba.b32.i2p:0
+w3hyqnlueb4yv5lkzj3wlnrjp7fzpxnig6x6m3w5du2ptfjcm2jq.b32.i2p:0
+w4arykcvc7eckzuqr7kvs2njsjpknzb6vvsodpyzp6tvu27bzoka.b32.i2p:0
+w4k4gm3chiyskfzshilxjchpgtpx2xmc6euvkyzkyjvzvdbqroma.b32.i2p:0
+w55r4ykzu6qt6uhp33exqbqmlt357cts2u2zoi7hkuphqmv5iupa.b32.i2p:0
+w6jl2gubyscdpubizes5bp6s42cito4k27xwcjwh76rvuik2prha.b32.i2p:0
+wacfewi6ehmfxvftxqmracfh7se2t7ozl62u4hsuyd4c5xfzuajq.b32.i2p:0
+weidpvshind3dnblwtb4zpssazeenkf7a63favavkc4crhqdk76a.b32.i2p:0
+wgrbhqemtf7qu4c6acjicb7uyee6rlinafyysvxc2yocq4t2ilca.b32.i2p:0
+wjfukwyohljaxgv4woewdtpoxi3q6hnwcnefpgrtif2kqfrxslnq.b32.i2p:0
+wlepjf4lxs4e553rtpoys6kqp2ozcv4pqjwzoybawcl3zhrdvz2a.b32.i2p:0
+wmly6cz5j54w2g2gibnhlpvuhh3bky26cq3a5jy6dp2hg3hc34oq.b32.i2p:0
+wnp26nyphqfmq3udocgcwenpsgfwk4ssw53st4wvwt6mwf7wm35q.b32.i2p:0
+woanasilvwu3yfurvhvqj3lxd25bzj4fxwy3ef3qjbso3cozvyca.b32.i2p:0
+wpnewole7fofvwvrvkkgf45sgcverlodocu7fstm2axp5jfykraq.b32.i2p:0
+wrqu543ssub7kiwzfug4o7m6lc5ibmaamdc3o4uo6a7ntxiqzd4q.b32.i2p:0
+wsbf5tpo7ecsafusflyym72k6tbyclgvqav56qafvyc4j3spzdoq.b32.i2p:0
+wtfebbwmsxoywu6nw5cowlxqhtokxrxftve2zee6flvrpqg4j6ma.b32.i2p:0
+wtoh5v7xm3wx4rqutbyvqaixybwlprx5ua2yiv2gac3prria5emq.b32.i2p:0
+wuikfwkext6lbl6urhoysr2abcyff5lkm2ojr6mfenqq25nzlluq.b32.i2p:0
+wumjwpr45uhvtggq6jkzfda47e4iqk2onizw6vn5po3bd3uqcduq.b32.i2p:0
+wv335vkr73gsaza4t6foqypnovccubvwfsarkmw3xtc3t3sncmya.b32.i2p:0
+wvktcp7hy4l6immhi5cxyz2dlsbhhvtcmskjemrnqehacnoap23q.b32.i2p:0
+wwbojywnrcf2mci7f3zgbomrukcm4d3nv6pttb3dohjpge2sz27a.b32.i2p:0
wwbw7nqr3ahkqv62cuqfwgtneekvvpnuc4i4f6yo7tpoqjswvcwa.b32.i2p:0
-xfkarmvk43vfkfvhkehy7ioj2b6wtfdlezvmlakblz3q4r7mccfq.b32.i2p:0
+wxfs2ccar4szd66dlmlijh3i3r4muehqjxjmabwbb46cq3gpbsoa.b32.i2p:0
+wy2udklgydh7iknnffbzvldoiwsct6dy3o7fjcsjcdjoq4b65vha.b32.i2p:0
+wzui6sc7667w7aabs6iebiex47o7cysxpryfdaltaklw2z2xgtuq.b32.i2p:0
+wzvki5234ffqhri26fqoxosqq3xengl23eoitkvip4mp7aipo3lq.b32.i2p:0
+x4cetuarbwiqphebitvgv4x4kzh6yhyyvu5c4yjlm4jsyl4bvs5q.b32.i2p:0
+x5qtgyzzgkovoko62l6n54p55xma5pbstbp6t6xc6hbugxz5ck2a.b32.i2p:0
+xasewpiqpzhyggxwsajmnkrppi2ozmapqv6673zuuymoueq67tla.b32.i2p:0
+xbetybs3nyeykskasolpatj4qrfnigz7a2bx7wcsyrniqd3usnaq.b32.i2p:0
+xd2byhr22rqkawocapbxedovmifyk77qrh6br4ctx7ny26hpmusq.b32.i2p:0
+xdoonpwnxhr7sjoyca3lkqsapmefd2puyar22ztocod4drjju6fq.b32.i2p:0
+xdq2g4tkaukzcu6mnvdukchinma7koi6c3noflpjabrzjrgeumfa.b32.i2p:0
+xegcohfrnnnuz3hdmb7r4e6pzxbmtg466n6mty2oz3tcoqutxj7q.b32.i2p:0
+xfyzfugo3qtfpq3s5zccbbqrxfkgy3ttlqhz6t6ovmtgrsuyce7q.b32.i2p:0
+xgbz5vpek6vaeej2zejxrjloqg2sqb67gim72qqpodqfq62rflvq.b32.i2p:0
+xgqzxudkvgbqwosaha7zb26jgza5wb7m66727rk4v2zj72xgg2ia.b32.i2p:0
+xgsk2huqghiftyznr6llr6ztepo523hiwqscxjpawcbme7xtjrta.b32.i2p:0
+xjebyiaydsbb76gqzetsmccgh67oeaxt3c4mkwmt7gjlfym266ea.b32.i2p:0
+xlfxusgnzpmatutaredcvx27zoiecno4tpxm52jicdvn4sr5dyya.b32.i2p:0
+xm55wnfhgmsy4wz24swjs2ziguheut6y72kht4ytwyfdmjsxslnq.b32.i2p:0
+xnb3pxtmai6ofbarycclwwueaarn4r3zt3zgkeepo4pgmswqvfcq.b32.i2p:0
+xnvsgbonlja7cmeokr2msvdelqlasbkwgqndqg7eakw43t3m465q.b32.i2p:0
+xpqubs4ftu7ym4xwrirlz2e36gvyjkil3chvq74bj4lf7djcrw4q.b32.i2p:0
+xrrx2rcpj3zefshtt7kamz3uflnwebpv2gkgd6vlrdazxgln57gq.b32.i2p:0
+xrwuqylcgkr2ovsf4pziosd27ywd7pfaohnreoyzm72qlnvoktrq.b32.i2p:0
+xtxh4wtmbjls76wxnehe57etubuqvsdiunwgve6kwjt4acwswnjq.b32.i2p:0
+xud4fgmeq4hl4cgsbjn3ubz2iyjguogskn7wreesvpsm3ib27kpa.b32.i2p:0
+xuivvnpcj2rhsxmkyyjzmyq6a7gwgusnqwdklgimamvkzu7rnnmq.b32.i2p:0
+xvpzaqftlfx2etqys733mndm7jr3l2j3if3wskfljzaow5s4rrfq.b32.i2p:0
+xvtvmaele7ns725mjaowsajpx4bgfecburyh6pqmdnn37cq7cs2q.b32.i2p:0
+xw6ble42juwkfrjetb3hmk2ep6jnyufhutoenyrou6ieoqiomw4q.b32.i2p:0
+xwlkpubkvsdsyaeylqfmxfk43juk6sz3hxnmwe4zencjq77aznea.b32.i2p:0
+xydzqrwggskdbmeqrhgt6alroglzbkcarzdlhabmvrszm5u6cfuq.b32.i2p:0
+xyhlemqmoeusqbbzr4oqph6kgmvm3a3lrbuanxkmyetwohxoynna.b32.i2p:0
+y365lf3vlh6vg4rs6trnjc4ia2xqplahk26y3tyqjly2q2vpfnqa.b32.i2p:0
+y3equ2tc6zsxqtndugsfzottuenfgxnl7eqgadmnzjkoigxvseka.b32.i2p:0
+y3occl5rqc2mz64esu5mqzoyfzlbxop7tttf2b3gyxjust57txfq.b32.i2p:0
+y45xhqkb43ncokfwhsmr4z6fwykuit6o3p2kbso3emv7stpiwwoq.b32.i2p:0
+y4njm6ftdn562q5thzd3fvb2f5mbi6bglmyupukcmcpt2tuo6slq.b32.i2p:0
+y5wr2bw3rt4rvw7hqqj7qtlf7vdds6zk6cs3mu3myyduasieqoka.b32.i2p:0
+ybjgylnhvk3fzyacxvyh6dwvrh7lk273qh5qws7uquvrhhwr6rka.b32.i2p:0
yc4xwin5ujenvcr6ynwkz7lnmmq3nmzxvfguele6ovqqpxgjvonq.b32.i2p:0
-zdoabsg7ugzothyawodjhq54nvlofa746rxfkxpnjzj6nukmha6a.b32.i2p:0
-zsxwyo6qcn3chqzwxnseusqgsnuw3maqnztkiypyfxtya4snkoka.b32.i2p:0
-zysrlpii5ftrzivfcyhdrwpeyyqddbrdefnfu5q6otk5gtugmh2a.b32.i2p:0
+yemrkyqmjzwwn2yast2ga6dcnsovnxwip2rjpid56grdg7itugpa.b32.i2p:0
+yfplj67xwcblbiu4ozddmzlmjl4ifa7bhkzzu6fu6jkoyqui6v6q.b32.i2p:0
+ygtc5m4mh3qhi7tct44gxqbenhkasp2y4ydjn5qua4l5vh35osdq.b32.i2p:0
+yj3v3ocgldnackxptsjmwasa4xzxj3it6rtuhmlpxvwlq5kmyytq.b32.i2p:0
+yk2srkdlbm7kebv53dx45ss7q2fjcy56m3gywqvw65eya7co7hgq.b32.i2p:0
+ykppjmwunzqzuuqc6qqsijomfzdgieeq2mkidapc4awrww2ninbq.b32.i2p:0
+ykv62rivlxurq2wkecagzs76tulfor765c237bsjn7jt4436kn2q.b32.i2p:0
+yllvqk2utimxjtoyzk7l24s4n5sqp5dbn5vwsbt3g3dd6h4dxseq.b32.i2p:0
+ylpyfcs24ij67dkl7ighyou4z2gpfhjlt2iellj2ad4ddrxci63a.b32.i2p:0
+ymo2cnldmstzqlsdhx7kurii7aaffrhpgafxlli3s47pzbfe5evq.b32.i2p:0
+yny6zqtb7qve7wwfctsozhzhbq4hyitlqco4uhc5q3rvjex77oaq.b32.i2p:0
+ynzhhxlieigtmj6l7f2dq54ypnsaf723au7o3uhnismlgnkmcqjq.b32.i2p:0
+yof4yvv4agwhfmicj5u2drem47nvfkihnp6bil7ocg65gydyzzcq.b32.i2p:0
+yojuyryq6vfoy2mftrdmybmq2hjefuzrwmpqqfvk2kd5hptgr3qa.b32.i2p:0
+ypbq5aleoqqoxto4tkxlmlxh2hrstjxzpgonj3lk7dzweahs3hhq.b32.i2p:0
+yql2k4zjl64dtybuculjgg4v4u6sje4smnyay3vslv7irrigzxka.b32.i2p:0
+ys36rtuedg44sahelbysqi2mbc2l3rcfdy33zdvhvfkx5uocacba.b32.i2p:0
+ys7np3pmfhiyq3z2rcoeylb7agfbyfuhhp7ky2uzvvuzswad6cia.b32.i2p:0
+yuqb55drzrhxfnvobycxqau47kibaaf4voamk3kxl77xbb42xkqa.b32.i2p:0
+ywfauauaekbrxgwaahcjzifemzdq26xsshw54sg4bpr5z74scwiq.b32.i2p:0
+ywpsgu6nlnf2l4sy44tit2av7hfzwwttbjvwbtsbtqur3awiax2a.b32.i2p:0
+z34pw5tlowwi3gpj3ycb2dptgyuq65bpj7w36xahslgikggo5eaa.b32.i2p:0
+z3j2xshl4tpbxaybcprhzq7cuz6urboqoxvvpnfriv4n2lq72jsq.b32.i2p:0
+z3pgyfiwfzcd2g7v4rs6el5tvc55y7a3tai4gcbpso6flaejckea.b32.i2p:0
+z6mlyrxcjddpcaoumxnw5peulnkvj56hgwqmnc5adoutp7piujaa.b32.i2p:0
+z6xsstyq4zynzvagwv3wr7htz4vxttrotzb5izefotlwqm7kjtua.b32.i2p:0
+z7cjxpy4taui2ka3ekfqtoumsb7pg2sok3wfey3m2roeuppcrzhq.b32.i2p:0
+z7cjzfmv6wadjguzaavu7pfsqhujbczspbf5sxxrqndeovu3lt3a.b32.i2p:0
+z7gkesbkbl27lpcpbnhgfofjz5fhnvljzfvyydu7ky3odzdqs4lq.b32.i2p:0
+zafd45c2hzd4w2t24qtjqqbqm3z4hayb6vadj6sd5oukjyij2ara.b32.i2p:0
+zbkqcqtiiw4nwsds5pjel6alr5i4hgiyqf5giwurdygfysacru2a.b32.i2p:0
+zbz722dh7rvu6ugdydmlmtgfyc7rnpeslae525c7mhr7rgsekjba.b32.i2p:0
+zcwgqw7hlw7437a7au6n6obljdb4arnshoibdqo6voree4xiznoq.b32.i2p:0
+zd4ns4zcyvgpwkioftiiftgj74n6mf4m4ieq6aedqaznmdi6rhdq.b32.i2p:0
+zgwseerxwqnid3zhculzuqbkhghthsbvsbnqowredostfqlvawsq.b32.i2p:0
+ziehuxdpyg5dvvnzedmcqxszdcflsrx6fqmgzb7odefqwqaxrs7q.b32.i2p:0
+zk2r7kzzigzu5kz67xnrbe56u5walngylcsk756bkmt66cmeeydq.b32.i2p:0
+zkbjgfp4ouockpsmpbdyli4ilo7f3lbfjsboay3nf47ymir2ldrq.b32.i2p:0
+zki6halesukhfel76pziutgica4zrp5qtbmlmgyqf6dnnomk7hja.b32.i2p:0
+zkij473aummp6rvwvi7wbr5iio6xu2uh4rophbhyot37uxhrygiq.b32.i2p:0
+zpvqqdrcnagad5ayutf7hkp6prtvrbmknhqdul3qweft7oa5ikzq.b32.i2p:0
+zqft7c6riv7aux62qwe5xfqki3dcb4urvbfy6m4wz7f46j2us3la.b32.i2p:0
+zqhoqgf3enj2pv74sjov6dthpr6jqafw5qqzzsvnfdqzycychxpq.b32.i2p:0
+zrrki54mn56fytizkfmhx7eubea37padxa3zliwq6gtknrsxv2aa.b32.i2p:0
+zsfpcnbk4g2bwxl7yy5ebrcvlxd5gpcxatewdrgpige7oqykunwq.b32.i2p:0
+zszq7enaxbz5p3f3idhfkkd2u2ygpeqwj3o6hkofffcmllnymwqa.b32.i2p:0
+ztr3c7qz6v4hrnegmkzjsr52wyi4u6ery4m74sk3m77oup2ws4ka.b32.i2p:0
+ztyxbjae7ucfyupxpy75jwpzdktg4gbvhl43nh2crwqrx2uhveda.b32.i2p:0
+zuamj63ad73jmnw7xnxrmjsbjg7vg23j46w3mpc2udpcgjfkcqcq.b32.i2p:0
+zvchlrjuzqdlx37fhibhnym4y6p56vtlymujjuzhh2cp34yqfrtq.b32.i2p:0
+zxsd3fqczh6ddgejc24nnmb3ww7nalieq3a7cs2mqiy6tmff3wia.b32.i2p:0
+zy2ywvyqds5bgdoo4tgbu3bwjp3ygyn3zfuby44jemc6xa6fbwta.b32.i2p:0
+zzre44vh766jgfordw2ehu2r6p44j23uyovgvm7iwuhp3g5iz4ca.b32.i2p:0
+ycdw2e4ufgfwhcqna4g3m2qsvaly23ozaexawcj3x4gtgcehgwujjgid.onion:8333
+ycfvedulkprd5bmivqejur5aptcs47daqtcvzotnnhfvwu3o6gcp5cyd.onion:8333
+yck6l5ffw6oszgtoc7et4fytvp3sqdf5awyky4tlpgem2n4y6icxqoqd.onion:8333
+ycnepnzktkhfysqijlgbjk5awivls3eiqb5kjudotjvnvlbe6ah2k5yd.onion:8333
+ycwrrabomoixkxggkxldyxkqoc7qqy2t5wxcsxjgodlvuydwch6dqoyd.onion:8333
+ycwwrwkqibvkftpc5kyqs6nf7hrzetrmqgwo4yae7bq5otvubkfsread.onion:8333
+ycxjdh4jr4vun447cdszcoge26pbdnqblfi2osmk5e4uqmrigw7y4byd.onion:8333
+yd2ami3rem3i24q2b76l4ujyq343ycrowrthwqycvpcsofgpwlxyryqd.onion:8333
+yd4nyusqking6tkcwmmopznlxhyfhk3gsw265alz7vpo6toqg3kwn6yd.onion:8333
+yd6b3wtmu6bz5km7hw645omyv65one627xech7f3vnlwkblsvqdtmiyd.onion:8333
+ydforbx54mnz7g5u2mu2ulkomvakdbwxoad6araknijb2i47gkfeh7qd.onion:8333
+ydiqekqpcf536w5uwsdclw5pt4n2fkz52fo4vwdducc5t5l4ghqaxnad.onion:8333
+ydl5kqr2auvie5mtjkm37hzkqh43pobibty4msfzkbu4junpg5gak6yd.onion:8333
+ydojumivjpins2lwgql5xaywbngrmw56nvmtalvfiy7sr42ksvr6apyd.onion:8333
+ydvbxdzs6w5wefifiqsqntpbd7tliofenqih5hlnz34546fvy4ab7iid.onion:8333
+yeat6ea4esvd4nimhg2rcb3ghpusoqzjb44alb3hhdj4d2nimn2vpoad.onion:8333
+yeficzguf443sojjdcmh7lzk7l6y43a6v2jbyk3x2w4n7xokjs4crnqd.onion:8333
+yefjaylovpdhbb5b5bhjx37digt5u62lmzyc54ygtabwdphm3zwd77id.onion:8333
+yeghpcuryadlbxzk6o3ujebmfuumkpoi32dr2ctfmql6vqn5wjioehqd.onion:8333
+yenw26f3i6kf5u2nad6xligxk5iyizjvl7msx3pzjcatiesogdef4zqd.onion:8333
+yeoadueo3ukf6s3fetywtbvgmpvrtkja5rlp7wcp4aich6tfhh35giyd.onion:8333
+yeqjrnnuf4fbgzik74qfhrohcymj7ccbze6ndky4pe673chfsjconfqd.onion:8333
+yernmfgru46g43vsijjv44n7m35tpoznnkd2p2wl3uqzkietukxqxoqd.onion:8333
+yettfzp2vanmkehwxeaugotqcsg3wsomcargvetk4nhwnebrpq7ah2qd.onion:8333
+yfgo33tiu6w3nrvnfyw2nmpcwtfozinctn57566y5l4hfcttuvgff7id.onion:8333
+yfmujam6pa75vm7p5q7gvgkocqzcwm7lgbnodwtmzfw7usy5dvlgqyqd.onion:8333
+yfpqwz4qogg2r5sdweggggz76pmhxtegnisz55urw3egvcq2e3amvkid.onion:8333
+yfpucmv4zspytubs5epnze4xc4joqny52s7ifjk3vu644axwkfyfurad.onion:8333
+yfq3sexjxzuww7tnwc7jj2ethiu5f5r65ewpy66os3ozhoeje7na4hyd.onion:8333
+yftuiua74fspnqanvait246qn6vmab4aoympjd3omppu46jkq777axid.onion:8333
+yfxz53gdbxu5hapg3e5kaa5pyxpbrpiql6j7sfe4i7fqj4blpqpufzyd.onion:8333
+yg5xbesziuiaigwyxjrn5c5hvj6fxef45edl7pir7risnr6un6esjtid.onion:8333
+yg75fc53cicbsarrpfv2s4crpkx6vdjub4va7cvbducwzhsf6qehx5id.onion:8333
+ygczn2llqhks3ohxvfck4ks45ekg4xr3loriyynnejw2jfmi7hjsfead.onion:8333
+ygdfwrg33s3qwiarwxbejalkirmqui3wjz7wfccprjry6bm5la65vhad.onion:8333
+ygh4hx4ugapidwxodkjr6vgl6vkaqvievk2eiie7v3ewuvjvg2mzp5id.onion:8333
+yglvvnb3dk2vh2wwgpcnvm6t4lgbdhnvpy4jfj3ee4ugb4xzvjrrcfqd.onion:8333
+ygospbn7dc5a6haqur4eoe2oj6jttjohs43rhl5m22ltruh4fz5isxyd.onion:8333
+ygowwz67kvvri2lcwknsc5xjdz7ffat5tqkm7fmxrrzfgvqnxoxkvgid.onion:8333
+ygwuwz5autfc4tqluyuoebghc7f6lgjykm6oprynh3h2vfp4xmhiapqd.onion:8333
+yh4edjvpbo55vsankh7e33u77ep7eah5h5gvfgu7t7mbb7kkmjvgirqd.onion:8333
+yh4uoyfzey53dnoj6zm3frihhgwpqfqkw36sjmqsvfnl3rqohs52wqid.onion:8333
+yh5us7dk25ttxkt6miers3bazlm3jiums5nwz6mzd4i6kn5oizjccuqd.onion:8333
+yhddybpp6lgu34i7uurdqg5jznfdajwr7co3twiqf7pgnj4yjgzbnpqd.onion:8333
+yhiswltkrs3upvkrygsuiou5i2njnyxk3gwtsmcr5yn4lfinzifbpkid.onion:8333
+yhjkylctf577degc7ufffvg3gsdxgnx64pdhzfujxjgfhbulmtc7yaad.onion:8333
+yhnzb5pmcbeiqs6bxm3xvzdy2dgblteiswvvtg6vhkum5gjjw7abjzqd.onion:8333
+yhqytulgwdtvozjhuyod2cufnkbh75mgyw43k6w63ah2fzulskfssyid.onion:8333
+yhtxfuf5zxqoqkuodfpmzsnnmtm354y5rtexqplt5l3fkzzksjkkzvyd.onion:8333
+yhvyxjfauptpsjrxrf3oxtv5zlju2gdpitwsabcmj5gdpjr6i4z4ulyd.onion:8333
+yhxcgpy2bwwhhpmgellyghjpkw7cfrjlq6trq2yl3632rxerwbmkvfyd.onion:8333
+yi2k4otmwujg7bi5iw7ewqntnxb26jyplx5xyk7bjvvaut2y2mhcgqid.onion:8333
+yi32omh7hh54oeot4i2ze2tif4l4cwdhzxxn4bzmtqrotfxrepttfead.onion:8333
+yi4gxqy63csutkea3zss2oryz4get22hcfginwcejy65g35ec5t4uzad.onion:8333
+yi4nvghovjd5bzcbhitvezh4uwg32n6r23et633odlacu4eamfym5mad.onion:8333
+yi5x6isngj7pivr5wt6i3drntlqsvbzijpdy254lbjdnihxmfy2cdgad.onion:8333
+yi6umkklbb6vr4j75buoss7kqkgcsdsx5fvgi57h7j5bzuleoe3ae4qd.onion:8333
+yibgffpo7dimyvjlbzfr3dnmnl2r5hbrpxbtcpksthsko6udsrk5uzqd.onion:8333
+yiiyiuwns45zhmkwi3wjumqhnyfkwkahbggd6hrxtnrxfqwn2vdx7pid.onion:8333
+yijdxmlgnfcwrb5zxvchjhgtc5357mecuopminujkono7bwjgqu4acyd.onion:8333
+yise75jksg27th74bxo3a6rcr3huvromhmuhnmy3n3ngcgfpagq445id.onion:8333
+yised7sf3xzsnlggeuioas2of4crrllkpz2gfbdy7c5cysa5sxi23lad.onion:8333
+yisvuvmqtn7wht6dndrqzsdl7vuspxwrmfwwu5o7wldnzn4mbzeb4yad.onion:8333
+yitceyo3wv2mk56omv6mon3n7dcfr7jiggdmzlmtikpoam2otiey64yd.onion:8333
+yiuesqqc73nn7kxadavmlwc7ymciszzk7bxs3bd4fwucaocme6qb7lyd.onion:8333
+yiz7d2lkgk2mftp6i5e2tqhotqkqjgxbdmzbnflwvsioyfydqrvll6qd.onion:8333
+yj3gs4nvumsfztawn7ku4cmner2zlmcn5kke33g4j2vywxsrqmbd7kyd.onion:8333
+yj3q4iustxfcq4bisbuw3jvqc7ph2ggld56mvyxqvgw2tmsinbwlnzyd.onion:8333
+yj666fxjddvz4xzkhtzhh53wvkiobvildczzxb3mixjipqqiqaz3bzid.onion:8333
+yjdhdurh6vqxuykgmuskpabjzjni3ehxxh3zq5redu5hqdmhdw5b5jyd.onion:8333
+yjkojvjsg6yhfj2ln2bpcrh2e6fr42ul3yzsebbz2kkytg7pf2zzjzid.onion:8333
+yjudzsswyvfqyeth2eghfvegxg6z6ubnx72kmqjljhdewrckw56lggyd.onion:8333
+yk2foofoifxgbrp5a45okwbelrsvycgqgw24xv56hmuqxlpmw6msndad.onion:8333
+yk4sercvyzvqxgbgn7srm6eeivlzoa3t4sz363aygcyciubcieihhxqd.onion:8333
+ykh3t44zjojpj76ouqeo662ljhyc2t6e3mike76iqpelcdztgaxuw5id.onion:8333
+ykkhln6x6hcmhyrx5rxaf3c5auh5k4plrpaisits63r33ecwkmtexhqd.onion:8333
+ykqehwl47hwypuhhuuxkpoexocldvllixqhplpsy6ym65vbjfa3yfbid.onion:8333
+yku2clwr3x3ndzfjdk3o4spoztoqy6ndatken5wopgapg7qkvypuqoid.onion:8333
+ykwrwuffwvaxlwivt3hlhyz2yo5xde7dw4x67ygc4xh2t6m4i5cftkid.onion:8333
+yl2preaby2yqyhmviyq46roapupmnijt2g3mzmvwtxptvybz7rbs32ad.onion:8333
+yl2stshaozpyqtut7m6ln47z2qhledknuwhij6kvxsuaai4nwy6fp7qd.onion:8333
+yl37nyh3vujz2fyrz3eoqoteixyiz3dj5rfnnmrglcgcswzbeqbjhiid.onion:8333
+yl3bo5zwwsg5dbhrrcjkvoyvwwxp3kbdgprhe6md52ob2lra7ynrbwid.onion:8333
+ylaoywooejvpfosewxmyxjhc2ahfepjbvuyjc4p7bymwirexlkdituid.onion:8333
+ylaprgwti4dsumx5xvlhul3esf3yi3ebyyubb2dwfgwe3zysv3e6nyad.onion:8333
+ylblnrd2jnfjtustl6yt6pix4mgqr5qqoevunmwk32e6fxq6uj3dchqd.onion:8333
+yldtx7o5y5jf2utrrtqf5yf56akol55wars2uwxuvjoubustrtmuqxid.onion:8333
+ylh3vliup6k27pt2thw4xgfguiziaosb5y3ovee4w6dzwcb6hc6czwqd.onion:8333
+ylsvnjqrcgatkzj5gfkwt6cz236z76yvgpeulggzml3xb7tnbsttjnad.onion:8333
+yluwecwlibf5dw2sup64dq4gs4cfdhtkfhoy5cszrvu75wljeqanr7ad.onion:8333
+ylyuglp5b2p65gmiofhe2irpxswlhecdecg7d27qhcwehegr2efmesyd.onion:8333
+ymgyodvztfs4nnijjnwiv6eadetxjm765iv3ryuyhsq4upnjwncpvsqd.onion:8333
+ymiw3d4klephwuwbkgdpllrs6hssb4svcg2um7sdm3hsnnksbnvj2vqd.onion:8333
+ymnypd7xmz2fka2r4yxvq2ibf7rvdyl6eemppo74rfehu2d2oqkclcqd.onion:8333
+ympp5jlakwfhj2bozw6w33qailkrqbroizxm3pdfxvjdbrkwtyx5iiqd.onion:8333
+ymrunm2vhoarw7rpo6jdmq4mev5hz63umljki65q2v327vmnw6wjyvad.onion:8333
+ymt2hdfgdxo2awvj2k4y5tbpvapj75j7v34tvvlrqy44lsvvdcnjx3qd.onion:8333
+ymuufa5br75liswfrb6pgm3hc6o67gnzhyg7vpfo2qsw3oyw7m7nsaqd.onion:8333
+ymxea74sswjyqvv7jsh74dnvimcsq4rnao5x5g7dfjnbfy67oj37l7id.onion:8333
+yn3avowdk5cox7qz34s3qiz2u5j2xg3irxckhzikfjv5ccjqrdiramid.onion:8333
+yna4zorq57ehghewlega7lb4zgx3t4lgv5k24orv7b4qcg27svymosid.onion:8333
+ync7fc7dz24s32kp6opdkbvohb74obme4jgo3rkkvjzywslxegist2id.onion:8333
+ynilvzuulga2tlv2hcic7ayc5qpd4nz7r7snsyejp4vxwnxlonf4gvid.onion:8333
+ynkv7njh6hj5xewxxy3gvtnu6ocyvu4tgrl3gnw5xxkdpfshalppqmyd.onion:8333
+ynqgzojvdwv2rui2rlechb22e5hwqipltusdnfkv7s65iz6fgrnybnyd.onion:8333
+yo4ykt7hngppavow7f2sz36ajl6w34bw6qrcfee6i3s6jkm6seove7ad.onion:8333
+yoat2b46hzeuhy7n57gjmfxgppei3xnzdxwsl2ipc5ny656j7zp6ovqd.onion:8333
+yobra7r3ketjuhr4g4cfdqumsez4om2eefvmgxrxq7wxnkouzmcemwid.onion:8333
+yogfxdco264tjbbeek22o26lznu2g2kwvs4lmft3ib3xelndagtf3uqd.onion:8333
+yomwxfciljad63gicbd5757og4lypcph5f5mqdou5kj5rowkyotaohid.onion:8333
+yon5gz4q7soici4i7jf2zaciusioym56jo2bat363tr3peoiurransqd.onion:8333
+yoobb72dyt62n5dpsu3aqpqa3lmfj6gfurno46o6vmqdbpwqw32ahjad.onion:8333
+yotcqynj24k2ckilo54hjhftjuvvwiacbzoraqc2kq5vtmsxloswddad.onion:8333
+yp3juo763dmi7ryhkv3kq2l262cllrru6ks5tlzcdlxdakmip3zosuyd.onion:8333
+yp47gud6fjsvjgu54oica4b3ij4zfreactcaon6fx7v7pfbxbrvqhtyd.onion:8333
+yp6klgnrvisq73qg4dk255h7un2k7pbk666jtzc22rxjs2en64ojauqd.onion:8333
+ypaazf2z3t5dqzudlygjjpyb2uvk63guovstzubsohbbeomometn7cad.onion:8333
+ypakyst4bbhh2juqd6r7xymqnrgwx3eajekpg6o5b4fazccy3mwovdqd.onion:8333
+ypkjkt4dnyqy6svecydigttwnsj5x643w6edk6qzhfo2hkxxu4ln6zad.onion:8333
+ypmikts3saaffj2uo5zmkbac5m7xnbblxkbhpw5xtxbamajqf36wgdad.onion:8333
+ypninar2hybv3jdovr7ax7teq6wpzvrw6n74csq7edos3hzumh2h27qd.onion:8333
+ypoinzgql3zo5d3strpmannbkdtndxkxlajwgcpaj4ngbc5mqrzzgpid.onion:8333
+ypp73pv2vcjfq23ltwhojuremxxfknwtgkxsvwe3widlaevyx34pepqd.onion:8333
+yq7s6pe7jzrzj5uxlorytwxd5bs4kljyvp27akdrpang765yd3sexwqd.onion:8333
+yqnal4phy7wz3lsoi23rziyb56bnbzvvypy2mg5ponzrk63qpyvle3qd.onion:8333
+yqoiqt3molj4ygq44zyme5gdbgee7catlf4ndjr4myiicduuwiev3fad.onion:8333
+yqvhbmvc45iy3drl7nceuhugdt2fevwx4x53zafio6h2626kflwtrcqd.onion:8333
+yrambbqlzkm6o5pkc5q563njvrkfallqobvscvpdik5owbdtnhbc5jad.onion:8333
+yrdtnt4lkpysyyrvryqhxw3k427gxwziosdtipf2dcifougwzomdfcqd.onion:8333
+yrlc4r3qfcr4x5wnciutrdvasrpahor3ui25lgdgkxbit3zwtmwfmxad.onion:8333
+yrmpasdjmb77ono4c6rjh24fj5gt7bbjx7nxurytkmxbww2gam6vodyd.onion:8333
+yrqolwaoxpa32cw2zegnaggmniuer66umflznja6dcp7udqpaoanqwqd.onion:8333
+yrwksigpx4foqlwnf6cxwtppx2z2msompig73dkcm34pwsmy5bwwg6yd.onion:8333
+yrybhm2es4siupjnyjffviemvqx24mqj5niwm2wf56spdqlwau44r4id.onion:8333
+yrzwl3rbfjx7eybyjvnjz2y7qmvpnkexkmylqpwsb7ivpg6ch42mmxyd.onion:8333
+ys2muyvcnpdadettzavleh7qrn7t6r7e2tobfp7yxftta7ez2i6rdxad.onion:8333
+yshp2g6b53ndeez34nxnk4bz6cqbzlfxqdggi7btqlwzxzuc7sweqcad.onion:8333
+ysq5rtpfzkz5gt2s62idbsd7secz3jepzlup6hqf5ttdutsdmwg2ryqd.onion:8333
+ysyx5eagwnqpfemz2nhwcxs2c3eueqk5f3jnyvyfqfno3pflcqfw6yqd.onion:8333
+yt2vub6llcegxuucu3iekjqfpmbyz4kreuxx4su2pqcetw7kbkbipzid.onion:8333
+yta7q7v5lkzt4zyp3m44cxcdtymxgmuqdntnagz6h3hwidmqoeavifid.onion:8333
+yti2ofsqg7k4zbln6aqx4zqaor2zpmlsebyljxlu7jczsjqtd4ctd5yd.onion:8333
+ytkkqeik77zjjwabsdlctuum37jr3r2rg6ckxudza7y7tialqr2wfeqd.onion:8333
+ytq4uowr6vwyjmrjvac7aimjjlzylfmhqhn3z4ecenm5dd6u2ccsijyd.onion:8333
+ytqhsolk7pqur5cu2faxruehvx72yiiwb33p4szdnzidjqksanps3nyd.onion:8333
+ytqzrm7fke3kqgh5b62taq7yyejgtd3yxwaifj2pimoqbfq4p7xi7sid.onion:8333
+ytrhvysmp4iq2qumdrpgp54q3ushkf53b6i4oxpddg4rmlk7hbayusqd.onion:8333
+ytyn2e3bkmgavrygpk5rzydfdmhpkercccqcaks3xtnbgq5qsyg4euyd.onion:8333
+ytz6ov6l5ofhjudlfi5k26lsg4v36p7xwciafy2sdau4cn6ozxgmefyd.onion:8333
+ytznm6jwapg5h3firimqb7ao2g7uihakg3gt6hcpfqkkgcyemklfufid.onion:8333
+yu6ilgxjfffdb3fq7srwwmz6ymp3fxberstpl6vdocmxbrrf5e3tw2qd.onion:8333
+yu7c5kjgmlci4arofpgq5d2qs5fvbw3zac52nampn2vc6vximc6qovqd.onion:8333
+yufe3o5x7spybs5tku64r6hzbrc46uq6izky6z3dyvba2ymblvehyiid.onion:8333
+yuhebtpb6urpsrr3g3vk7tcl5lp5dt7kcaj7zpgox5r4x6ptysxzvgqd.onion:8333
+yuqoihr4p76t2yupxuciurcpzsij5i32enjlsynqor25fhdvidx3djid.onion:8333
+yux32z6r5leyhbdrgdpti4sggxyoy336qb73ia6sk5egfli5qsvkxvyd.onion:8333
+yv2ezeqqfeoprti36q4fds3ckq43vdv7vktqfpn2npv6isnbxay47hid.onion:8333
+yv7ainbyxz6wejjhpjgzx6ghcomdwd3k7fclru4woooxcovyjwrp7dqd.onion:8333
+yv7llcydwvi2m4xpnulhgxcrje6vswtsasu5bbmgxuk3lgln37tdvbyd.onion:8333
+yvgzvmh4ngi36zvn7pe3bocsxj6pccafh7v6wmswkdobbxdzh3b56iyd.onion:8333
+yvhvl5bvjp5ljmooujmw74wdyqnhvwlm44766wwgq5thnzctyni6yeyd.onion:8333
+yvnppv3n3hwexlvugfviwv33ycavxdwnh24dps5vp3y7kw6kze36v3qd.onion:8333
+yvsokw66m7kqqqjxb4mntjvwhnpoovoec6rrpqtdze6fdvpbtvt4iyqd.onion:8333
+yvud2f6wb6puec4xq3a6yruax25jydqepowhz65uvlbvblsyi64skoid.onion:8333
+yvvodwqb3szlgkx4egcyq7qmhpyoqxdyxdnksxl6ppnmagnsu4noemqd.onion:8333
+yw7tqaujnglpjmjak5r7sxvjg4gqeubwetm5h54e7fbfn7yx7kgr4kyd.onion:8333
+ywbprsiodgtlc2qoubvot5qm22logutr2dbizmlond4dcifklaxqlcad.onion:8333
+ywkxlaydopi6ygjeggtv5znptkrldzsh7peg6wabkjmcu4k3hmbjivid.onion:8333
+ywmh5zcx3r2rd7zmkyx5kymgxk43lsamie52kbhayqwqyod5togs6aqd.onion:8333
+ywq6oxdfdvlict3cuasd3akvcl47iw6bxykrvkalemrcyqzyzclbf6id.onion:8333
+ywqkdkihpzr3hx6la2lzqsguoqbuwkn36qcrbkhvltd62zdrguprljad.onion:8333
+ywqp3kjwchkto24so4nn4ofq5m5c454btnkux5jxftkkqz66ducu3mad.onion:8333
+ywqygs72qzxbkjekezlhsnrsfnnvm66igkovfoh267ru7ho3qtxtalqd.onion:8333
+ywvpyur4ny6zhfxpsva4mh6cd4htw4q7ylx7tissnxehwg2bid5fumyd.onion:8333
+yx3nnyxy3h4ex22uqdjwephoprte34jelnkpr4ua3d23ks7qxjrqzoqd.onion:8333
+yxa2iu56fp4i4mxzdkmv7xxrluyxtkylqvexuceivx4fqxbjyzme76id.onion:8333
+yxgvp66ll3c6ko7w4hm7xvzofd3cb3ku3jjqc4wihapnyk3wxijafrid.onion:8333
+yxlaxiaatyfnrx3l2vhb4p6d347djzux75gcl2d33aydlwspo5w5wpad.onion:8333
+yxlwpmsjdbpldhi5hlzopision3iqbjzpvyaaeb4yst3z73qbgqy5fad.onion:8333
+yxnuslj7hslwmofh36a37stlm5jjnq46vvvyntf42uw3zuouot3sjaid.onion:8333
+yxq3bjwdrck3lflvwixj2fc2l7pzqnea5l7cucviamoc63a2xozk7iad.onion:8333
+yxreb5ajudnpt3b7z5hyizaj6ufgd46o334wtduuyaakboxwztgji2id.onion:8333
+yy3bnszld2tbbyd45f2j7btrbdz2p5zsuzie27liqr7xgkfh37rcojqd.onion:8333
+yy7rusheh2cq2xghpsdzlrx4gpejgfvsfhq6333d2jttcovhh5jo44ad.onion:8333
+yygxdcvyp6tn46umpmxlsgsi6crg2xjchuhi3okobofsx4dqgwucnnad.onion:8333
+yyo5s4r6wr6p7l5p5umlp7xgb47ugeptugscv4gvpsxvjlwymfpwruyd.onion:8333
+yyr2peqznujer3t63yyhlcasjndbhllvtxxkmcvr7p4yxpuzjrcylcid.onion:8333
+yywmc2hhk7t56e7jun62oidqft6jvtvvlylexihzgcrtkzxe5axsd7id.onion:8333
+yz3izxf6pdtr3ucbriuo4bpgjn2visad4vgocktexnpv3rfgar3kydid.onion:8333
+yz4l7aqcjf3lcdtdcuxoxljedrcrlo3lu6kths2bvjeoil4wqx3d46id.onion:8333
+yz5i6sldywr2mqzh5qmwoqfgsta5f67bgdhqogejjmpengl3llafdjyd.onion:8333
+yzakgornrhzzenpclo4ahyai5lxsg6mjq4zrwlhqt3ff4sblxi42jwad.onion:8333
+yzbka2sygb5eqgrgk2svqin5hl3dfknzfdn6wzwncexsejmrp5wgm4id.onion:8333
+yzh2ineefkzohck7vkwcfe62kvplsly5xn4dmm25fpxbjq2va34bu5id.onion:8333
+yzigosfexpco67cy3e32xehlpwor37fp52my5pwtr2xsnj3mxl7gfoid.onion:8333
+yzijb7pu6mrrdwb7sku2e3epfyrkhl7t2a723vaisqulr3roaxoy4xid.onion:8333
+yzlai35raddd2kdjnukns7u5t4m4ngi5dfrlq72e6lqf2hp5dzkuszqd.onion:8333
+yzo2vz4kuitm53zwynkm7ddfdw5escsp5fp7rgf6uspphe653mvdekqd.onion:8333
+yzqfzw7fgzzs63xpvsgznhnassxcadbfaxxaxbmkffvesgdxizhxkyyd.onion:8333
+yzrw7ukful7rhvlletmabm37wupkhsxwo2esqqotsoh6gxib57ss3tyd.onion:8333
+yzs2bdhwhxfgaozpcic4v66w7wwlxrr3v4xpgzer733qehcwewijipqd.onion:8333
+z23pfizxwpae2sbje722iesvd6rcxntazcaoefabzsudkc4xxmtbqoqd.onion:8333
+z2eky4p4ozlkrrmuq2jqcz6w2k22re6hxrm3um4ypcnmzmpsi4p6l2id.onion:8333
+z2eo4uckd3ymgtsjitag7yqukmjsjpwuf3d3npq4oskeatpkcinxkcad.onion:8333
+z2gnzha7ttijmle75dvqdzaeqz3xyxzjrrqbzribvwbomh74je4xeiad.onion:8333
+z2ihxne7lyodwglkwpvdmz3a6343msirrvjmaf2pytuo3jysabrkiiqd.onion:8333
+z2lhlshxak5owviqqzacj73ioftqmvq5idawmrgt4k347bwr6yubmqad.onion:8333
+z2njilhjl33youet5rbdfmncadpt7tohtconls3qhpvuqfkreoteqfyd.onion:8333
+z2nocd4haqt257cyr6festid7enoe72qpmu27cuvveoon4rcak4femad.onion:8333
+z2yjvxbv3rfpso4cjkxc4i72f55xb5fihthcdbvh6dp7ghxz2q2tabyd.onion:8333
+z33gr6fni32nkhfmkovcbvpuk7s2atoqfbuzdgz2jszh5ua7zdu6uvad.onion:8333
+z36427rantiy4ikleyihwfwh2ga3pyqqz7doezrzkyv52bi3mpcgt2yd.onion:8333
+z3asgzuzdvhrrejqjnkg5qfeynspuwzzrl3sr7seqxlwkiemnrpsrzyd.onion:8333
+z3hdtpvmnaz2izvnlopzmfgdb2synsomzgy62h7vlxvsn3yqhgufqjyd.onion:8333
+z3hgdhj7zxtih2gkjlnex6occtzw3tpd6f5eobwrntrhxtiww6ke43qd.onion:8333
+z3jl2izfxwfmqnbbrac3tustn4bngymj2tia2sn7nuyconbmjskedtyd.onion:8333
+z3m3a6wii62jc37c2fw7huca7mu4eywnssindvhn3hrh3t4y4kwj7dyd.onion:8333
+z3od23fobhkvypxarneq3fqsdsksjt3hmujnlaiwb65hdwa2n5xdjiyd.onion:8333
+z42np5zjd3thnd54h5n45ibynz5vb3flbgypt4me2c3bnvntn4rsgryd.onion:8333
+z4d7f4dvqutzvvqkmj35znzpyorroqg53jhbft34gyk2h34wzorv2rqd.onion:8333
+z4gvqymmj5jmg3dnao7k3vc245pzepqcrevzyh4s5xn5fcc6ape22sqd.onion:8333
+z4mmpbj7md2ljj2nzbk5b6stdromp2sxhysdexiq6kjqp2go2yfhlwyd.onion:8333
+z4pyvdupcieuqtzvhh47sbiahdyegvpgtwgfmlvfsrm4yj6g5mt6cgad.onion:8333
+z4qgvajgk3tr6aomi7zkpiilx5xb6tvavupvw42sgjf3bfqrgwk4tjyd.onion:8333
+z4rgrsudz3wjx7uykg2kmcadwixklibr5b4k5nulwrpxcjkasu6gnjqd.onion:8333
+z4s6g5bqdmo445vu2i6tcm54zjypfhl5uwnxqjq764bbu5h37gkp5gqd.onion:8333
+z4zr3v232rayjy7e4wuxxez2blz6p6apyv4souxjztqnv3mvaytb4nid.onion:8333
+z52bx6657mva3yjtrutjhxojkbwmrmndk3r3nptxc5xqz3nd62frfoqd.onion:8333
+z5ecnh7crpgo54nfll6qbwl4ybvfbq3izazsdu3pp6zqkam47nuux5ad.onion:8333
+z5v63i7lvhkfdqcex3ioeny62glxhptowtrfof54qbl545mlchkul5qd.onion:8333
+z62kddfut74o5njyehkdlj4caa6yg5orz5lznaccpbloqq2siiwbtayd.onion:8333
+z62r52qegmgv4otygobjdsubc6jffaei23he6n553akc4wnf5ryur4ad.onion:8333
+z63d77gd7artekfeamkqycni7tzrkvbc54fqr733veuoaqx45jwmytyd.onion:8333
+z63fpitzdw3ot62wtxtindh5334uatz2flxg6ronyy6jwx2ztjs4meqd.onion:8333
+z642d45aauehr2ycmv4ewv6zkwjlvlhwf5wlueuy5ynpu4qmffc7utyd.onion:8333
+z65lbxuvo5x36vuv5rgwgyoplqjzzciwvb2whvo3tlghzhp6zij6grad.onion:8333
+z6gr5c5yrp5seqsw73b2pkn3i4aqd5idmzgidjchjjm7f2hdgfkl4fad.onion:8333
+z6n3h75u5kkd5xkqfwbqasd2rekxams3jinrrqaj7p33qdxq7fdlmdqd.onion:8333
+z6n5kkyabl2huqtcp332n6xbo7kpilcw4b64govztw3swtzulgtxcjyd.onion:8333
+z6nq6lkmjoyjhqp5j3tg2gcjq4e3hgduo74unmtmnybd7a777hp4asad.onion:8333
+z6nuvxnjicev3v47o4vxjwakfz6g3jvyo3l4rds5qqfjptqie5re27qd.onion:8333
+z6okjxmclwc55pbwioqx5wyua7rjobcmbttpte525tlt2gexjcjtr4qd.onion:8333
+z6qmf32mld7uqjmx6hroqnkieerstp3vle3u3do6odxig3ubmv557qid.onion:8333
+z6s6t6bi4llpuod6rnakc344wn3h6ejpfejxrkjohjjy246shwfd34yd.onion:8333
+z6soa5spkni5ze6p2xg6lnehu3d7hnqn5ddiy34jtedwegf4syqnnaad.onion:8333
+z6t6fxwhgndvi36vra6d5duaryx2m75v6a5yoz3cqjlj53ko4wm7fhyd.onion:8333
+z6tmafvqwf2sd4rchnafg4urcug4xpkylwls2owruyifaduaeneyqkqd.onion:8333
+z6u4s3uz6bxke3tyibyccbg7uaxt4cb4dued3cu3pbjw6frqc5nil5yd.onion:8333
+z72rd3arkarr6eehucg7rrkjmvqnzdbjmppfk7zcvzd7jqrvisf7rpyd.onion:8333
+z745wkcll7vkkrx7zamibvbyqjtcp3y7wdz5kd33gijxfz54cxzg3mad.onion:8333
+z7eb2xkiigjdfay4ch4pubeqxb2jwyzdb5fo5owkbteyhefek76qoqyd.onion:8333
+z7f7lrvup632wkbzinvbkyyrhmguaf4fzt6zleiynk2vuvwdwt6ysnqd.onion:8333
+z7g3tx3nucmd5ozvs7wgq4i2riiufxlutv2usowr3p4lixfbx54fc3yd.onion:8333
+z7g4iekn3i7nliiowlt3ek7o6xlhi5tv2hofycacjqkpeoijghmiyxqd.onion:8333
+z7j2lcfj5b3isqznsb44ivi66lwmidcfspmvdrmhbfuyub2h3wbmnkid.onion:8333
+z7jbbwkyza6e37iqos6u7ln3nedom5i3dcnowdscr7wfj2xygre47aqd.onion:8333
+z7jtpaghm4na5po5p27fwbdh2aq3z4rkpwhhzemlrhsoefru2z5eyvyd.onion:8333
+z7m7rmzhol6swqnk6l4sadrjgxwnggt5zwgp2jx6tadca74o5puyuyid.onion:8333
+z7mcuih5vw5qob6o5qg27jhozuczpqx5lmzl2ghfxra53tov2h5xtmqd.onion:8333
+z7rxmrmvtsbgrrwwh4k37bpkk6dtu3aq7f5d442ys75nepy6r2q2xaad.onion:8333
+z7u326iowflnv6tvy6uiwwkusx4vat5gdaxwamcp6jd2we35ih6zplqd.onion:8333
+za6k2u2t22ohdrpqbirjhl75eadxcjvnqfkl4bzeygbnliqsc45gplyd.onion:8333
+zabx7shizdfchrfthsjcuyypqy473ni23ebi4aedow4bg5c4tl4cxbqd.onion:8333
+zac6qhbqbb5yo4rvcsmbilp33odkzfwrftwma4yo5hor4brj4d3ksiad.onion:8333
+zad5dkykkoelu5tdj7l7mr24pdf6eos4o7cbs5nvx6bcg5443eqwaiid.onion:8333
+zafdafmd2h6ue2pmuj25chhmkqad3jdcxwtaess2opxkrroopwdqfvyd.onion:8333
+zagkhagdzvkgpuo5znflvxcqxal5tweg3vsaoaonsvsl7r7orhlwshqd.onion:8333
+zahrvinucuxpxu56h6nkiiw7cvutxrua65l4jynvwkzt2bzmeuvdpuqd.onion:8333
+zalrhwuj5j47tntffl77xrdehzfwq7c7duhaq4jwnq5vdtdtajwiucad.onion:8333
+zaw7gnlyeqrlpgcmsp3e63anveudschhifaaezu3web3z6pjjdtvviqd.onion:8333
+zayfuym6j35mxprdsm2x7pvws2vyaoinsomdbgrqbe22rcc77j7jtnqd.onion:8333
+zb226sk3eljxccaswfgouu6mitu43sf2dan4feygrqnlvrot6z65oxad.onion:8333
+zb2qixzmsethowd6fqnwikvp3yeeeo3zvhgjmq2yb27tfslscgkp2zid.onion:8333
+zb62u4o5qzst7rzjaq6tafgzoybi2ncogcjp3sf7zbto7b2xmicwvyad.onion:8333
+zbci2c2pkku7hwg64ek4z4cbyn6o5bnzpzyriqwjckzgs34xmu62szid.onion:8333
+zbmhiorqlldelgniyhwogswpvrlcdjqxxcfm6vulenrpwiadvv37anad.onion:8333
+zbnovu66ikceaodzrkpwww4vop6iwvtebbeznngo2mtjkikwknqzgrid.onion:8333
+zbwbqxytihkvupc5zhezoh7oibfb7bopfcw6y4qbhh2kugnsw6zur4qd.onion:8333
+zbwpgu4z2lfuto566v6duz2qw5kkyvor37rpihk244bfjzqiuohdcyid.onion:8333
+zc2c56k7hcdux5wrlpixrx6lfutylfamr676tu2nr5z2vf5gwoyzrnid.onion:8333
+zc4l45jx3txlag7hduov4su5kl633sykaw7guioejg5pq2qyuescabqd.onion:8333
+zcc4wsaenndkzqdp4xsfzn6ilsdhwzpqiswumdc22dv5ejejec3o7qyd.onion:8333
+zcdv7z3vetrpeo7souyie7u3vyy6w43cuautaogldhs4n2fitytsihyd.onion:8333
+zcezifa7mmgv4voul4jf4wbqmr24djgrskwszktkt5hihywblltpahid.onion:8333
+zcif26i4yzp53k3uedswyrqkdmsmkflpmclmasdo6hat57pqjpm2omqd.onion:8333
+zcnl5vojc5aufydmssv4yxeotzeqpvyoxyae4kmoskty77j4dx4aykqd.onion:8333
+zctnwv5ln3yktcyqsbgie3qcee33x44b5quhjdq4zwjprl75r3snduid.onion:8333
+zcugrsfyxb3y5ucbdndifvt5ilp47a2233sv42ryf2cvzoncrgo2mrid.onion:8333
+zcw6xk4bfnl46fx3mkrmlnknbwnpssxsp7hlllj34fdrkutzts6yepyd.onion:8333
+zcyumipuaiotm5fhffmhit3ajzrgqihhibh73lvjo5hdt4aituudguyd.onion:8333
+zd2mgisets23i4mslxjl75froqjygtue4lnoq56qk3ohd4qcxpop7pqd.onion:8333
+zd3fxn7nwlj76qyjseubm4o2gs73jv2g22px6t24z7p5oeogqe3icyid.onion:8333
+zd7irysta3wti4efbjq3di2jfv237nhwotupj3rtufvvav4e5umtkfqd.onion:8333
+zd7uq75dlcseq546lmbqymh37cninokajwkixpvupillb7fgpqgbwjid.onion:8333
+zdi46azujxcjqa2wnvdecld3bdkps5erbodcvw2mn424gk2by5mterad.onion:8333
+zdm5zxotwdsma3jvij3jmlke5wmblwy7qa2kikfctlzltexx6l35u2id.onion:8333
+zdn24r3iovbxfkp5qx5ng7ribn4cqm4v5ers4olnbzugyp2gbhd56yid.onion:8333
+zdovdneke7oxtxdnee7f43vcu5mjzoa5m4bexpxgvopa5kaxyrcwa4qd.onion:8333
+zdovy6gcj6nrmxaygnjqf3ym5hbd3s7h3irznsbrjmgdywd2rkj2m6ad.onion:8333
+zdoyjklv576u3w4paxyjb4jmdhx2id7xoqkd7zn3sspodasmmazbbpqd.onion:8333
+zdqon7u5ofin5gy4rcmkixc7u42xypwklntwceohpektisokskrn5gad.onion:8333
+zdqxfzqxbaa654nsngnaqdz3jfsfe2u4hxs42covbct2dou7z7jpa7id.onion:8333
+zdtchifs5gqldijr7vzcgqqaftlcydhatm57owdwzrgudns5vpdcx3qd.onion:8333
+zdzkcrnoctqhn26hjbngpcl54nmvozbodf4gwf7anfxjrwhjxgurrdad.onion:8333
+zej7mizjlb26qecppzvgyswervt7ov6f4x6fwrot7obvab23xsv5jjid.onion:8333
+zejyatwyaptvvubp6b22cpow3an47bsrve63l6rerkldmuwwb37b74qd.onion:8333
+zepqddw4zaqqawkx7aqezpqwykxmxxeh2opnl3xnq2i6piazcvyb6qid.onion:8333
+zeso2dbskp3curnpgug5mjyvhs7i6rero3zbqo5n534wccstcok6ywad.onion:8333
+zexnlgnfxldyx6leiqvyhuimrfxznjfjoko2ek6rdtu4dvwkvztfysqd.onion:8333
+zf4cm7bgv4qollcjcj7kpx4qrtqzcsa3q7sds2jc3mxu45gvazlts3ad.onion:8333
+zf4k4efdpcwsfyobz444dgdfnsa6tdbd6aor7p2s6mpuol3ladssb6ad.onion:8333
+zf6nwlrrtd6q73svcimgfp54pinn46hbcriqnqqsitz3fbibzmkev3qd.onion:8333
+zf6tbmhchmzo46lmhx6vu3smjj3y4hjjrv4lnwpa3uq7bvtjcwapmqid.onion:8333
+zfhx5nerqkerm3jfoq4763vlmay4pifit5a6a6jtcjxpu7t4galhxwad.onion:8333
+zfo72va3rnioxbhh4kuth4epqwqque74aehlonvde3re6mvhz4uzgaqd.onion:8333
+zfomias3uj7w6sai3ty3coxhnb6voldudbeyldgyedxqo6kfc7rg7sqd.onion:8333
+zg2yslkwabguckkqanyxwbncrtozc2fjivsyesrcd27xxkowkbcwnxqd.onion:8333
+zg7obxhb4c4j3dgzg47zffbetclv2so4foyutdxizfnedhdkhjzo2cid.onion:8333
+zgaubbm4h7qckt4pgtp5zawrcf6aazby2zk7aeo5xsqpgwsc2yrlbiyd.onion:8333
+zgegpxbr7z34gupenib4tuwywyk4nlevo5dkfg3jt6c2jw23len76qad.onion:8333
+zgjrto32gianyp6i4gc73nlilodiqyo2s5dkr5ev73yq4qvcjxkwycad.onion:8333
+zgp3f3dmwbnr7257rouxkgddijr34keobzrtk5gkm2dgfbw2bylcwqyd.onion:8333
+zgrpshddeijmdp34xfyw2kz22la4jxgwce42pupjp3bo6xtchsorrxqd.onion:8333
+zgvklnnz2avqcnyiffw7t6umb3is4tfthnkzbhnyfr76sjtwu5u35pad.onion:8333
+zgwclfbi25s4ta5hfiwylboeitti64xzoan5aewuqimp5j55nye663qd.onion:8333
+zgxg4d4jifuihgozqblrt3kjkrh5zhbr4uyivtrzf2khnbtbe4z3qxad.onion:8333
+zhabxolberrktnga2eixvhe6vmaoxour3ktd6jgjq3emzkgthsmaq3ad.onion:8333
+zhapnpxpk3lmrfsmhluytttodeosmie7yabywa3aaxmtkreh2lmeemqd.onion:8333
+zhdd42th33pv6qnfi7v3w3gddy3tlgu6pjo2bhh5ezuytutxhivbtqqd.onion:8333
+zhea7pvhuzw4cte7pkd7u6lwjyiqczxi7wgvzhfovtjd7qwdc24pleqd.onion:8333
+zhgdvhnh5zymbwrmd2rfjncparbxfiyraqh4imk6kl3tkltgccl5cgqd.onion:8333
+zhhkv5u7pxuu36y7vzu6wlbjpd3wftxfuadsst3ifs3q23eydmako4yd.onion:8333
+zhhxxlz3wvdaj4scdetokkqgs2ndmdvyfwq4qwrn3l3hv2iftlgsucqd.onion:8333
+zhrzks7gkdvyef6s2aogxxuw7iqheixmrdzgkqotpvl5bjz4vq5tkkid.onion:8333
+zhwmsba7q6vn4yfi63p4tc3dobsarso4322ynl5ofggjbyiozefttcid.onion:8333
+zhzpumb4itgdxy53chqowtu43ru23ag3f37r77ydjs3t5o7bookfe3ad.onion:8333
+zi77cxawtknqkjiod4rhf7gsughbvv2z6e7mg5kax465uc4vtg4cwlid.onion:8333
+zike5s7xtcgp6frbjgzjhcz6gsvd3pghkl2jin3sdasrek3vy7l4ibqd.onion:8333
+zip37ysefmcbnyqvt4jiag6dj3h45ie7h56hmw7ktheotkuagippyiyd.onion:8333
+zipzgdr2m6gmjfucup7xpertovt746f57hrgb7lj6m4rxeniem6zdgad.onion:8333
+ziquiv5d3hditb2r2qmt7hn7knosdcokxe3khj3kgn253l6cynl62zyd.onion:8333
+ziyp62u4xfsuljn5ae4n7jea7wfd6vfutket2e73bzrhpstozs5364yd.onion:8333
+zj55khmgsehm24efh4nmye7oao3u3l4tjuk5edghey3mt2ippfste7yd.onion:8333
+zj7jf7o4b3qztdorj2stojv4us7lzqs37fbubqpqq2wu4dxi3cxpa3ad.onion:8333
+zjdf27w3vt4rpyb6usa3r5yi455svyaha4qtsfwvyrmf3hmz5hckbwad.onion:8333
+zjgnxih45rz3kalgxvhyebyavcnohmoa3bcnl5cwkmq5pmbyypavqcyd.onion:8333
+zjx5rmakdzormbwzl27w4xcucehwiat3dnncoqdiwesbmb7dg4fpmgad.onion:8333
+zjy7d5t6rxljc64pvta3hqi6yxzfsnixtbslafamoxiiw6ptcmv3kfyd.onion:8333
+zk3cgisxp3uxevuxmbzbmqyhvkhezspeydo2bmhu72b6mw2kl6v43fqd.onion:8333
+zkc2lid246a5jr2dpxtvmtu2tfiwt5dbry3xybu22b62vguco5a4qvid.onion:8333
+zkisbl3pv7dsz3szdawti4r7mhrhssqxf3uopi3vrib5dpt6u2u7ckyd.onion:8333
+zkjnuuenigzhs6d5y62jct4tira6fzijqx2k3yzsdsyulut6ywp5muid.onion:8333
+zkjoev53w4e547zot35onpmij4fiube4aomnysttqtv576zdr7wex4qd.onion:8333
+zkl2fsiisu3cyhhsua7qlr5afhyvmfh4qmapgubioyhoepqdb46jceqd.onion:8333
+zkl7x3u7365zj6opig53dxtty7ctw2ijidwa4lbdbhcv3wkld22bvxad.onion:8333
+zknqouk6z7g7h5y7rmycqb6sgzykylbbfpvf5efmzibww377iminltyd.onion:8333
+zkq4fgcc4bxksbsi74pjwjfby5tdwn26yhjnmewy2qy6a3l5p6bnaaad.onion:8333
+zkr66xkrvecgu6jkyan6nxvtefynf2mpsls5csvf6lt6ltqvoscw5yqd.onion:8333
+zkxe2fnm4tsmbu4bdge7i7j2cesfrq5oznfzobf4mwtejbhenp7ubxqd.onion:8333
+zkzj45moxjhjvrzqweh5g3iyucdb2qaqby7vdtmlqbvxmm5u337aglid.onion:8333
+zkzj4uhvvpav6ee7djkfj2uem6tyswi7idzupkozspbgr2kfvrk5biid.onion:8333
+zl27cum3gly7nfhwl7ulnob6pyichpxglnss4ffqv3terkquhf3dm7id.onion:8333
+zl3dx4nswje7l5p2fgvypve5wugfqtcru2ud55qo77tqdp2btm6kp3qd.onion:8333
+zl4gt6uafawn452rlqb4w2mujut5tjcnq4ahdr6ucdyeu2gtzlsk2jid.onion:8333
+zl5voqvgyf7deglpxamz6hpg4bierfngqsmmu72wpeut7toja47v6bid.onion:8333
+zliat4frxeuirx3nbijcljvgr5wembicg26fdpgda4pnps4oguaobmid.onion:8333
+zliy5o4uqgpqj2nbgyadqnlomnjtmdlwoxcuduwcfavzsguj4z4iwzqd.onion:8333
+zlkwqytpxbhkg4umwpqiynz6niefzqjbiwzryg2zpwwmvmw6pmssngqd.onion:8333
+zlpztcqey4osd3omtpsm7micrh6jrxuqzeeendpngk25iyfhleieekqd.onion:8333
+zlx2jkuv2iuzffo35hc264rnvoimzccvtlljdbmut4es76qe5pnvs6yd.onion:8333
+zlzhg5hipy7nc4ulsaprgro53f63mjj7je7m5xptgkksibgvbc6r2fyd.onion:8333
+zm2j2k2nl7pug2amadjkrcgs5omdnxctyl7b6kmlywsphcfl6c22gtad.onion:8333
+zmfmdmzlsyy7owe6vpgugvdq664vjhluqura3skjlm6fzpgqe6udm7ad.onion:8333
+zmfmmn72dg5jjkovy4jt56c6btg7pgp7wmeh547zlvavwmlbrbsl5yyd.onion:8333
+zmjncrrwtui476nyn6sqbp67bvgdhotllq33vzwygasumv6d2us64iad.onion:8333
+zmmtddrew2mjtghs7zjiyi2eelmyss7miyj2axzwfgnmvzthx7phevad.onion:8333
+zmn3jyv5a2rod2udnreygi6uan4zq5ul4mhewyfyrf7a3ury72bycuid.onion:8333
+zmqvv2cdxjj3vbclq7l6rfdmjegmixwkxsnzzd6qezwp32vxkr2cbiad.onion:8333
+zmt7psgtnnqxk6tibhvwkdfuhtgtjatz6bpoyyl4ptuv3u6ko2b5o5yd.onion:8333
+zmtd72b4nsa22ocez2hbjsxxrdfuxxyghg3zjtqjob5sgnjpustat4qd.onion:8333
+zmuuhwxhoa6h53jijpb6mczcvtxhw6zyjymm53dwzsbmkc3kkv5v64yd.onion:8333
+zmvriguathsanquofxml7kgcda4tkihm5qked7a6ntbqk7rmz7qadkad.onion:8333
+zmvritlexdmgatfqjlexl7wsx3lmf7y3qxe2kqeergb7ntkfu4nky5ad.onion:8333
+zmyavuyz774c2fo3eb55yokivpr7qfxdpjy2t5wpeygunhulck7yxzid.onion:8333
+zmzjx42yxlpepdgya34rvwb3wc2peggturiedmn4sfjltgy6gjtspsid.onion:8333
+zn3gjkpqkajav76kaem2espqt2bw6ggfvmn4u3gmkonds7pqd5heqkid.onion:8333
+zn3mj2tggwpbzzkvtsovkrbdshbsvac7n676hbi76r72de2b4gknpdyd.onion:8333
+zn5purhx3rnikkks5tx4scnjlhewwll3uzcs4pgde3qeqawof3jefhid.onion:8333
+znaiehv3qrtloxdi5rkbs4eqpmuveazuftob3sqzw3ta5pyakuwhx7qd.onion:8333
+znbv4cupk7rrdk4rqi6xncbouhscxnqdlbxtltp7564isfv5vtbyu7yd.onion:8333
+znc4xhwywjqejoioap3ssxvtsdilsc6i5o5s2rnp2ecmxqe6xe2nh5yd.onion:8333
+znea5ol7qgniizv3og2gfcbxw2wi4qhk7dfkdlt7bbxpy5aflljygbqd.onion:8333
+zngxgkdgkqpfyepa5cvxlaxvlyluzdryhzmviar4ojzaduxw37hhdmqd.onion:8333
+zni7kioacgsy5haqiftnexr74sv7rzvgy5o6lmz6dy26vvwg5lffioad.onion:8333
+znlvmmj4dvpju46kbb6mob4kufyf5a4qivyygmjj36kymbaa4nzi42ad.onion:8333
+znmgbi6qlwwwdlizjxsc6eujnfwgytufu6guo67b54av4y6inwgxllad.onion:8333
+znmwoazdkcffprail6h4p4opy7i4zqomhpdxe5l5nc6ejqagvt4i7yyd.onion:8333
+znt2jb6nivjgl47s2gdcgac3merqjfq5h2n6x6mbjegx6fumtl2ownid.onion:8333
+znvkqu376ienu62x5hprstn36jfqxospcnfhpc3kq5quwcd6436pzuid.onion:8333
+znwekshd4os5a2n222xrllgjuyvsw7hsb2y6br7pkwjatywk5lerbtid.onion:8333
+znxkxyd564sfftgjscsmi3a73jsazxwhsneix3bgto4suyjx356xewid.onion:8333
+zo4fczw4drgcbsumtgmigjkiso4miz34ltauajaawqmqoa6oxmzy4nad.onion:8333
+zo5jasvz5qo7pkgrgn4r45twdic4zake6zpjfemj6x2ioxcwvs7yzlid.onion:8333
+zobj27bempyxsigdvawc7foivyyuek73hemep7zf2tajof54353ok2yd.onion:8333
+zodjfmegrevmjbppq2t46iluruefbgh3b46tbrl2s5qkprvbetk3euyd.onion:8333
+zofseltpp23n2xb6fsmfgkwgqggwhrelxmt7zq7toazybgehbs7d5fad.onion:8333
+zohxazkomcr5ggqlj2edu23zs6xiay7wfsrxuetrn2k2s5gwhwhcngad.onion:8333
+zokmgys3gsgs5oivjcqp3xiki25iexezy33ekzuratdz3j5unqpxrzad.onion:8333
+zosjvclhqzwklml43hvsdmupglajj5lfdb5h5frgym7hsqo25rwrbdad.onion:8333
+zosk6fx2a3mxkfaeayziiuizq3y3j3azzp4ylwyh76wq2sqtaenuwdad.onion:8333
+zovm6wkattzmxc755cgqqd4sxugn3jaxw44izlm4yfpot2ucfeqnukqd.onion:8333
+zowc7rklhd6xhje724xomkftwimuihacwcnxkt7vhbjpvpkdahvlhxid.onion:8333
+zp3vpkpcfdx5lxvnuellqaf5qdvhu4luf4zqfx5xjo2dge7cqsxhsxyd.onion:8333
+zpgobpk2j2suauhuzfmh4iiz3y2zhj3xvb3g2t4a775t72stt3majryd.onion:8333
+zpgybnbaxfvzjeus7qna45zchxdkekjpk5webdkeqtxfwcglgogm2vad.onion:8333
+zphjbml3fqtbez63bjvd4s552yc2xebitadkpw2jon2qkbapbiltijyd.onion:8333
+zpnoo3qordv4xj5hjynkssu6wechvup6to7pamrgbi4ljmfugjyzwwad.onion:8333
+zppmhj76a6dyjch5qtubosxcyvtwjnb6zndsfywxci7dy3vc6lbfusyd.onion:8333
+zpq2nzcnlasmy3rmwtmaybav6t7xfrvorqqdwntnbgbxqujyy3dkwlid.onion:8333
+zpqvo25bxu4n2u3mh2pdzax7wmpsitd3qsszgw2ye3mpfdpjbg52kgid.onion:8333
+zpx2tq27yviwzbpc4nyjfqtlhigoa5k7cwl676nft7bkajo6jq224hid.onion:8333
+zqlwzzfzdoacgngtsnofmyqetag6o44f5r72opj733y434b7npnb4oyd.onion:8333
+zqq4g2eikcfgls64ffstsylfbqrfstm6n2otvrsbtvvjpqwgyqdnmbyd.onion:8333
+zqrj4fhhp4mq5eh5xptzcxjzpae37brkdn3voz32qsohl6noijygdkad.onion:8333
+zqrwah6dn3t5fuj7ohlyka27zzopduhxy4wyknfrtqpx4sykece65fqd.onion:8333
+zqtyvr7h277x5rxin6rhsrsbhwcfsyyiqgghpk6jlbewej2v3tn27yad.onion:8333
+zqv5nepyrwezkym2ba5s2sskmi2qck22snw2rygeke45bxg2o4vckuid.onion:8333
+zqvbnqwwhtoux2sxicng2blfiowk5mvty7c5xnssxwtlsjzalhg3zqqd.onion:8333
+zr222c3ybuqxn6a6piydvfos4zjnaklfgh6kofmujmolpiprfw4z6vqd.onion:8333
+zr6ffisxxo4gelmkoyb7izfm7ehjrbqbnzuguw34to34bqhxeeqzzjad.onion:8333
+zr7sqclimv46jdnmmeazqrhflhiqkhhrz5i3ed7yvyue63swk3qkjnad.onion:8333
+zrrfr5sr5wrgdt6rn44cxnotlvwe7cl67rgssw5dwsax42evokdaw6id.onion:8333
+zrrhgs52ftlylshuwp5e2uesgqnwct7h6cqhzofdduwoi4sz3shmxxad.onion:8333
+zrt3rg4paxmo24ucd56eehl7apindhbubq3ej3q5nhr6i72jv2eznryd.onion:8333
+zrvsjjrb3lgvmeftz2vfjva4pl63htmv5qyviq7zhnfmlk42evrxdpid.onion:8333
+zry2rqlcqf5p5e46wc6nmtcbt5vd45mf4hyf4nxlqogckoniufdjklid.onion:8333
+zs47b66pljpz4ahompanciv73xtztnnzkx4wjklt6hh4drsge4m26iad.onion:8333
+zsalwutefh6m6x6yxccbhulzrz2bmo7dzu2ggu4hxp5zv3xx2j642dyd.onion:8333
+zsbzferezmnyxhpktxtccn2xxuggmdzdnrza7pqjlnwjorgx57y2acyd.onion:8333
+zsgtoyy2svehhfba345dx3dazp7tfdio6o34zxlcgylq6pi67gjq7nqd.onion:8333
+zsi55x2nvjc4oqrpzzopkneukb5fudnm4e6drao4x73lf4zshhcvllqd.onion:8333
+zsipwsjpm4f3p6ueczh7lqei5rp3cusl6t4d6nntnwxq72hori5f7jqd.onion:8333
+zsisadra7jlxp5nhec2vsjwspvvnk6jemjxk7zn7arypl6cm6dy7mwqd.onion:8333
+zsr43xqj6nsrqh6qgxghadctltwytnaw4zmlvx6exqybt2qdt72f5yad.onion:8333
+zsxgefpkofjc3nti4qusk3pdqcfinkljajlwcb2cee2tduxltxbmrpad.onion:8333
+zszufrszpweaoysubpdnqparmyotjnev6nhhcnejhjjftu5sb55kesid.onion:8333
+zt6gkop3n6aggrxucnaqp4yrjeu6htwvuy2nyn3vadjjrodwxfhfv3id.onion:8333
+zt6hvzyoalzm4a576drn7yfvdetdvzwwouvfz435wzrf5pcnxqxplaad.onion:8333
+zt6v7eqh7vvlwy5kjzbdfgkw3syj3nnhckyghlzgmwwfccxvyfusuzqd.onion:8333
+ztcmlrstdkp7coheeolpwj75gp3imzgiw26xnoiucquwhxxcofao63ad.onion:8333
+zthmey4ueoutf7q36nwgujxu7hq76s5ifbtanvze4mxq2s2xq2cmjwad.onion:8333
+ztmwsyo35zkogpftujm2o7oilhucjxe3w6bjagsaiwtb2bu62vgjptid.onion:8333
+ztou4ytvgvpcakjaje2c6l5j53rxcxes7qhkerszi4haffxfpj3kdnyd.onion:8333
+ztwryklhcnfoeck4qntt2aitoilit2cmmr2geyqo6cjc4nwr7jlludid.onion:8333
+zu3ekh3vtqjfnxqjqlmnq3jbqlg2zum4ehgirz5cggwe2thjmgkz4cqd.onion:8333
+zu3yh7mvqw342e7qt5amwtwe2btjubi6t75k7wgcpsyoicsnpgbgj5ad.onion:8333
+zu76ecbahyc6ofjiiutna6myxmfdcsuhcrhtgpifbw3vfo7njd4b5tyd.onion:8333
+zuaotutv2ngbf5ot5kvz75uehbh5e2j726fglhqw7omk3b7xnaastpad.onion:8333
+zubmiztmnfy2vqowqmpyzbqtf2a43jgazsex6zlxokhfmnzmi3rht6yd.onion:8333
+zuc7sobx6ttj7lswk32raexasfbxc5kd6a3l6td35srqzkj3emsv4uid.onion:8333
+zunmnr7czrxvfjgxtvkwk6ziti5kskx4fi3j4dzahhdljfsqtz7yeqyd.onion:8333
+zuoml3m3jdkoh5bdrwfecnew5f4mrlcwhmhkn456qsa72cp274pbgtqd.onion:8333
+zutyd7pzkyejctriyr2lqlrex3arkunntsdjo3kgw2qj5u3fj5uyusyd.onion:8333
+zuzdl7nnjhy6inyqwsc5i7fae2nregm7wnyrtolaxhi6oiufyc7l26qd.onion:8333
+zv2nusexbcrncbutlcprevwhvbtqlyri3stjwmgl23x7fdqkmae6owqd.onion:8333
+zv63heoa7jstwhq3wg2nibip36bw4icd7jphccy3li3nut7gp2gojqqd.onion:8333
+zvbhycudpglrdi3sk7yixe64eknydwzzisc4n6xmxwhb7xyyzevc4nqd.onion:8333
+zvgutw2u7tu4dx7t25leghdp6j5n44u464mmoypafwstayp6ggabtkad.onion:8333
+zvjn5jscn7jncqss44uh53gvi6b4eycjqp42t6pv46bsr7gine5cbrqd.onion:8333
+zvmxfy5z7nxeknglvpbh7rveoppkyvvzvnpwxon2kgkepafnq4igheyd.onion:8333
+zvpcm7eemfvlklgqio3fgzcwa2vukg3n7caov5itik36kdua6mvm43qd.onion:8333
+zvzirfk3h4hk52j4u254y2np6ve2xttd2nugiccsqw2liiw7aqmglkyd.onion:8333
+zw4olgpxujj6iydkmhuxbx37b52syl5bm6embyebesysep2ignp2dgid.onion:8333
+zwbnovgpo4qxidylubpdrhxm34t23iwaniawfshiqrilttwqjnnlohid.onion:8333
+zwbqgh5le73aurfmbwf5ivjb7ycemwnjiq2jnq4sqz6epl7rdtd6rtid.onion:8333
+zweiy44ngrkfzhnaoqov3fopwqd3uhwsen4v6sdyf3ynmhlpuluvzeyd.onion:8333
+zwg2cvvkm37u2hicwbjasqzdqdhcblwvtzsulmz4kpbebf77jheiaaid.onion:8333
+zwrp2kb2covbrr3xdz2pxr6gg6ndnhpcgfvjkjr43eudnl5aswxgvbqd.onion:8333
+zwsapfrsxzsomsoty652jifwii56st6fg7bs2crr6boveh5o6npl7vyd.onion:8333
+zwtjkx5blzs4i6e7hwfeekcwufdl2lba4j65243tvkajder5iodkavad.onion:8333
+zwu3ep3zqki62b7ldjbsxk4dm4rlppkxpzzqfwsfvkoihxltm3y4qaid.onion:8333
+zwwpbfpymszcmkwlfozzl26m66r6n7xzgnw6bs4nf3pypqh36ya2w6yd.onion:8333
+zx37fw5b4eatt3dekaefun3ln67agpt7oqobeacvyq4keurbj26azwid.onion:8333
+zxaujdps5ce6wvk6ykbfquygtbli4ecvpokj7oyfxjqiionn3u3fdsid.onion:8333
+zxbq3k7hwswo2f374ahsmlgkpdj7ju7pyygurkvzqaoh35vmxleewsad.onion:8333
+zxc2bzuqdkippxthxbg7n7e3lznbcnx7zyitlhwvjusbwr5v32oxueid.onion:8333
+zxcnzlo2eigfig66vxyx43znm66a5i4ieuiosycgddgzdff4vhn6zhqd.onion:8333
+zxk4bqrede3tnlb7ymjlsoyupc37r2vqe647otr3nczqmgfeoyiu75id.onion:8333
+zxqdpu4gmvn5vz2kdld6c2swqdzknwh2czwsw55vx323orvtk6a6igyd.onion:8333
+zxqe6efq4odzd2mvyeglqto2cfggagoicgcvlvca4mxycg47jei4uxad.onion:8333
+zxzfz3z4nbb7u3ifcv2p5xenzpbnzuuezelbbjcfrmupxtqyoh7uhyqd.onion:8333
+zxzqhfwi3gdheuxmzagp4aw4aks6cii2llljapcvqhtqrxlksxddo5id.onion:8333
+zy4jeshnpx3i3wjcqrb27qcea4qetpez65wpocat5sqncz24xeo6sxyd.onion:8333
+zyccgvzokepone36ulu74l54ad4dtqv7a2bjzcvopj6rg5xhbc7ihjad.onion:8333
+zydziohabauwybhbqkegn4d5r4257bmfain36fatcxdbj2nw5zoa5vid.onion:8333
+zyetfkanxicfp6tt5tegkxlkoz5rl2i3zsc6hyyqizahywbktezfuwid.onion:8333
+zyjfoui3hrpsw3fo4owxrztclffqhr26wdedizvz5xvlgurgixit2mad.onion:8333
+zyku4bk6pdifla26hympigytlwsx4htajcn43hhobdbrv4tfojv3snqd.onion:8333
+zyl4kfejs3t4vefsvuqrqopboxrmztuun62jick4uh3wpu4mw7dpqlyd.onion:8333
+zyphknlr4ogrknj5t64qya246kdaasgirn4iercvesggqplzzxsisbid.onion:8333
+zyrodumrgvgpinhygbi5molpbhl6ndfs3lwtt55pumd6wy5k7nb3esqd.onion:8333
+zyvgumk5pcanh4zk3z72glefxgbd4dpyhsbzvqlsp2gspaw37lrhjyad.onion:8333
+zyyefl5unnw7lnrjlgfyvnytw4iy4n4cy5bbs2nudjh7wp7psvefmfid.onion:8333
+zznngqwcp6g55wkjg52rzeogk3fcdpopyl3zprh2fz266nykv4sqveyd.onion:8333
+zzntdfpcb3spf5pb3g2gczw2njmhwwksgxt3twbzjhbaisihg7h2ywqd.onion:8333
+zzsi7brufwylb52w3bcbqvp5jx6vribh6geiqfy5jhxpihqjjaox7vad.onion:8333
+zzthz644hdjxn3d54xrfe7snnuyhsx2cguy4kqb6dpc5u7aun5lflbad.onion:8333
+zzuipjogcfvs7uyfhfgesehon6viegga3sc6c6265n235pqmkwyqfmyd.onion:8333
+zzul2xvyhqvajnd6zfs2dzljoppx5lsp2xt4qad7256kpxrv3wzyiuyd.onion:8333
+zzx4r2yrkxul2kg2ojoeijwce3skll4wbkkjw5xprstn2o2xw6n74wid.onion:8333
+zzyp22x6ryzyin43pltkup6jki5ynboh6cwpucscx5a3md2tooqn52yd.onion:8333
+zzzzzzzz5bs2qnoijxlhxd3ibxipajesgprqlrxtpfbygw4zcaf6oaad.onion:8333
# manually updated 2023-04 for minimal cjdns bootstrap support
[fc32:17ea:e415:c3bf:9808:149d:b5a2:c9aa]:8333
diff --git a/contrib/seeds/nodes_test.txt b/contrib/seeds/nodes_test.txt
index 5b04791d60..2def8ae644 100644
--- a/contrib/seeds/nodes_test.txt
+++ b/contrib/seeds/nodes_test.txt
@@ -1,89 +1,29 @@
-# List of fixed seed nodes for testnet
-
-# Onion nodes, last verified 2022-08 for minimal torv3 bootstrap support
-24j74ahq6ed4wmfrghdwroyfzimlkhnrb7zh4zw3vl2allzxbjrhaqid.onion:18333
-2fy74te65gm3c3gv3u5mhwdudvbdfh6k5fdz4gduimrltjjrxftbxrqd.onion:18333
-2lsncqdflwk272dhydrxf7ikfy23ppnmm54dnynyxiym6lqf3wowrmqd.onion:18333
-33o6qaidta7s2pmltet6vynd337vamgcifhh44rehwwxqpflcjt2njid.onion:18333
-3oo6bsc5mvf6a6ypmoaikilta6ka7mbdhdwhrnqhuhjlbaxyedvfvaqd.onion:18333
-3pe3fyklipy4sppkkgnhc22kcxtt57uler5kv72t676bbrwmcseo5qad.onion:18333
-4u4mcz2sfvxs7pwcwncswgmmcdzqtzjx7ztfo332jv4pqucb22ikdhad.onion:18333
-5v3i2kfqiqwp75gznjoptss7qgrcgseceqxpzpqkd34qeqzrg726i7id.onion:18333
-5zlrxk6q24t4vz5k4ie7gtuasdjavhoelhinzimxbfhc77u7vafipsid.onion:18333
-67s3af64ehw7xnxv422axm7tns4d6kutrftc6bjq375n74q3kj4pp7ad.onion:18333
-6a4ony53julvnufo632ktgmwvhupz63wbdwx7n7qudjy32qyq6gm3bqd.onion:18333
-6ftyg3nhc6tn2hyzls6zfdsfbroczhkxtdqumqb5q4yafhy5rdpapbid.onion:18333
-7554uw5djruh34j5ddx3iprzgqgzypcjtptwoldymfbgoywqcw2wiwyd.onion:18333
-766lozlabxaqjpbqsvt6sn3c65n6gkwwhoxyvggj7nfwnmw4cpaoccad.onion:18333
-7blv5abnytdf47yvbhxmykprmvjryqob65i2jmdwq3rrajcn2iiysbqd.onion:18333
-7v2ja4igx4v5y2jr6jrr6gaxohjhlzhvgwe4avlraxchozf7ea3kruqd.onion:18333
-7zgbmtzxow2oevd5aaqtsormw7ujv4zprl3oi2355immhq4gk7cyw5ad.onion:18333
-adstabjz7ec2y3jt4w2dvummowzv7g6m2f3kajeejffuaz7ojwj6epqd.onion:18333
-aesy6tfufadkut6flu2bsqgnw2422ur2ynjalguxlzuzuktg3zehttqd.onion:18333
-alxo32b5edi3bn2e224qrgytgxxpic4knyipvpdvctfsrvcaiq5lgeyd.onion:18333
-aoeart34umoonvd2kbqr3bc4sweu6a4msh2gp4skyqvei3shzcxbgmyd.onion:18333
-aprzvj7hgctsde4mkj3ewq35gvykspjvkqiygg7bpnw5tkvse2n7rhid.onion:18333
-awpk6z3xghx6ozouhodcydaqtr6uzzbnw4creuix7mkupxoxlmhhspad.onion:18333
-ayynqazucyh2jd5rehcfggmhunqpdwzlbhzbqgy6lj4ctz2ocj7chpid.onion:18333
-b2ika53aqckv4gs7wmog3byrea2vfzm5p7ye33digcsmvvnpbyqmzoyd.onion:18333
-be7zx3hh6dlahorlvsrrgqm4oahfrgqm2tbwnbd4u53ntu5f765n6hyd.onion:18333
-bluk62wj24bsvdwh47muo54hhwsatkftiqxevt5kba7hstjoex6ueeyd.onion:18333
-bubm6fiopfzkxqrfx6vqpioe5ahlhyubz57ogsqqy4ha5pnngiqlh6id.onion:18333
-d3czabzjj57lgrsr5gawkjd7v3gznrqa7zyizqmk4lryascavmipnyad.onion:18333
-ddj4cuvb32ve5chtp6jattcdnnmxmpoofjthzi7thgxxht7yqoetj3yd.onion:18333
-dqhhlssfwmh3g6zhwxpcfbw64xz5rfikcglinbhoxv5ajv4qzicjyeid.onion:18333
-drthcyb4x4rdfekw5g7xjogxi7aqoluilgulbgwvsme3nw3oibvchbad.onion:18333
-dwb47cmqa2tjpmvjaear7gdcars2lez6niefhi4qf22qehtyta6577qd.onion:18333
-e7tkrf54ng3q5vcn5gn77zwjwm74lkfav4mwdux3pvon6yvqg3tf46qd.onion:18333
-etuymy47s3quepvdaoo72i5e5mc7uovrzu5m4jf5q6mwlwizoxy4xgid.onion:18333
-fbimesnyhzubbzqc3uaufzkbyfmnkxvypoxaveaub7rzpzh2foxrn2yd.onion:18333
-fzbrwmgwmko7quelrhfuskt3ijabac76zx7g52dfrevmhdkj6ivh7qyd.onion:18333
+2yq4xcwzvb2ktyci5lpmb2q3nl6qqywb7nrf6fkcthha7l3tle2q.b32.i2p:0
+4g5uvbkvi5fvyditekvzajldtzgurorqjupuwtmymrjloq6cjm5q.b32.i2p:0
+f3w7soepsy7jqwf7dlo4ro2qkyapg2lrb2dkkvwfwuymgaqvljqa.b32.i2p:0
+nr7nozlb54xv3ozg4ksvcr3ofzfwfeud2n7xijywvt22ixzal7qa.b32.i2p:0
+o6j3b33bv26vthoqzjy3h7a3qsuqbtbe3ulajmjzsl43vaqyieyq.b32.i2p:0
+ocqipbbxx4paopgkkbnj234ie7opzrtca5gtiwr6oda3h32rzgsa.b32.i2p:0
+r2zdpkcslf7e4t2fmglu45xhfw5zgupthdh5pcewdo6jajumveda.b32.i2p:0
+xgctj4seo3ofstiymoyeuzq74bvddrbr6jtia6erodlf5va3cz5a.b32.i2p:0
+y5e6aqz4jkjjoeipoxwurzc2jrfv6ilvfbdqmjqk574maba5uara.b32.i2p:0
+ye3ajv2tgpq7jvvzzn5wxbtmd3txev3axsdla5bkpobeiwccyjjq.b32.i2p:0
+7ph7mrc24te57mvppajfkfj4mk7zuz4teukymt3wgpdpw6vpndeivtyd.onion:18333
+bkzo7mpxuar7rhsbiwdaxqcymixarcbdmb3sdaqtv6yb2svqttz2s6ad.onion:18333
+d63vf45ta4chrewnruyvypm7ybfxtut327crtq6qfyrvcwx434rli5qd.onion:18333
+efqfw6vjq7gpgyhosu3qf24hsshxpbhay426ccsgz54key4cvwund6yd.onion:18333
gy6nih4pmp5esyvvnhlj6qvk7zkbjuoswkxffyiip3dbkvsfxwz5zcqd.onion:18333
-ha62ziqzqdogd75zg7lfh4fqrg3bim3cpqzyupo43w5pw4fen6nr2pyd.onion:18333
-hacjjgj2mbqqrthzimmi6anvin7dljjhfl3ik6ebg3w3nmgsvr3ymmqd.onion:18333
-hbkp5xwpqo4qm75kpglfrclyiuuvdgv7mtiqfys7oqks4dmpqgpeoeid.onion:18333
-hqgoy62hoqjmz37brdfvoeov3cix5fixbqjoert4ydr6herg5oc3iwyd.onion:18333
-hvbmmzvqrpgps2x5u4ip4ksf3e5m2fneac754gtnhjn2rsevni6cz3ad.onion:18333
-hw3vzp32w4h6giplue6ix445oi6wt7gmeksrznb7tdfwhkgit7gnbbad.onion:18333
-iddr66ewkhenivapgianudjkwqcp6dxtssg7ixrdot5az6uh7m5tmjqd.onion:18333
-imya36iexiiiqrkwuxxcehnv4kg5shtirwd2vg4cnjy6lfjlph3fusqd.onion:18333
-iuhhuocns7entrzlxsxktyz2ibs7hqgiggv6sauzqkzka6laslwz7oqd.onion:18333
-ji5wmshokuc63eiulzlwj2zdvnligvrwfvvc76bice3tu43wfzvpmkyd.onion:18333
+hwipziotclxg3ledn5yj5j6n6pkrgnmlksozzlrtlnlpguvixox7naqd.onion:18333
+i5gphw2d224tniqkjebxdwz5ygbbo5gcushoyevv7x7o454b6qlrzeid.onion:18333
+ipbzs2lbe7lab2xaikvkdkwxian6t3nakaoltwbshpevbszdvoyyjiad.onion:18333
jjfuyj7krgzkmpxvn3b2j2hwlzkmze3ezy3ifwk7dnswwawgmzqhjrqd.onion:18333
-jn2p4sgfphkxpow7kjrubrbqat77kkibzqkvuwhxyalcrazwmcqeaqyd.onion:18333
-jrveyz4us6sog6e6czsvr5mvvhgzjgv4idbe4idrolmqeudvt5a2dgid.onion:18333
-jsc4frvvnl2d3bhzyofsc72xpztgm23nl4fnb4dwkzsxr6fhij2q5iyd.onion:18333
-klymxdvje7kccv3tznabo3udopsftkmjemkbi2urqxjm4hefaudejjyd.onion:18333
-kwjxlauwjtecjfsiwopbl5pvn5n6z5rz76uk6osmlurd3uyuymcw7aid.onion:18333
-lc7upz2srw2yhpcvwg4afy64ylcoo6mfwlttqj5ovuglqnhnohpi5iqd.onion:18333
-lf3mpxfyjuovcqdvinl52pvdmmda6xqyfeiarlfamdjpgy3ouzmmlbyd.onion:18333
-mc7k47ndjvvhcgs54wmjzxvate4rtuybbjoryikdssjhcxlx27psbyqd.onion:18333
-mjbg3ggeuelmc7ixty3zjccyo2urg2uyherfqe7ytkm2ejkwlec7h6ad.onion:18333
-nkyqozv6kdwi423s7s2mezzguf5bafot2a3hv4ed2dbvtblisdmad4qd.onion:18333
-nvvqo4xxiwgb3y246jmcbuuveurfdq2zs3a5y7veqkeqv5jfhang7gyd.onion:18333
-o6vfovqxz3oxszfppczpjejwouobztjrgvfojc3emvhan3bkyskzhuad.onion:18333
-oaiw2lnhzgp5ry7ivzneuufmh7lfploquu2rjv5rozmlbefedsnxe5qd.onion:18333
-oln7ybci53wk4g5n42nipyixvyjxbludsbrfsmhnirb6tk7ovlikd5id.onion:18333
-otmfnhc6wrrbf2tpdy6zkisqc3r3urnsuowsnmatoto6yixaocnkseid.onion:18333
-ovc6sajbqfcbwv3wrq7ylklu6q6prvisz4jr4lyycn4kgukzjfe4mjad.onion:18333
-pm57didyzg5ljuvn5ufr5uun2iencuk3af2gzqc5zvgfh452c3rxtjyd.onion:18333
-pmismhpwug34gnqzbutranvx2wjwbshyqj4un2dyzyuvak2eh55psfyd.onion:18333
-polarisultijjhaku6z6u7jyboho5epdsg44ttebfaxmgau2z5sqolad.onion:18333
-qe2jbe447he6panfvpyqhyntf7346gmuf55bxrmdzggmgwyjsyknhxyd.onion:18333
-qz6yd5lsgdajcteoareeptwnipxsezyx5kks6ukpk5tvqinffzunqmyd.onion:18333
-rp6pn3b3oesyr2giolbysbjhqeugxntsu7crnkth4y33ok4zvcl7yrqd.onion:18333
-ujdchuw3hz5gkbouiv4p6pwbfdn7v4k6gluwvd4wiukqc7y7ow754uad.onion:18333
-vctlwaqgmu53eutz2hewuakcipfgtyljsd7czut4dd62xr3rp6fqezad.onion:18333
-vf5ur53tzmdtotvkndcgochklnuav7quqjvkc6mctqfvef6wnmn26mid.onion:18333
-wnxgjgjgplv5iu4mssyuunycvku4qnqr5t4q6cfdt47k7uwrfifuirad.onion:18333
-wpkbkdr7clw7zk3jkwiult6bf422j54u77ml4rgig2xq7icogyrcspid.onion:18333
-wzpdt24tdark26eugredddorik3tqwcj5ialtt2yim4ceiuiq7phkyqd.onion:18333
-xgapnikkbldoggjh5ewxkyauhuwnvf3xkspxroe3ojvfrk4lswkyx5yd.onion:18333
-xkvzdhcirontixbq6pjhru57bf4sgtqylvphk25csfrsy5p5ay3oc3yd.onion:18333
-xnipauenw5wnjb2zbx6v6umgvbb3g6xhf5kjo7pnyn5tdzvzaxtzicid.onion:18333
-yda7kwpii33j2qpq32ftf6lp22znknswipjwaccvsqj7l337jvfesnid.onion:18333
-z3j5foswuhpmtrg3kb56stkzmuoaesvd5jz3eztq46c4cidapglcyuad.onion:18333
+jnphftehkfstwbko34idxlpo5fdw6lromkmeukxh3xclthlstehpg4ad.onion:18333
+jrhpwqahjrj75gtb7gt23eve65x7bbawy7j4edhmgbo5nj2mkaeghbyd.onion:18333
+jun6gdmbgasr57bhr4zs3dfhc6pzpaw27nqb4dadbai7yrbq55zskeid.onion:18333
+o52y7fadtubr4tuqhix6ymrin3qzn7ubh5tewuuehw5wxcbnfj6yaoad.onion:18333
+rigfm3joif5lsl7b7yr6d6cvddukawykm7kgguzfwi6dplckyz6x7gad.onion:18333
+t6d6epb5ccbo4e66iaanukraxpjmqiqsz6poj5uvxu2ownnhcguygdyd.onion:18333
+test2vozlxfznmfyxzkulf3l6qe6dti5hqfjsxar5lml45cjnyeusmyd.onion:18333
+uxtmtmpkfaxc6zcxaxgydrukyd5jdrcp2m5oubpimijy44rnjuywijad.onion:18333
+xuhmq42du7dckfophyr2rmf75aqkp3bk6y3wyyc6jxw7jmpp66zlm3id.onion:18333
zcep44k7unwjm2wxty4ijh2e4fv5zgbrvwlctzyaqnrqhltjfzrtodad.onion:18333
-zmvizz7fd5hdue6wt3lwqumd6qwt4ijymmmotfzh75curq3mzjm53hyd.onion:18333
-zoaa3x7quyuijggii5zl4uyeioodudsgtr2uyv2qtdsslac5ukiwlxid.onion:18333
-zovauxlorl5eswumbsoxv2m5y3sm3qlk7657dcpr2uld7xf35en46sqd.onion:18333
diff --git a/depends/Makefile b/depends/Makefile
index 319c3498df..88aae7ad81 100644
--- a/depends/Makefile
+++ b/depends/Makefile
@@ -147,8 +147,8 @@ include packages/packages.mk
# 2. Before including packages/*.mk (excluding packages/packages.mk), since
# they rely on the build_id variables
#
-build_id:=$(shell env CC='$(build_CC)' C_STANDARD='$(C_STANDARD)' CXX='$(build_CXX)' CXX_STANDARD='$(CXX_STANDARD)' AR='$(build_AR)' RANLIB='$(build_RANLIB)' STRIP='$(build_STRIP)' SHA256SUM='$(build_SHA256SUM)' DEBUG='$(DEBUG)' LTO='$(LTO)' NO_HARDEN='$(NO_HARDEN)' ./gen_id '$(BUILD_ID_SALT)' 'GUIX_ENVIRONMENT=$(realpath $(GUIX_ENVIRONMENT))')
-$(host_arch)_$(host_os)_id:=$(shell env CC='$(host_CC)' C_STANDARD='$(C_STANDARD)' CXX='$(host_CXX)' CXX_STANDARD='$(CXX_STANDARD)' AR='$(host_AR)' RANLIB='$(host_RANLIB)' STRIP='$(host_STRIP)' SHA256SUM='$(build_SHA256SUM)' DEBUG='$(DEBUG)' LTO='$(LTO)' NO_HARDEN='$(NO_HARDEN)' ./gen_id '$(HOST_ID_SALT)' 'GUIX_ENVIRONMENT=$(realpath $(GUIX_ENVIRONMENT))')
+build_id:=$(shell env CC='$(build_CC)' C_STANDARD='$(C_STANDARD)' CXX='$(build_CXX)' CXX_STANDARD='$(CXX_STANDARD)' AR='$(build_AR) 'NM='$(build_NM)' RANLIB='$(build_RANLIB)' STRIP='$(build_STRIP)' SHA256SUM='$(build_SHA256SUM)' DEBUG='$(DEBUG)' LTO='$(LTO)' NO_HARDEN='$(NO_HARDEN)' ./gen_id '$(BUILD_ID_SALT)' 'GUIX_ENVIRONMENT=$(realpath $(GUIX_ENVIRONMENT))')
+$(host_arch)_$(host_os)_id:=$(shell env CC='$(host_CC)' C_STANDARD='$(C_STANDARD)' CXX='$(host_CXX)' CXX_STANDARD='$(CXX_STANDARD)' AR='$(host_AR)' NM='$(host_NM)' RANLIB='$(host_RANLIB)' STRIP='$(host_STRIP)' SHA256SUM='$(build_SHA256SUM)' DEBUG='$(DEBUG)' LTO='$(LTO)' NO_HARDEN='$(NO_HARDEN)' ./gen_id '$(HOST_ID_SALT)' 'GUIX_ENVIRONMENT=$(realpath $(GUIX_ENVIRONMENT))')
boost_packages_$(NO_BOOST) = $(boost_packages)
@@ -183,7 +183,7 @@ endif
all_packages = $(packages) $(native_packages)
-meta_depends = Makefile funcs.mk builders/default.mk hosts/default.mk hosts/$(host_os).mk builders/$(build_os).mk
+meta_depends = Makefile config.guess config.sub funcs.mk builders/default.mk hosts/default.mk hosts/$(host_os).mk builders/$(build_os).mk
$(host_arch)_$(host_os)_native_binutils?=$($(host_os)_native_binutils)
$(host_arch)_$(host_os)_native_toolchain?=$($(host_os)_native_toolchain)
@@ -242,7 +242,6 @@ $(host_prefix)/share/config.site : config.site.in $(host_prefix)/.stamp_$(final_
-e 's|@CXXFLAGS@|$(strip $(host_CXXFLAGS) $(host_$(release_type)_CXXFLAGS))|' \
-e 's|@CPPFLAGS@|$(strip $(host_CPPFLAGS) $(host_$(release_type)_CPPFLAGS))|' \
-e 's|@LDFLAGS@|$(strip $(host_LDFLAGS) $(host_$(release_type)_LDFLAGS))|' \
- -e 's|@allow_host_packages@|$(ALLOW_HOST_PACKAGES)|' \
-e 's|@no_qt@|$(NO_QT)|' \
-e 's|@no_qr@|$(NO_QR)|' \
-e 's|@no_zmq@|$(NO_ZMQ)|' \
diff --git a/depends/README.md b/depends/README.md
index 8af5e36bfd..a8dfc83e3b 100644
--- a/depends/README.md
+++ b/depends/README.md
@@ -110,9 +110,6 @@ The following can be set when running make: `make FOO=bar`
- `NO_UPNP`: Don't download/build/cache packages needed for enabling UPnP
- `NO_NATPMP`: Don't download/build/cache packages needed for enabling NAT-PMP
- `NO_USDT`: Don't download/build/cache packages needed for enabling USDT tracepoints
-- `ALLOW_HOST_PACKAGES`: Packages that are missed in dependencies (due to `NO_*` option or
- build script logic) are searched for among the host system packages using
- `pkg-config`. It allows building with packages of other (newer) versions
- `MULTIPROCESS`: Build libmultiprocess (experimental, requires CMake)
- `DEBUG`: Disable some optimizations and enable more runtime checking
- `HOST_ID_SALT`: Optional salt to use when generating host package ids
@@ -123,7 +120,7 @@ The following can be set when running make: `make FOO=bar`
- `LOG`: Use file-based logging for individual packages. During a package build its log file
resides in the `depends` directory, and the log file is printed out automatically in case
of build error. After successful build log files are moved along with package archives
-- `LTO`: Use LTO when building packages.
+- `LTO`: Enable options needed for LTO. Does not add `-flto` related options to *FLAGS.
- `NO_HARDEN=1`: Don't use hardening options when building packages
If some packages are not built, for example `make NO_WALLET=1`, the appropriate
diff --git a/depends/builders/darwin.mk b/depends/builders/darwin.mk
index 8ed82b276d..a5f07643de 100644
--- a/depends/builders/darwin.mk
+++ b/depends/builders/darwin.mk
@@ -11,12 +11,11 @@ build_darwin_SHA256SUM=shasum -a 256
build_darwin_DOWNLOAD=curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o
#darwin host on darwin builder. overrides darwin host preferences.
-darwin_CC=$(shell xcrun -f clang) -mmacosx-version-min=$(OSX_MIN_VERSION) -isysroot$(shell xcrun --show-sdk-path)
-darwin_CXX:=$(shell xcrun -f clang++) -mmacosx-version-min=$(OSX_MIN_VERSION) -stdlib=libc++ -isysroot$(shell xcrun --show-sdk-path)
+darwin_CC=$(shell xcrun -f clang) -isysroot$(shell xcrun --show-sdk-path)
+darwin_CXX:=$(shell xcrun -f clang++) -stdlib=libc++ -isysroot$(shell xcrun --show-sdk-path)
darwin_AR:=$(shell xcrun -f ar)
darwin_RANLIB:=$(shell xcrun -f ranlib)
darwin_STRIP:=$(shell xcrun -f strip)
-darwin_LIBTOOL:=$(shell xcrun -f libtool)
darwin_OTOOL:=$(shell xcrun -f otool)
darwin_NM:=$(shell xcrun -f nm)
darwin_INSTALL_NAME_TOOL:=$(shell xcrun -f install_name_tool)
diff --git a/depends/config.site.in b/depends/config.site.in
index a6a5596bb8..29b2a67ed0 100644
--- a/depends/config.site.in
+++ b/depends/config.site.in
@@ -78,10 +78,6 @@ if test "@host_os@" = darwin; then
BREW=no
fi
-if test -z "$enable_lto" && test -n "@lto@"; then
- enable_lto=yes
-fi
-
if test -z "$enable_hardening" && test -n "@no_harden@"; then
enable_hardening=no
fi
@@ -89,9 +85,7 @@ fi
PKG_CONFIG="$(which pkg-config) --static"
PKG_CONFIG_PATH="${depends_prefix}/share/pkgconfig:${depends_prefix}/lib/pkgconfig"
-if test -z "@allow_host_packages@"; then
- PKG_CONFIG_LIBDIR="${depends_prefix}/lib/pkgconfig"
-fi
+PKG_CONFIG_LIBDIR="${depends_prefix}/lib/pkgconfig"
CPPFLAGS="-I${depends_prefix}/include/ ${CPPFLAGS}"
LDFLAGS="-L${depends_prefix}/lib ${LDFLAGS}"
diff --git a/depends/funcs.mk b/depends/funcs.mk
index 987be4e611..24c911b0f7 100644
--- a/depends/funcs.mk
+++ b/depends/funcs.mk
@@ -6,7 +6,6 @@ $(1)_objc=$$($$($(1)_type)_OBJC)
$(1)_objcxx=$$($$($(1)_type)_OBJCXX)
$(1)_ar=$$($$($(1)_type)_AR)
$(1)_ranlib=$$($$($(1)_type)_RANLIB)
-$(1)_libtool=$$($$($(1)_type)_LIBTOOL)
$(1)_nm=$$($$($(1)_type)_NM)
$(1)_cflags=$$($$($(1)_type)_CFLAGS) \
$$($$($(1)_type)_$$(release_type)_CFLAGS)
@@ -139,9 +138,9 @@ $(1)_config_env+=PKG_CONFIG_LIBDIR=$($($(1)_type)_prefix)/lib/pkgconfig
$(1)_config_env+=PKG_CONFIG_PATH=$($($(1)_type)_prefix)/share/pkgconfig
$(1)_config_env+=PKG_CONFIG_SYSROOT_DIR=/
$(1)_config_env+=CMAKE_MODULE_PATH=$($($(1)_type)_prefix)/lib/cmake
-$(1)_config_env+=PATH=$(build_prefix)/bin:$(PATH)
-$(1)_build_env+=PATH=$(build_prefix)/bin:$(PATH)
-$(1)_stage_env+=PATH=$(build_prefix)/bin:$(PATH)
+$(1)_config_env+=PATH="$(build_prefix)/bin:$(PATH)"
+$(1)_build_env+=PATH="$(build_prefix)/bin:$(PATH)"
+$(1)_stage_env+=PATH="$(build_prefix)/bin:$(PATH)"
# Setting a --build type that differs from --host will explicitly enable
# cross-compilation mode. Note that --build defaults to the output of
diff --git a/depends/gen_id b/depends/gen_id
index 3341310e46..8518b4e674 100755
--- a/depends/gen_id
+++ b/depends/gen_id
@@ -1,7 +1,7 @@
#!/usr/bin/env bash
# Usage: env [ CC=... ] [ C_STANDARD=...] [ CXX=... ] [CXX_STANDARD=...] \
-# [ AR=... ] [ RANLIB=... ] [ STRIP=... ] [ DEBUG=... ] \
+# [ AR=... ] [ NM=... ] [ RANLIB=... ] [ STRIP=... ] [ DEBUG=... ] \
# [ LTO=... ] [ NO_HARDEN=... ] ./build-id [ID_SALT]...
#
# Prints to stdout a SHA256 hash representing the current toolset, used by
@@ -56,6 +56,11 @@
echo "ZERO_AR_DATE=${ZERO_AR_DATE}"
echo "END AR"
+ echo "BEGIN NM"
+ bash -c "${NM} --version"
+ env | grep '^NM_'
+ echo "END NM"
+
echo "BEGIN RANLIB"
bash -c "${RANLIB} --version"
env | grep '^RANLIB_'
diff --git a/depends/hosts/android.mk b/depends/hosts/android.mk
index b53966dcf8..a1c8c56dba 100644
--- a/depends/hosts/android.mk
+++ b/depends/hosts/android.mk
@@ -9,11 +9,6 @@ endif
android_CFLAGS=-std=$(C_STANDARD)
android_CXXFLAGS=-std=$(CXX_STANDARD)
-ifneq ($(LTO),)
-android_CFLAGS += -flto
-android_LDFLAGS += -flto
-endif
-
android_AR=$(ANDROID_TOOLCHAIN_BIN)/llvm-ar
android_RANLIB=$(ANDROID_TOOLCHAIN_BIN)/llvm-ranlib
diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk
index a89c82e408..29ad7ef252 100644
--- a/depends/hosts/darwin.mk
+++ b/depends/hosts/darwin.mk
@@ -39,7 +39,7 @@ llvm_config_prog=$(shell $(SHELL) $(.SHELLFLAGS) "command -v llvm-config")
llvm_lib_dir=$(shell $(llvm_config_prog) --libdir)
endif
-cctools_TOOLS=AR RANLIB STRIP NM LIBTOOL OTOOL INSTALL_NAME_TOOL DSYMUTIL
+cctools_TOOLS=AR RANLIB STRIP NM OTOOL INSTALL_NAME_TOOL DSYMUTIL
# Make-only lowercase function
lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))
@@ -79,28 +79,27 @@ $(foreach TOOL,$(cctools_TOOLS),$(eval darwin_$(TOOL) = $$(build_prefix)/bin/$$(
darwin_CC=env -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH \
-u OBJC_INCLUDE_PATH -u OBJCPLUS_INCLUDE_PATH -u CPATH \
-u LIBRARY_PATH \
- $(clang_prog) --target=$(host) -mmacosx-version-min=$(OSX_MIN_VERSION) \
- -B$(build_prefix)/bin -mlinker-version=$(LD64_VERSION) \
+ $(clang_prog) --target=$(host) \
+ -B$(build_prefix)/bin \
-isysroot$(OSX_SDK) -nostdlibinc \
-iwithsysroot/usr/include -iframeworkwithsysroot/System/Library/Frameworks
darwin_CXX=env -u C_INCLUDE_PATH -u CPLUS_INCLUDE_PATH \
-u OBJC_INCLUDE_PATH -u OBJCPLUS_INCLUDE_PATH -u CPATH \
-u LIBRARY_PATH \
- $(clangxx_prog) --target=$(host) -mmacosx-version-min=$(OSX_MIN_VERSION) \
- -B$(build_prefix)/bin -mlinker-version=$(LD64_VERSION) \
+ $(clangxx_prog) --target=$(host) \
+ -B$(build_prefix)/bin \
-isysroot$(OSX_SDK) -nostdlibinc \
-iwithsysroot/usr/include/c++/v1 \
-iwithsysroot/usr/include -iframeworkwithsysroot/System/Library/Frameworks
-darwin_CFLAGS=-pipe -std=$(C_STANDARD)
-darwin_CXXFLAGS=-pipe -std=$(CXX_STANDARD)
+darwin_CFLAGS=-pipe -std=$(C_STANDARD) -mmacosx-version-min=$(OSX_MIN_VERSION)
+darwin_CXXFLAGS=-pipe -std=$(CXX_STANDARD) -mmacosx-version-min=$(OSX_MIN_VERSION)
darwin_LDFLAGS=-Wl,-platform_version,macos,$(OSX_MIN_VERSION),$(OSX_SDK_VERSION)
-ifneq ($(LTO),)
-darwin_CFLAGS += -flto
-darwin_CXXFLAGS += -flto
-darwin_LDFLAGS += -flto
+ifneq ($(build_os),darwin)
+darwin_CFLAGS += -mlinker-version=$(LD64_VERSION)
+darwin_CXXFLAGS += -mlinker-version=$(LD64_VERSION)
endif
darwin_release_CFLAGS=-O2
diff --git a/depends/hosts/default.mk b/depends/hosts/default.mk
index bad4568bcb..cf3c90441d 100644
--- a/depends/hosts/default.mk
+++ b/depends/hosts/default.mk
@@ -7,7 +7,6 @@ default_host_CXX = $(host_toolchain)g++
default_host_AR = $(host_toolchain)ar
default_host_RANLIB = $(host_toolchain)ranlib
default_host_STRIP = $(host_toolchain)strip
-default_host_LIBTOOL = $(host_toolchain)libtool
default_host_NM = $(host_toolchain)nm
default_host_OBJCOPY = $(host_toolchain)objcopy
@@ -39,5 +38,5 @@ host_$1 = $$($(host_arch)_$(host_os)_$1)
host_$(release_type)_$1 = $$($(host_arch)_$(host_os)_$(release_type)_$1)
endef
-$(foreach tool,CC CXX AR RANLIB STRIP LIBTOOL NM OBJCOPY OTOOL INSTALL_NAME_TOOL DSYMUTIL,$(eval $(call add_host_tool_func,$(tool))))
+$(foreach tool,CC CXX AR RANLIB STRIP NM OBJCOPY OTOOL INSTALL_NAME_TOOL DSYMUTIL,$(eval $(call add_host_tool_func,$(tool))))
$(foreach flags,CFLAGS CXXFLAGS CPPFLAGS LDFLAGS, $(eval $(call add_host_flags_func,$(flags))))
diff --git a/depends/hosts/freebsd.mk b/depends/hosts/freebsd.mk
index 5351d0b900..055097b03d 100644
--- a/depends/hosts/freebsd.mk
+++ b/depends/hosts/freebsd.mk
@@ -1,12 +1,6 @@
freebsd_CFLAGS=-pipe -std=$(C_STANDARD)
freebsd_CXXFLAGS=-pipe -std=$(CXX_STANDARD)
-ifneq ($(LTO),)
-freebsd_CFLAGS += -flto
-freebsd_CXXFLAGS += -flto
-freebsd_LDFLAGS += -flto
-endif
-
freebsd_release_CFLAGS=-O2
freebsd_release_CXXFLAGS=$(freebsd_release_CFLAGS)
diff --git a/depends/hosts/linux.mk b/depends/hosts/linux.mk
index 1f33640c66..8be23be57d 100644
--- a/depends/hosts/linux.mk
+++ b/depends/hosts/linux.mk
@@ -2,10 +2,6 @@ linux_CFLAGS=-pipe -std=$(C_STANDARD)
linux_CXXFLAGS=-pipe -std=$(CXX_STANDARD)
ifneq ($(LTO),)
-linux_CFLAGS += -flto
-linux_CXXFLAGS += -flto
-linux_LDFLAGS += -flto
-
linux_AR = $(host_toolchain)gcc-ar
linux_NM = $(host_toolchain)gcc-nm
linux_RANLIB = $(host_toolchain)gcc-ranlib
diff --git a/depends/hosts/mingw32.mk b/depends/hosts/mingw32.mk
index fc1cc1afbe..15aa7cd25a 100644
--- a/depends/hosts/mingw32.mk
+++ b/depends/hosts/mingw32.mk
@@ -6,10 +6,6 @@ mingw32_CFLAGS=-pipe -std=$(C_STANDARD)
mingw32_CXXFLAGS=-pipe -std=$(CXX_STANDARD)
ifneq ($(LTO),)
-mingw32_CFLAGS += -flto
-mingw32_CXXFLAGS += -flto
-mingw32_LDFLAGS += -flto
-
mingw32_AR = $(host_toolchain)gcc-ar
mingw32_NM = $(host_toolchain)gcc-nm
mingw32_RANLIB = $(host_toolchain)gcc-ranlib
diff --git a/depends/hosts/netbsd.mk b/depends/hosts/netbsd.mk
index 14121dca20..f33b2d2889 100644
--- a/depends/hosts/netbsd.mk
+++ b/depends/hosts/netbsd.mk
@@ -2,10 +2,6 @@ netbsd_CFLAGS=-pipe -std=$(C_STANDARD)
netbsd_CXXFLAGS=-pipe -std=$(CXX_STANDARD)
ifneq ($(LTO),)
-netbsd_CFLAGS += -flto
-netbsd_CXXFLAGS += -flto
-netbsd_LDFLAGS += -flto
-
netbsd_AR = $(host_toolchain)gcc-ar
netbsd_NM = $(host_toolchain)gcc-nm
netbsd_RANLIB = $(host_toolchain)gcc-ranlib
diff --git a/depends/hosts/openbsd.mk b/depends/hosts/openbsd.mk
index d330e94d2e..bdd36dc9b3 100644
--- a/depends/hosts/openbsd.mk
+++ b/depends/hosts/openbsd.mk
@@ -1,12 +1,6 @@
openbsd_CFLAGS=-pipe -std=$(C_STANDARD)
openbsd_CXXFLAGS=-pipe -std=$(CXX_STANDARD)
-ifneq ($(LTO),)
-openbsd_CFLAGS += -flto
-openbsd_CXXFLAGS += -flto
-openbsd_LDFLAGS += -flto
-endif
-
openbsd_release_CFLAGS=-O2
openbsd_release_CXXFLAGS=$(openbsd_release_CFLAGS)
diff --git a/depends/packages.md b/depends/packages.md
index 4158b46d28..ad91eaffee 100644
--- a/depends/packages.md
+++ b/depends/packages.md
@@ -74,7 +74,6 @@ These variables may be set to override or append their default values.
$(package)_objcxx
$(package)_ar
$(package)_ranlib
- $(package)_libtool
$(package)_nm
$(package)_cflags
$(package)_cxxflags
diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk
index 9f5a925015..1a21238152 100644
--- a/depends/packages/bdb.mk
+++ b/depends/packages/bdb.mk
@@ -17,7 +17,6 @@ $(package)_config_opts_android=--with-pic
$(package)_cflags+=-Wno-error=implicit-function-declaration -Wno-error=format-security -Wno-error=implicit-int
$(package)_cppflags_freebsd=-D_XOPEN_SOURCE=600 -D__BSD_VISIBLE=1
$(package)_cppflags_netbsd=-D_XOPEN_SOURCE=600
-$(package)_cppflags_openbsd=-D_XOPEN_SOURCE=600
$(package)_cppflags_mingw32=-DUNICODE -D_UNICODE
endef
diff --git a/depends/packages/libnatpmp.mk b/depends/packages/libnatpmp.mk
index 2eddc76d9c..caa809ec0b 100644
--- a/depends/packages/libnatpmp.mk
+++ b/depends/packages/libnatpmp.mk
@@ -3,14 +3,18 @@ $(package)_version=07004b97cf691774efebe70404cf22201e4d330d
$(package)_download_path=https://github.com/miniupnp/libnatpmp/archive
$(package)_file_name=$($(package)_version).tar.gz
$(package)_sha256_hash=9321953ceb39d07c25463e266e50d0ae7b64676bb3a986d932b18881ed94f1fb
+$(package)_patches=no_libtool.patch
define $(package)_set_vars
$(package)_build_opts=CC="$($(package)_cc)"
$(package)_build_opts_mingw32=CPPFLAGS=-DNATPMP_STATICLIB
- $(package)_build_opts_darwin=LIBTOOL="$($(package)_libtool)"
$(package)_build_env+=CFLAGS="$($(package)_cflags) $($(package)_cppflags)" AR="$($(package)_ar)"
endef
+define $(package)_preprocess_cmds
+ patch -p1 < $($(package)_patch_dir)/no_libtool.patch
+endef
+
define $(package)_build_cmds
$(MAKE) libnatpmp.a $($(package)_build_opts)
endef
diff --git a/depends/packages/miniupnpc.mk b/depends/packages/miniupnpc.mk
index 7ad2529e47..5698a7cbb1 100644
--- a/depends/packages/miniupnpc.mk
+++ b/depends/packages/miniupnpc.mk
@@ -3,20 +3,20 @@ $(package)_version=2.2.2
$(package)_download_path=https://miniupnp.tuxfamily.org/files/
$(package)_file_name=$(package)-$($(package)_version).tar.gz
$(package)_sha256_hash=888fb0976ba61518276fe1eda988589c700a3f2a69d71089260d75562afd3687
-$(package)_patches=dont_leak_info.patch respect_mingw_cflags.patch
+$(package)_patches=dont_leak_info.patch respect_mingw_cflags.patch no_libtool.patch
# Next time this package is updated, ensure that _WIN32_WINNT is still properly set.
# See discussion in https://github.com/bitcoin/bitcoin/pull/25964.
define $(package)_set_vars
$(package)_build_opts=CC="$($(package)_cc)"
-$(package)_build_opts_darwin=LIBTOOL="$($(package)_libtool)"
$(package)_build_opts_mingw32=-f Makefile.mingw CFLAGS="$($(package)_cflags) -D_WIN32_WINNT=0x0601"
$(package)_build_env+=CFLAGS="$($(package)_cflags) $($(package)_cppflags)" AR="$($(package)_ar)"
endef
define $(package)_preprocess_cmds
patch -p1 < $($(package)_patch_dir)/dont_leak_info.patch && \
- patch -p1 < $($(package)_patch_dir)/respect_mingw_cflags.patch
+ patch -p1 < $($(package)_patch_dir)/respect_mingw_cflags.patch && \
+ patch -p1 < $($(package)_patch_dir)/no_libtool.patch
endef
define $(package)_build_cmds
diff --git a/depends/packages/native_libmultiprocess.mk b/depends/packages/native_libmultiprocess.mk
index 946e885354..bcdb1f9e7c 100644
--- a/depends/packages/native_libmultiprocess.mk
+++ b/depends/packages/native_libmultiprocess.mk
@@ -1,8 +1,8 @@
package=native_libmultiprocess
-$(package)_version=414542f81e0997354b45b8ade13ca144a3e35ff1
+$(package)_version=8da797c5f1644df1bffd84d10c1ae9836dc70d60
$(package)_download_path=https://github.com/chaincodelabs/libmultiprocess/archive
$(package)_file_name=$($(package)_version).tar.gz
-$(package)_sha256_hash=8542dbaf8c4fce8fd7af6929f5dc9b34dffa51c43e9ee360e93ee0f34b180bc2
+$(package)_sha256_hash=030f4d393d2ac9deba98d2e1973e22fc439ffc009d5f8ae3225c90639f86beb0
$(package)_dependencies=native_capnp
define $(package)_config_cmds
diff --git a/depends/packages/native_libtapi.mk b/depends/packages/native_libtapi.mk
index a855c393c6..fb5ab0b4dc 100644
--- a/depends/packages/native_libtapi.mk
+++ b/depends/packages/native_libtapi.mk
@@ -6,7 +6,7 @@ $(package)_sha256_hash=d4d46c64622f13d6938cecf989046d9561011bb59e8ee835f8f39825d
$(package)_patches=disable_zlib.patch
ifeq ($(strip $(FORCE_USE_SYSTEM_CLANG)),)
-$(package)_dependencies=native_clang
+$(package)_dependencies=native_llvm
endif
define $(package)_preprocess_cmds
diff --git a/depends/packages/native_clang.mk b/depends/packages/native_llvm.mk
index 661b9c2c1c..09994eb012 100644
--- a/depends/packages/native_clang.mk
+++ b/depends/packages/native_llvm.mk
@@ -1,16 +1,17 @@
-package=native_clang
-$(package)_version=15.0.6
+package=native_llvm
+$(package)_version=17.0.6
+$(package)_major_version=$(firstword $(subst ., ,$($(package)_version)))
$(package)_download_path=https://github.com/llvm/llvm-project/releases/download/llvmorg-$($(package)_version)
ifneq (,$(findstring aarch64,$(BUILD)))
$(package)_file_name=clang+llvm-$($(package)_version)-aarch64-linux-gnu.tar.xz
-$(package)_sha256_hash=8ca4d68cf103da8331ca3f35fe23d940c1b78fb7f0d4763c1c059e352f5d1bec
+$(package)_sha256_hash=6dd62762285326f223f40b8e4f2864b5c372de3f7de0731cb7cd55ca5287b75a
else
-$(package)_file_name=clang+llvm-$($(package)_version)-x86_64-linux-gnu-ubuntu-18.04.tar.xz
-$(package)_sha256_hash=38bc7f5563642e73e69ac5626724e206d6d539fbef653541b34cae0ba9c3f036
+$(package)_file_name=clang+llvm-$($(package)_version)-x86_64-linux-gnu-ubuntu-22.04.tar.xz
+$(package)_sha256_hash=884ee67d647d77e58740c1e645649e29ae9e8a6fe87c1376be0f3a30f3cc9ab3
endif
define $(package)_stage_cmds
- mkdir -p $($(package)_staging_prefix_dir)/lib/clang/$($(package)_version)/include && \
+ mkdir -p $($(package)_staging_prefix_dir)/lib/clang/$($(package)_major_version)/include && \
mkdir -p $($(package)_staging_prefix_dir)/bin && \
mkdir -p $($(package)_staging_prefix_dir)/include/llvm-c && \
cp bin/clang $($(package)_staging_prefix_dir)/bin/ && \
@@ -20,5 +21,5 @@ define $(package)_stage_cmds
cp include/llvm-c/ExternC.h $($(package)_staging_prefix_dir)/include/llvm-c && \
cp include/llvm-c/lto.h $($(package)_staging_prefix_dir)/include/llvm-c && \
cp lib/libLTO.so $($(package)_staging_prefix_dir)/lib/ && \
- cp -r lib/clang/$($(package)_version)/include/* $($(package)_staging_prefix_dir)/lib/clang/$($(package)_version)/include/
+ cp -r lib/clang/$($(package)_major_version)/include/* $($(package)_staging_prefix_dir)/lib/clang/$($(package)_major_version)/include/
endef
diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk
index dd55c939cb..fb52fd4499 100644
--- a/depends/packages/packages.mk
+++ b/depends/packages/packages.mk
@@ -33,7 +33,7 @@ ifneq ($(build_os),darwin)
darwin_native_packages += native_cctools native_libtapi
ifeq ($(strip $(FORCE_USE_SYSTEM_CLANG)),)
-darwin_native_packages+= native_clang
+darwin_native_packages+= native_llvm
endif
endif
diff --git a/depends/packages/qt.mk b/depends/packages/qt.mk
index ecf3334aa5..5608e5f073 100644
--- a/depends/packages/qt.mk
+++ b/depends/packages/qt.mk
@@ -22,8 +22,8 @@ $(package)_patches += fast_fixed_dtoa_no_optimize.patch
$(package)_patches += guix_cross_lib_path.patch
$(package)_patches += fix-macos-linker.patch
$(package)_patches += memory_resource.patch
+$(package)_patches += utc_from_string_no_optimize.patch
$(package)_patches += windows_lto.patch
-$(package)_patches += fix-minimum-macos.patch
$(package)_qttranslations_file_name=qttranslations-$($(package)_suffix)
$(package)_qttranslations_sha256_hash=a31785948c640b7c66d9fe2db4993728ca07f64e41c560b3625ad191b276ff20
@@ -240,7 +240,6 @@ endef
define $(package)_preprocess_cmds
cp $($(package)_patch_dir)/qt.pro qt.pro && \
cp $($(package)_patch_dir)/qttools_src.pro qttools/src/src.pro && \
- patch -p1 -i $($(package)_patch_dir)/fix-minimum-macos.patch && \
patch -p1 -i $($(package)_patch_dir)/fix-macos-linker.patch && \
patch -p1 -i $($(package)_patch_dir)/dont_hardcode_pwd.patch && \
patch -p1 -i $($(package)_patch_dir)/fix_qt_pkgconfig.patch && \
@@ -251,6 +250,7 @@ define $(package)_preprocess_cmds
patch -p1 -i $($(package)_patch_dir)/memory_resource.patch && \
patch -p1 -i $($(package)_patch_dir)/rcc_hardcode_timestamp.patch && \
patch -p1 -i $($(package)_patch_dir)/duplicate_lcqpafonts.patch && \
+ patch -p1 -i $($(package)_patch_dir)/utc_from_string_no_optimize.patch && \
patch -p1 -i $($(package)_patch_dir)/fast_fixed_dtoa_no_optimize.patch && \
patch -p1 -i $($(package)_patch_dir)/guix_cross_lib_path.patch && \
patch -p1 -i $($(package)_patch_dir)/windows_lto.patch && \
diff --git a/depends/packages/sqlite.mk b/depends/packages/sqlite.mk
index a8ec89c6c6..6809b39113 100644
--- a/depends/packages/sqlite.mk
+++ b/depends/packages/sqlite.mk
@@ -11,10 +11,12 @@ $(package)_config_opts_linux=--with-pic
$(package)_config_opts_freebsd=--with-pic
$(package)_config_opts_netbsd=--with-pic
$(package)_config_opts_openbsd=--with-pic
-$(package)_config_opts_debug=--enable-debug
-$(package)_cflags+=-DSQLITE_DQS=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_OMIT_DEPRECATED
-$(package)_cflags+=-DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_JSON -DSQLITE_LIKE_DOESNT_MATCH_BLOBS
-$(package)_cflags+=-DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_AUTOINIT
+# We avoid using `--enable-debug` because it overrides CFLAGS, a behavior we want to prevent.
+$(package)_cflags_debug += -g
+$(package)_cppflags_debug += -DSQLITE_DEBUG
+$(package)_cppflags+=-DSQLITE_DQS=0 -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_OMIT_DEPRECATED
+$(package)_cppflags+=-DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_JSON -DSQLITE_LIKE_DOESNT_MATCH_BLOBS
+$(package)_cppflags+=-DSQLITE_OMIT_DECLTYPE -DSQLITE_OMIT_PROGRESS_CALLBACK -DSQLITE_OMIT_AUTOINIT
endef
define $(package)_preprocess_cmds
diff --git a/depends/packages/systemtap.mk b/depends/packages/systemtap.mk
index 541ebeee01..c912e18c31 100644
--- a/depends/packages/systemtap.mk
+++ b/depends/packages/systemtap.mk
@@ -3,11 +3,10 @@ $(package)_version=4.8
$(package)_download_path=https://sourceware.org/ftp/systemtap/releases/
$(package)_file_name=$(package)-$($(package)_version).tar.gz
$(package)_sha256_hash=cbd50a4eba5b261394dc454c12448ddec73e55e6742fda7f508f9fbc1331c223
-$(package)_patches=remove_SDT_ASM_SECTION_AUTOGROUP_SUPPORT_check.patch fix_variadic_warning.patch
+$(package)_patches=remove_SDT_ASM_SECTION_AUTOGROUP_SUPPORT_check.patch
define $(package)_preprocess_cmds
patch -p1 < $($(package)_patch_dir)/remove_SDT_ASM_SECTION_AUTOGROUP_SUPPORT_check.patch && \
- patch -p1 < $($(package)_patch_dir)/fix_variadic_warning.patch && \
mkdir -p $($(package)_staging_prefix_dir)/include/sys && \
cp includes/sys/sdt.h $($(package)_staging_prefix_dir)/include/sys/sdt.h
endef
diff --git a/depends/patches/libnatpmp/no_libtool.patch b/depends/patches/libnatpmp/no_libtool.patch
new file mode 100644
index 0000000000..2b9f01f6eb
--- /dev/null
+++ b/depends/patches/libnatpmp/no_libtool.patch
@@ -0,0 +1,15 @@
+diff -ruN libnatpmp-07004b97cf691774efebe70404cf22201e4d330d/Makefile libnatpmp-07004b97cf691774efebe70404cf22201e4d330d.new/Makefile
+--- libnatpmp-07004b97cf691774efebe70404cf22201e4d330d/Makefile 2022-07-05 07:49:50.000000000 +0000
++++ libnatpmp-07004b97cf691774efebe70404cf22201e4d330d.new/Makefile 2024-01-23 20:59:35.674821779 +0000
+@@ -197,11 +197,7 @@
+ $(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
+
+ $(STATICLIB): $(LIBOBJS)
+-ifneq (, $(findstring darwin, $(OS)))
+- $(LIBTOOL) -static -o $@ $?
+-else
+ $(AR) crs $@ $?
+-endif
+
+ $(SHAREDLIB): $(LIBOBJS)
+ ifneq (, $(findstring darwin, $(OS)))
diff --git a/depends/patches/miniupnpc/no_libtool.patch b/depends/patches/miniupnpc/no_libtool.patch
new file mode 100644
index 0000000000..bb7d4a87ef
--- /dev/null
+++ b/depends/patches/miniupnpc/no_libtool.patch
@@ -0,0 +1,15 @@
+diff -ruN miniupnpc-2.2.2/Makefile miniupnpc-2.2.2.new/Makefile
+--- miniupnpc-2.2.2/Makefile 2020-11-27 18:25:02.000000000 +0000
++++ miniupnpc-2.2.2.new/Makefile 2024-01-23 20:58:08.387188527 +0000
+@@ -298,11 +298,7 @@
+ makedepend -Y -- $(CFLAGS) -- $(SRCS) 2>/dev/null
+
+ $(LIBRARY): $(LIBOBJS)
+-ifneq (, $(findstring darwin, $(OS)))
+- $(LIBTOOL) -static -o $@ $?
+-else
+ $(AR) crs $@ $?
+-endif
+
+ $(SHAREDLIBRARY): $(LIBOBJS)
+ ifneq (, $(findstring darwin, $(OS)))
diff --git a/depends/patches/qt/fix-minimum-macos.patch b/depends/patches/qt/fix-minimum-macos.patch
deleted file mode 100644
index ecaa2ca308..0000000000
--- a/depends/patches/qt/fix-minimum-macos.patch
+++ /dev/null
@@ -1,18 +0,0 @@
-Ensure that Qt handles the minimum macOS version properly
-
-This patch can be dropped for LLVM Clang 17+, after commit
-https://github.com/llvm/llvm-project/commit/c8e2dd8c6f490b68e41fe663b44535a8a21dfeab
-
-
---- a/qtbase/src/corelib/global/qsystemdetection.h
-+++ b/qtbase/src/corelib/global/qsystemdetection.h
-@@ -220,6 +220,9 @@
- # include <Availability.h>
- # include <AvailabilityMacros.h>
- #
-+# undef __MAC_OS_X_VERSION_MIN_REQUIRED
-+# define __MAC_OS_X_VERSION_MIN_REQUIRED MAC_OS_X_VERSION_MIN_REQUIRED
-+#
- # ifdef Q_OS_MACOS
- # if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) || __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_6
- # undef __MAC_OS_X_VERSION_MIN_REQUIRED
diff --git a/depends/patches/qt/utc_from_string_no_optimize.patch b/depends/patches/qt/utc_from_string_no_optimize.patch
new file mode 100644
index 0000000000..533ef59b37
--- /dev/null
+++ b/depends/patches/qt/utc_from_string_no_optimize.patch
@@ -0,0 +1,84 @@
+Modify optimisation flags for various functions.
+This fixes non-determinism issues in the asm produced for
+these function when cross-compiling on x86_64 and aarch64 for
+the arm64-apple-darwin HOST.
+
+--- a/qtbase/src/corelib/itemmodels/qitemselectionmodel.cpp
++++ b/qtbase/src/corelib/itemmodels/qitemselectionmodel.cpp
+@@ -1078,9 +1078,9 @@ void QItemSelectionModelPrivate::_q_layoutChanged(const QList<QPersistentModelIn
+
+ if (hint != QAbstractItemModel::VerticalSortHint) {
+ // sort the "new" selection, as preparation for merging
+- std::stable_sort(savedPersistentIndexes.begin(), savedPersistentIndexes.end(),
++ std::sort(savedPersistentIndexes.begin(), savedPersistentIndexes.end(),
+ qt_PersistentModelIndexLessThan);
+- std::stable_sort(savedPersistentCurrentIndexes.begin(), savedPersistentCurrentIndexes.end(),
++ std::sort(savedPersistentCurrentIndexes.begin(), savedPersistentCurrentIndexes.end(),
+ qt_PersistentModelIndexLessThan);
+
+ // update the selection by merging the individual indexes
+@@ -1092,8 +1092,8 @@ void QItemSelectionModelPrivate::_q_layoutChanged(const QList<QPersistentModelIn
+ savedPersistentCurrentIndexes.clear();
+ } else {
+ // sort the "new" selection, as preparation for merging
+- std::stable_sort(savedPersistentRowLengths.begin(), savedPersistentRowLengths.end());
+- std::stable_sort(savedPersistentCurrentRowLengths.begin(), savedPersistentCurrentRowLengths.end());
++ std::sort(savedPersistentRowLengths.begin(), savedPersistentRowLengths.end());
++ std::sort(savedPersistentCurrentRowLengths.begin(), savedPersistentCurrentRowLengths.end());
+
+ // update the selection by merging the individual indexes
+ ranges = mergeRowLengths(savedPersistentRowLengths);
+
+--- a/qtbase/src/corelib/itemmodels/qitemselectionmodel_p.h
++++ b/qtbase/src/corelib/itemmodels/qitemselectionmodel_p.h
+@@ -76,7 +76,7 @@ public:
+ void _q_rowsAboutToBeInserted(const QModelIndex &parent, int start, int end);
+ void _q_columnsAboutToBeInserted(const QModelIndex &parent, int start, int end);
+ void _q_layoutAboutToBeChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint);
+- void _q_layoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint);
++ __attribute__ ((optnone)) void _q_layoutChanged(const QList<QPersistentModelIndex> &parents = QList<QPersistentModelIndex>(), QAbstractItemModel::LayoutChangeHint hint = QAbstractItemModel::NoLayoutChangeHint);
+
+ inline void remove(QList<QItemSelectionRange> &r)
+ {
+
+--- a/qtbase/src/corelib/time/qdatetimeparser_p.h
++++ b/qtbase/src/corelib/time/qdatetimeparser_p.h
+@@ -215,7 +215,7 @@ private:
+ : value(ok == Invalid ? -1 : val), used(read), zeroes(zs), state(ok)
+ {}
+ };
+- ParsedSection parseSection(const QDateTime &currentValue, int sectionIndex,
++ __attribute__ ((optnone)) ParsedSection parseSection(const QDateTime &currentValue, int sectionIndex,
+ int offset, QString *text) const;
+ int findMonth(const QString &str1, int monthstart, int sectionIndex,
+ int year, QString *monthName = nullptr, int *used = nullptr) const;
+
+--- a/qtbase/src/corelib/time/qtimezoneprivate_p.h
++++ b/qtbase/src/corelib/time/qtimezoneprivate_p.h
+@@ -191,7 +191,7 @@ public:
+ virtual ~QUtcTimeZonePrivate();
+
+ // Fall-back for UTC[+-]\d+(:\d+){,2} IDs.
+- static qint64 offsetFromUtcString(const QByteArray &id);
++ static __attribute__ ((optnone)) qint64 offsetFromUtcString(const QByteArray &id);
+
+ QUtcTimeZonePrivate *clone() const override;
+
+--- a/qtbase/src/widgets/widgets/qcalendarwidget.cpp
++++ b/qtbase/src/widgets/widgets/qcalendarwidget.cpp
+@@ -329,13 +329,13 @@ class QCalendarYearValidator : public QCalendarDateSectionValidator
+
+ public:
+ QCalendarYearValidator();
+- virtual Section handleKey(int key) override;
++ __attribute__ ((optnone)) virtual Section handleKey(int key) override;
+ virtual QDate applyToDate(QDate date, QCalendar cal) const override;
+ virtual void setDate(QDate date, QCalendar cal) override;
+ virtual QString text() const override;
+ virtual QString text(QDate date, QCalendar cal, int repeat) const override;
+ private:
+- int pow10(int n);
++ __attribute__ ((optnone)) int pow10(int n);
+ int m_pos;
+ int m_year;
+ int m_oldYear;
diff --git a/depends/patches/systemtap/fix_variadic_warning.patch b/depends/patches/systemtap/fix_variadic_warning.patch
deleted file mode 100644
index 93cc2d6081..0000000000
--- a/depends/patches/systemtap/fix_variadic_warning.patch
+++ /dev/null
@@ -1,16 +0,0 @@
-Could be dropped after a migration to C++20.
-See: https://github.com/bitcoin/bitcoin/issues/26916.
-
-diff --git a/includes/sys/sdt.h b/includes/sys/sdt.h
-index 4075a5f..7c6138c 100644
---- a/includes/sys/sdt.h
-+++ b/includes/sys/sdt.h
-@@ -276,7 +276,7 @@ __extension__ extern unsigned long long __sdt_unsp;
- _SDT_ASM_1(.purgem _SDT_TYPE_) \
- _SDT_ASM_1(.purgem _SDT_TYPE)
-
--#define _SDT_ASM_BODY(provider, name, pack_args, args, ...) \
-+#define _SDT_ASM_BODY(provider, name, pack_args, args) \
- _SDT_DEF_MACROS \
- _SDT_ASM_1(990: _SDT_NOP) \
- _SDT_ASM_3( .pushsection .note.stapsdt,_SDT_ASM_AUTOGROUP,"note") \
diff --git a/doc/bips.md b/doc/bips.md
index 952d289daa..8309ee7e92 100644
--- a/doc/bips.md
+++ b/doc/bips.md
@@ -49,7 +49,7 @@ BIPs that are implemented by Bitcoin Core:
* [`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)).
* [`BIP 176`](https://github.com/bitcoin/bips/blob/master/bip-0176.mediawiki): Bits Denomination [QT only] is supported as of **v0.16.0** ([PR 12035](https://github.com/bitcoin/bitcoin/pull/12035)).
-* [`BIP 324`](https://github.com/bitcoin/bips/blob/master/bip-0324.mediawiki): The v2 transport protocol specified by BIP324 and the associated `NODE_P2P_V2` service bit are supported as of **v26.0**, but off by default ([PR 28331](https://github.com/bitcoin/bitcoin/pull/28331)).
+* [`BIP 324`](https://github.com/bitcoin/bips/blob/master/bip-0324.mediawiki): The v2 transport protocol specified by BIP324 and the associated `NODE_P2P_V2` service bit are supported as of **v26.0**, but off by default ([PR 28331](https://github.com/bitcoin/bitcoin/pull/28331)). On by default as of **v27.0** ([PR 29347](https://github.com/bitcoin/bitcoin/pull/29347)).
* [`BIP 325`](https://github.com/bitcoin/bips/blob/master/bip-0325.mediawiki): Signet test network is supported as of **v0.21.0** ([PR 18267](https://github.com/bitcoin/bitcoin/pull/18267)).
* [`BIP 339`](https://github.com/bitcoin/bips/blob/master/bip-0339.mediawiki): Relay of transactions by wtxid is supported as of **v0.21.0** ([PR 18044](https://github.com/bitcoin/bitcoin/pull/18044)).
* [`BIP 340`](https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki)
diff --git a/doc/build-openbsd.md b/doc/build-openbsd.md
index 96ee714341..7ed83853a8 100644
--- a/doc/build-openbsd.md
+++ b/doc/build-openbsd.md
@@ -1,6 +1,6 @@
# OpenBSD Build Guide
-**Updated for OpenBSD [7.3](https://www.openbsd.org/73.html)**
+**Updated for OpenBSD [7.4](https://www.openbsd.org/74.html)**
This guide describes how to build bitcoind, command-line utilities, and GUI on OpenBSD.
@@ -43,6 +43,8 @@ BerkeleyDB is only required to support legacy wallets.
It is recommended to use Berkeley DB 4.8. You cannot use the BerkeleyDB library
from ports. However you can build it yourself, [using depends](/depends).
+Refer to [depends/README.md](/depends/README.md) for detailed instructions.
+
```bash
gmake -C depends NO_BOOST=1 NO_LIBEVENT=1 NO_QT=1 NO_SQLITE=1 NO_NATPMP=1 NO_UPNP=1 NO_ZMQ=1 NO_USDT=1
...
diff --git a/doc/dependencies.md b/doc/dependencies.md
index ba8643be79..e992b50b06 100644
--- a/doc/dependencies.md
+++ b/doc/dependencies.md
@@ -8,7 +8,7 @@ You can find installation instructions in the `build-*.md` file for your platfor
| --- | --- |
| [Autoconf](https://www.gnu.org/software/autoconf/) | [2.69](https://github.com/bitcoin/bitcoin/pull/17769) |
| [Automake](https://www.gnu.org/software/automake/) | [1.13](https://github.com/bitcoin/bitcoin/pull/18290) |
-| [Clang](https://clang.llvm.org) | [13.0](https://github.com/bitcoin/bitcoin/pull/28210) |
+| [Clang](https://clang.llvm.org) | [14.0](https://github.com/bitcoin/bitcoin/pull/29208) |
| [GCC](https://gcc.gnu.org) | [10.1](https://github.com/bitcoin/bitcoin/pull/28348) |
| [Python](https://www.python.org) (scripts, tests) | [3.9](https://github.com/bitcoin/bitcoin/pull/28211) |
| [systemtap](https://sourceware.org/systemtap/) ([tracing](tracing.md))| N/A |
diff --git a/doc/design/assumeutxo.md b/doc/design/assumeutxo.md
index 66962a629d..abb623fc69 100644
--- a/doc/design/assumeutxo.md
+++ b/doc/design/assumeutxo.md
@@ -21,7 +21,7 @@ minimum and uses at least 1100 MiB.
As the background sync continues there will be temporarily two chainstate
directories, each multiple gigabytes in size (likely growing larger than the
-the downloaded snapshot).
+downloaded snapshot).
### Indexes
@@ -145,7 +145,7 @@ sequentially.
Once the tip of the background chainstate hits the base block of the snapshot
chainstate, we stop use of the background chainstate by setting `m_disabled`, in
-`CompleteSnapshotValidation()`, which is checked in `ActivateBestChain()`). We hash the
+`MaybeCompleteSnapshotValidation()`, which is checked in `ActivateBestChain()`). We hash the
background chainstate's UTXO set contents and ensure it matches the compiled value in
`CMainParams::m_assumeutxo_data`.
diff --git a/doc/design/multiprocess.md b/doc/design/multiprocess.md
index 45681d12de..636d78d905 100644
--- a/doc/design/multiprocess.md
+++ b/doc/design/multiprocess.md
@@ -1,72 +1,264 @@
-# Multiprocess Bitcoin
+# Multiprocess Bitcoin Design Document
-On unix systems, the `--enable-multiprocess` build option can be passed to `./configure` to build new `bitcoin-node`, `bitcoin-wallet`, and `bitcoin-gui` executables alongside existing `bitcoind` and `bitcoin-qt` executables.
+Guide to the design and architecture of the Bitcoin Core multiprocess feature
-`bitcoin-node` is a drop-in replacement for `bitcoind`, and `bitcoin-gui` is a drop-in replacement for `bitcoin-qt`, and there are no differences in use or external behavior between the new and old executables. But internally (after [#10102](https://github.com/bitcoin/bitcoin/pull/10102)), `bitcoin-gui` will spawn a `bitcoin-node` process to run P2P and RPC code, communicating with it across a socket pair, and `bitcoin-node` will spawn `bitcoin-wallet` to run wallet code, also communicating over a socket pair. This will let node, wallet, and GUI code run in separate address spaces for better isolation, and allow future improvements like being able to start and stop components independently on different machines and environments.
+_This document describes the design of the multiprocess feature. For usage information, see the top-level [multiprocess.md](../multiprocess.md) file._
-## Next steps
+## Table of contents
-Specific next steps after [#10102](https://github.com/bitcoin/bitcoin/pull/10102) will be:
+- [Introduction](#introduction)
+- [Current Architecture](#current-architecture)
+- [Proposed Architecture](#proposed-architecture)
+- [Component Overview: Navigating the IPC Framework](#component-overview-navigating-the-ipc-framework)
+- [Design Considerations](#design-considerations)
+ - [Selection of Cap’n Proto](#selection-of-capn-proto)
+ - [Hiding IPC](#hiding-ipc)
+ - [Interface Definition Maintenance](#interface-definition-maintenance)
+ - [Interface Stability](#interface-stability)
+- [Security Considerations](#security-considerations)
+- [Example Use Cases and Flows](#example-use-cases-and-flows)
+ - [Retrieving a Block Hash](#retrieving-a-block-hash)
+- [Future Enhancements](#future-enhancements)
+- [Conclusion](#conclusion)
+- [Appendices](#appendices)
+ - [Glossary of Terms](#glossary-of-terms)
+ - [References](#references)
+- [Acknowledgements](#acknowledgements)
-- [ ] Adding `-ipcbind` and `-ipcconnect` options to `bitcoin-node`, `bitcoin-wallet`, and `bitcoin-gui` executables so they can listen and connect to TCP ports and unix socket paths. This will allow separate processes to be started and stopped any time and connect to each other.
-- [ ] Adding `-server` and `-rpcbind` options to the `bitcoin-wallet` executable so wallet processes can handle RPC requests directly without going through the node.
-- [ ] Supporting windows, not just unix systems. The existing socket code is already cross-platform, so the only windows-specific code that needs to be written is code spawning a process and passing a socket descriptor. This can be implemented with `CreateProcess` and `WSADuplicateSocket`. Example: https://memset.wordpress.com/2010/10/13/win32-api-passing-socket-with-ipc-method/.
-- [ ] Adding sandbox features, restricting subprocess access to resources and data. See [https://eklitzke.org/multiprocess-bitcoin](https://eklitzke.org/multiprocess-bitcoin).
+## Introduction
-## Debugging
+The Bitcoin Core software has historically employed a monolithic architecture. The existing design has integrated functionality like P2P network operations, wallet management, and a GUI into a single executable. While effective, it has limitations in flexibility, security, and scalability. This project introduces changes that transition Bitcoin Core to a more modular architecture. It aims to enhance security, improve usability, and facilitate maintenance and development of the software in the long run.
-The `-debug=ipc` command line option can be used to see requests and responses between processes.
+## Current Architecture
-## Installation
+The current system features two primary executables: `bitcoind` and `bitcoin-qt`. `bitcoind` combines a Bitcoin P2P node with an integrated JSON-RPC server, wallet, and indexes. `bitcoin-qt` extends this by incorporating a Qt-based GUI. This monolithic structure, although robust, presents challenges such as limited operational flexibility and increased security risks due to the tight integration of components.
-The multiprocess feature requires [Cap'n Proto](https://capnproto.org/) and [libmultiprocess](https://github.com/chaincodelabs/libmultiprocess) as dependencies. A simple way to get starting using it without installing these dependencies manually is to use the [depends system](../../depends) with the `MULTIPROCESS=1` [dependency option](../../depends#dependency-options) passed to make:
+## Proposed Architecture
+The new architecture divides the existing code into three specialized executables:
+
+- `bitcoin-node`: Manages the P2P node, indexes, and JSON-RPC server.
+- `bitcoin-wallet`: Handles all wallet functionality.
+- `bitcoin-gui`: Provides a standalone Qt-based GUI.
+
+This modular approach is designed to enhance security through component isolation and improve usability by allowing independent operation of each module. This allows for new use-cases, such as running the node on a dedicated machine and operating wallets and GUIs on separate machines with the flexibility to start and stop them as needed.
+
+This subdivision could be extended in the future. For example, indexes could be removed from the `bitcoin-node` executable and run in separate executables. And JSON-RPC servers could be added to wallet and index executables, so they can listen and respond to RPC requests on their own ports, without needing to forward RPC requests through `bitcoin-node`.
+
+<table><tr><td>
+
+```mermaid
+flowchart LR
+ node[bitcoin-node] -- listens on --> socket["&lt;datadir&gt;/node.sock"]
+ wallet[bitcoin-wallet] -- connects to --> socket
+ gui[bitcoin-gui] -- connects to --> socket
+```
+
+</td></tr><tr><td>
+Processes and socket connection.
+</td></tr></table>
+
+## Component Overview: Navigating the IPC Framework
+
+This section describes the major components of the Inter-Process Communication (IPC) framework covering the relevant source files, generated files, tools, and libraries.
+
+### Abstract C++ Classes in [`src/interfaces/`](../../src/interfaces/)
+- The foundation of the IPC implementation lies in the abstract C++ classes within the [`src/interfaces/`](../../src/interfaces/) directory. These classes define pure virtual methods that code in [`src/node/`](../../src/node/), [`src/wallet/`](../../src/wallet/), and [`src/qt/`](../../src/qt/) directories call to interact with each other.
+- Each abstract class in this directory represents a distinct interface that the different modules (node, wallet, GUI) implement and use for cross-process communication.
+- The classes are written following conventions described in [Internal Interface
+ Guidelines](../developer-notes.md#internal-interface-guidelines) to ensure
+ compatibility with Cap'n Proto.
+
+### Cap’n Proto Files in [`src/ipc/capnp/`](../../src/ipc/capnp/)
+- Corresponding to each abstract class, there are `.capnp` files within the [`src/ipc/capnp/`](../../src/ipc/capnp/) directory. These files are used as input to the `mpgen` tool (described below) to generate C++ code.
+- These Cap’n Proto files ([learn more about Cap'n Proto RPC](https://capnproto.org/rpc.html)) define the structure and format of messages that are exchanged over IPC. They serve as blueprints for generating C++ code that bridges the gap between high-level C++ interfaces and low-level socket communication.
+
+### The `mpgen` Code Generation Tool
+- A central component of the IPC framework is the `mpgen` tool which is part the [`libmultiprocess` project](https://github.com/chaincodelabs/libmultiprocess). This tool takes the `.capnp` files as input and generates C++ code.
+- The generated code handles IPC communication, translating interface calls into socket reads and writes.
+
+### C++ Client Subclasses in Generated Code
+- In the generated code, we have C++ client subclasses that inherit from the abstract classes in [`src/interfaces/`](../../src/interfaces/). These subclasses are the workhorses of the IPC mechanism.
+- They implement all the methods of the interface, marshalling arguments into a structured format, sending them as requests to the IPC server via a UNIX socket, and handling the responses.
+- These subclasses effectively mask the complexity of IPC, presenting a familiar C++ interface to developers.
+- Internally, the client subclasses generated by the `mpgen` tool wrap [client classes generated by Cap'n Proto](https://capnproto.org/cxxrpc.html#clients), and use them to send IPC requests.
+
+### C++ Server Classes in Generated Code
+- On the server side, corresponding generated C++ classes receive IPC requests. These server classes are responsible for unmarshalling method arguments, invoking the corresponding methods in the local [`src/interfaces/`](../../src/interfaces/) objects, and creating the IPC response.
+- The server classes ensure that return values (including output argument values and thrown exceptions) are marshalled and sent back to the client, completing the communication cycle.
+- Internally, the server subclasses generated by the `mpgen` tool inherit from [server classes generated by Cap'n Proto](https://capnproto.org/cxxrpc.html#servers), and use them to process IPC requests.
+
+### The `libmultiprocess` Runtime Library
+- **Core Functionality**: The `libmultiprocess` runtime library's primary function is to instantiate the generated client and server classes as needed.
+- **Bootstrapping IPC Connections**: It provides functions for starting new IPC connections, specifically binding generated client and server classes for an initial `interfaces::Init` interface (defined in [`src/interfaces/init.h`](../../src/interfaces/init.h)) to a UNIX socket. This initial interface has methods returning other interfaces that different Bitcoin Core modules use to communicate after the bootstrapping phase.
+- **Asynchronous I/O and Thread Management**: The library is also responsible for managing I/O and threading. Particularly, it ensures that IPC requests never block each other and that new threads on either side of a connection can always make client calls. It also manages worker threads on the server side of calls, ensuring that calls from the same client thread always execute on the same server thread (to avoid locking issues and support nested callbacks).
+
+### Type Hooks in [`src/ipc/capnp/*-types.h`](../../src/ipc/capnp/)
+- **Custom Type Conversions**: In [`src/ipc/capnp/*-types.h`](../../src/ipc/capnp/), function overloads of two `libmultiprocess` C++ functions, `mp::CustomReadField` and `mp::CustomBuildFields`, are defined. These overloads are used for customizing the conversion of specific C++ types to and from Cap’n Proto types.
+- **Handling Special Cases**: The `mpgen` tool and `libmultiprocess` library can convert most C++ types to and from Cap’n Proto types automatically, including interface types, primitive C++ types, standard C++ types like `std::vector`, `std::set`, `std::map`, `std::tuple`, and `std::function`, as well as simple C++ structs that consist of aforementioned types and whose fields correspond 1:1 with Cap’n Proto struct fields. For other types, `*-types.h` files provide custom code to convert between C++ and Cap’n Proto data representations.
+
+### Protocol-Agnostic IPC Code in [`src/ipc/`](../../src/ipc/)
+- **Broad Applicability**: Unlike the Cap’n Proto-specific code in [`src/ipc/capnp/`](../../src/ipc/capnp/), the code in the [`src/ipc/`](../../src/ipc/) directory is protocol-agnostic. This enables potential support for other protocols, such as gRPC or a custom protocol in the future.
+- **Process Management and Socket Operations**: The main purpose of this component is to provide functions for spawning new processes and creating and connecting to UNIX sockets.
+- **ipc::Exception Class**: This code also defines an `ipc::Exception` class which is thrown from the generated C++ client class methods when there is an unexpected IPC error, such as a disconnection.
+
+<table><tr><td>
+
+```mermaid
+flowchart TD
+ capnpFile[ipc/capnp/chain.capnp] -->|Input to| mpgenTool([mpgen Tool])
+ mpgenTool -->|Generates| proxyTypesH[ipc/capnp/chain.capnp.proxy-types.h]
+ mpgenTool --> proxyClientCpp[ipc/capnp/chain.capnp.proxy-client.c++]
+ mpgenTool --> proxyServerCpp[ipc/capnp/chain.capnp.proxy-server.c++]
+ proxyTypesH -.->|Includes| interfaces/chain.h
+ proxyClientCpp -.-> interfaces/chain.h
+ proxyServerCpp -.-> interfaces/chain.h
```
-cd <BITCOIN_SOURCE_DIRECTORY>
-make -C depends NO_QT=1 MULTIPROCESS=1
-CONFIG_SITE=$PWD/depends/x86_64-pc-linux-gnu/share/config.site ./configure
-make
-src/bitcoin-node -regtest -printtoconsole -debug=ipc
-BITCOIND=bitcoin-node test/functional/test_runner.py
+
+</td></tr><tr><td>
+Diagram showing generated source files and includes.
+</td></tr></table>
+
+## Design Considerations
+
+### Selection of Cap’n Proto
+The choice to use [Cap’n Proto](https://capnproto.org/) for IPC was primarily influenced by its support for passing object references and managing object lifetimes, which would have to be implemented manually with a framework that only supported plain requests and responses like [gRPC](https://grpc.io/). The support is especially helpful for passing callback objects like `std::function` and enabling bidirectional calls between processes.
+
+The choice to use an RPC framework at all instead of a custom protocol was necessitated by the size of Bitcoin Core internal interfaces which consist of around 150 methods that pass complex data structures and are called in complicated ways (in parallel, and from callbacks that can be nested and stored). Writing a custom protocol to wrap these complicated interfaces would be a lot more work, akin to writing a new RPC framework.
+
+### Hiding IPC
+
+The IPC mechanism is deliberately isolated from the rest of the codebase so less code has to be concerned with IPC.
+
+Building Bitcoin Core with IPC support is optional, and node, wallet, and GUI code can be compiled to either run in the same process or separate processes. The build system also ensures Cap’n Proto library headers can only be used within the [`src/ipc/capnp/`](../../src/ipc/capnp/) directory, not in other parts of the codebase.
+
+The libmultiprocess runtime is designed to place as few constraints as possible on IPC interfaces and to make IPC calls act like normal function calls. Method arguments, return values, and exceptions are automatically serialized and sent between processes. Object references and `std::function` arguments are tracked to allow invoked code to call back into invoking code at any time. And there is a 1:1 threading model where every client thread has a corresponding server thread responsible for executing incoming calls from that thread (there can be multiple calls from the same thread due to callbacks) without blocking, and holding the same thread-local variables and locks so behavior is the same whether IPC is used or not.
+
+### Interface Definition Maintenance
+
+The choice to maintain interface definitions and C++ type mappings as `.capnp` files in the [`src/ipc/capnp/`](../../src/ipc/capnp/) was mostly done for convenience, and probably something that could be improved in the future.
+
+In the current design, class names, method names, and parameter names are duplicated between C++ interfaces in [`src/interfaces/`](../../src/interfaces/) and Cap’n Proto files in [`src/ipc/capnp/`](../../src/ipc/capnp/). While this keeps C++ interface headers simple and free of references to IPC, it is a maintenance burden because it means inconsistencies between C++ declarations and Cap’n Proto declarations will result in compile errors. (Static type checking ensures these are not runtime errors.)
+
+An alternate approach could use custom [C++ Attributes](https://en.cppreference.com/w/cpp/language/attributes) embedded in interface declarations to automatically generate `.capnp` files from C++ headers. This has not been pursued because parsing C++ headers is more complicated than parsing Cap’n Proto interface definitions, especially portably on multiple platforms.
+
+In the meantime, the developer guide [Internal interface guidelines](developer-notes.md#internal-interface-guidelines) can provide guidance on keeping interfaces consistent and functional and avoiding compile errors.
+
+### Interface Stability
+
+The currently defined IPC interfaces are unstable, and can change freely with no backwards compatibility. The decision to allow this stems from the recognition that our current interfaces are still evolving and not yet ideal for external use. As these interfaces mature and become more refined, there may be an opportunity to declare them stable and use Cap’n Proto's support for protocol evolution ([Cap'n Proto - Evolving Your Protocol](https://capnproto.org/language.html#evolving-your-protocol)) to allow them to be extended while remaining backwards compatible. This could allow different versions of node, GUI, and wallet binaries to interoperate, and potentially open doors for external tools to utilize these interfaces, such as creating custom indexes through a stable indexing interface. However, for now, the priority is to improve the interfaces internally. Given their current state and the advantages of using JSON-RPC for most common tasks, it's more practical to focus on internal development rather than external applicability.
+
+## Security Considerations
+
+The integration of [Cap’n Proto](https://capnproto.org/) and [libmultiprocess](https://github.com/chaincodelabs/libmultiprocess) into the Bitcoin Core architecture increases its potential attack surface. Cap’n Proto, being a complex and substantial new dependency, introduces potential sources of vulnerability, particularly through the creation of new UNIX sockets. The inclusion of libmultiprocess, while a smaller external dependency, also contributes to this risk. However, plans are underway to incorporate libmultiprocess as a git subtree, aligning it more closely with the project's well-reviewed internal libraries. While adopting these multiprocess features does introduce some risk, it's worth noting that they can be disabled, allowing builds without these new dependencies. This flexibility ensures that users can balance functionality with security considerations as needed.
+
+## Example Use Cases and Flows
+
+### Retrieving a Block Hash
+
+Let’s walk through an example where the `bitcoin-wallet` process requests the hash of a block at a specific height from the `bitcoin-node` process. This example demonstrates the practical application of the IPC mechanism, specifically the interplay between C++ method calls and Cap’n Proto-generated RPC calls.
+
+<table><tr><td>
+
+```mermaid
+sequenceDiagram
+ box "bitcoin-wallet process"
+ participant WalletCode as Wallet code
+ participant ChainClient as Generated Chain client class<br/>ProxyClient<messages::Chain>
+ end
+ box "bitcoin-node process"
+ participant ChainServer as Generated Chain server class<br/>ProxyServer<messages::Chain>
+ participant LocalChain as Chain object<br/>node::ChainImpl
+ end
+
+ WalletCode->>ChainClient: getBlockHash(height)
+ ChainClient->>ChainServer: Send RPC getBlockHash request
+ ChainServer->>LocalChain: getBlockHash(height)
+ LocalChain->>ChainServer: Return block hash
+ ChainServer->>ChainClient: Send response with block hash
+ ChainClient->>WalletCode: Return block hash
```
-The configure script will pick up settings and library locations from the depends directory, so there is no need to pass `--enable-multiprocess` as a separate flag when using the depends system (it's controlled by the `MULTIPROCESS=1` option).
-
-Alternately, you can install [Cap'n Proto](https://capnproto.org/) and [libmultiprocess](https://github.com/chaincodelabs/libmultiprocess) packages on your system, and just run `./configure --enable-multiprocess` without using the depends system. The configure script will be able to locate the installed packages via [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/). See [Installation](https://github.com/chaincodelabs/libmultiprocess/blob/master/doc/install.md) section of the libmultiprocess readme for install steps. See [build-unix.md](../build-unix.md) and [build-osx.md](../build-osx.md) for information about installing dependencies in general.
-
-## IPC implementation details
-
-Cross process Node, Wallet, and Chain interfaces are defined in
-[`src/interfaces/`](../../src/interfaces/). These are C++ classes which follow
-[conventions](../developer-notes.md#internal-interface-guidelines), like passing
-serializable arguments so they can be called from different processes, and
-making methods pure virtual so they can have proxy implementations that forward
-calls between processes.
-
-When Wallet, Node, and Chain code is running in the same process, calling any
-interface method invokes the implementation directly. When code is running in
-different processes, calling an interface method invokes a proxy interface
-implementation that communicates with a remote process and invokes the real
-implementation in the remote process. The
-[libmultiprocess](https://github.com/chaincodelabs/libmultiprocess) code
-generation tool internally generates proxy client classes and proxy server
-classes for this purpose that are thin wrappers around Cap'n Proto
-[client](https://capnproto.org/cxxrpc.html#clients) and
-[server](https://capnproto.org/cxxrpc.html#servers) classes, which handle the
-actual serialization and socket communication.
-
-As much as possible, calls between processes are meant to work the same as
-calls within a single process without adding limitations or requiring extra
-implementation effort. Processes communicate with each other by calling regular
-[C++ interface methods](../../src/interfaces/README.md). Method arguments and
-return values are automatically serialized and sent between processes. Object
-references and `std::function` arguments are automatically tracked and mapped
-to allow invoked code to call back into invoking code at any time, and there is
-a 1:1 threading model where any thread invoking a method in another process has
-a corresponding thread in the invoked process responsible for executing all
-method calls from the source thread, without blocking I/O or holding up another
-call, and using the same thread local variables, locks, and callbacks between
-calls. The forwarding, tracking, and threading is implemented inside the
-[libmultiprocess](https://github.com/chaincodelabs/libmultiprocess) library
-which has the design goal of making calls between processes look like calls in
-the same process to the extent possible.
+</td></tr><tr><td>
+<code>Chain::getBlockHash</code> call diagram
+</td></tr></table>
+
+1. **Initiation in bitcoin-wallet**
+ - The wallet process calls the `getBlockHash` method on a `Chain` object. This method is defined as a virtual method in [`src/interfaces/chain.h`](../../src/interfaces/chain.h).
+
+2. **Translation to Cap’n Proto RPC**
+ - The `Chain::getBlockHash` virtual method is overridden by the `Chain` [client subclass](#c-client-subclasses-in-generated-code) to translate the method call into a Cap’n Proto RPC call.
+ - The client subclass is automatically generated by the `mpgen` tool from the [`chain.capnp`](https://github.com/ryanofsky/bitcoin/blob/pr/ipc/src/ipc/capnp/chain.capnp) file in [`src/ipc/capnp/`](../../src/ipc/capnp/).
+
+3. **Request Preparation and Dispatch**
+ - The `getBlockHash` method of the generated `Chain` client subclass in `bitcoin-wallet` populates a Cap’n Proto request with the `height` parameter, sends it to `bitcoin-node` process, and waits for a response.
+
+4. **Handling in bitcoin-node**
+ - Upon receiving the request, the Cap'n Proto dispatching code in the `bitcoin-node` process calls the `getBlockHash` method of the `Chain` [server class](#c-server-classes-in-generated-code).
+ - The server class is automatically generated by the `mpgen` tool from the [`chain.capnp`](https://github.com/ryanofsky/bitcoin/blob/pr/ipc/src/ipc/capnp/chain.capnp) file in [`src/ipc/capnp/`](../../src/ipc/capnp/).
+ - The `getBlockHash` method of the generated `Chain` server subclass in `bitcoin-wallet` receives a Cap’n Proto request object with the `height` parameter, and calls the `getBlockHash` method on its local `Chain` object with the provided `height`.
+ - When the call returns, it encapsulates the return value in a Cap’n Proto response, which it sends back to the `bitcoin-wallet` process,
+
+5. **Response and Return**
+ - The `getBlockHash` method of the generated `Chain` client subclass in `bitcoin-wallet` which sent the request now receives the response.
+ - It extracts the block hash value from the response, and returns it to the original caller.
+
+## Future Enhancements
+
+Further improvements are possible such as:
+
+- Separating indexes from `bitcoin-node`, and running indexing code in separate processes (see [indexes: Stop using node internal types #24230](https://github.com/bitcoin/bitcoin/pull/24230)).
+- Enabling wallet processes to listen for JSON-RPC requests on their own ports instead of needing the node process to listen and forward requests to them.
+- Automatically generating `.capnp` files from C++ interface definitions (see [Interface Definition Maintenance](#interface-definition-maintenance)).
+- Simplifying and stabilizing interfaces (see [Interface Stability](#interface-stability)).
+- Adding sandbox features, restricting subprocess access to resources and data (see [https://eklitzke.org/multiprocess-bitcoin](https://eklitzke.org/multiprocess-bitcoin)).
+- Using Cap'n Proto's support for [other languages](https://capnproto.org/otherlang.html), such as [Rust](https://github.com/capnproto/capnproto-rust), to allow code written in other languages to call Bitcoin Core C++ code, and vice versa (see [How to rustify libmultiprocess? #56](https://github.com/chaincodelabs/libmultiprocess/issues/56)).
+
+## Conclusion
+
+This modularization represents an advancement in Bitcoin Core's architecture, offering enhanced security, flexibility, and maintainability. The project invites collaboration and feedback from the community.
+
+## Appendices
+
+### Glossary of Terms
+
+- **abstract class**: A class in C++ that consists of virtual functions. In the Bitcoin Core project, they define interfaces for inter-component communication.
+
+- **asynchronous I/O**: A form of input/output processing that allows a program to continue other operations while a transmission is in progress.
+
+- **Cap’n Proto**: A high-performance data serialization and RPC library, chosen for its support for object references and bidirectional communication.
+
+- **Cap’n Proto interface**: A set of methods defined in Cap’n Proto to facilitate structured communication between different software components.
+
+- **Cap’n Proto struct**: A structured data format used in Cap’n Proto, similar to structs in C++, for organizing and transporting data across different processes.
+
+- **client class (in generated code)**: A C++ class generated from a Cap’n Proto interface which inherits from a Bitcoin core abstract class, and implements each virtual method to send IPC requests to another process. (see also [components section](#c-client-subclasses-in-generated-code))
+
+- **IPC (inter-process communication)**: Mechanisms that enable processes to exchange requests and data.
+
+- **ipc::Exception class**: A class within Bitcoin Core's protocol-agnostic IPC code that is thrown by client class methods when there is an IPC error.
+
+- **libmultiprocess**: A custom library and code generation tool used for creating IPC interfaces and managing IPC connections.
+
+- **marshalling**: Transforming an object’s memory representation for transmission.
+
+- **mpgen tool**: A tool within the `libmultiprocess` suite that generates C++ code from Cap’n Proto files, facilitating IPC.
+
+- **protocol-agnostic code**: Generic IPC code in [`src/ipc/`](../../src/ipc/) that does not rely on Cap’n Proto and could be used with other protocols. Distinct from code in [`src/ipc/capnp/`](../../src/ipc/capnp/) which relies on Cap’n Proto.
+
+- **RPC (remote procedure call)**: A protocol that enables a program to request a service from another program in a different address space or network. Bitcoin Core uses [JSON-RPC](https://en.wikipedia.org/wiki/JSON-RPC) for RPC.
+
+- **server class (in generated code)**: A C++ class generated from a Cap’n Proto interface which handles requests sent by a _client class_ in another process. The request handled by calling a local Bitcoin Core interface method, and the return values (if any) are sent back in a response. (see also: [components section](#c-server-classes-in-generated-code))
+
+- **unix socket**: Communication endpoint which is a filesystem path, used for exchanging data between processes running on the same host.
+
+- **virtual method**: A function or method whose behavior can be overridden within an inheriting class by a function with the same signature.
+
+## References
+
+- **Cap’n Proto RPC protocol description**: https://capnproto.org/rpc.html
+- **libmultiprocess project page**: https://github.com/chaincodelabs/libmultiprocess
+
+## Acknowledgements
+
+This design doc was written by @ryanofsky, who is grateful to all the reviewers who gave feedback and tested [multiprocess PRs](https://github.com/bitcoin/bitcoin/pull/28722), and everyone else who's helped with this project. Particular thanks to @ariard who deeply reviewed IPC code and improved the design of the IPC library and initialization process. @jnewbery who championed the early refactoring PRs and helped guide them through development and review. @sjors who has reviewed and repeatedly tested multiprocess code, reporting many issues and helping debug them. @hebasto, @fanquake, and @maflcko who made significant improvements to the build system and fixed countless build issues. @vasild and @jamesob who were brave contributors to the libmultiprocess library. And Chaincode Labs for making this work possible. Also thanks to ChatGPT, who actually wrote most of this document (not @ryanofsky).
diff --git a/doc/developer-notes.md b/doc/developer-notes.md
index 00a3b2ea6d..89c13600eb 100644
--- a/doc/developer-notes.md
+++ b/doc/developer-notes.md
@@ -113,6 +113,8 @@ code.
between integer types, use functional casts such as `int(x)` or `int{x}`
instead of `(int) x`. When casting between more complex types, use `static_cast`.
Use `reinterpret_cast` and `const_cast` as appropriate.
+ - Prefer [`list initialization ({})`](https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Res-list) where possible.
+ For example `int x{0};` instead of `int x = 0;` or `int x(0);`
For function calls a namespace should be specified explicitly, unless such functions have been declared within it.
Otherwise, [argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl), also known as ADL, could be
@@ -138,7 +140,7 @@ int main()
Block style example:
```c++
-int g_count = 0;
+int g_count{0};
namespace foo {
class Class
@@ -150,7 +152,7 @@ public:
{
// Comment summarising what this section of code does
for (int i = 0; i < n; ++i) {
- int total_sum = 0;
+ int total_sum{0};
// When something fails, return early
if (!Something()) return false;
...
@@ -356,7 +358,7 @@ produce better debugging builds.
### Show sources in debugging
If you have ccache enabled, absolute paths are stripped from debug information
-with the -fdebug-prefix-map and -fmacro-prefix-map options (if supported by the
+with the `-fdebug-prefix-map` and `-fmacro-prefix-map` options (if supported by the
compiler). This might break source file detection in case you move binaries
after compilation, debug from the directory other than the project root or use
an IDE that only supports absolute paths for debugging.
@@ -575,13 +577,6 @@ export UBSAN_OPTIONS="suppressions=$(pwd)/test/sanitizer_suppressions/ubsan:prin
See the CI config for more examples, and upstream documentation for more information
about any additional options.
-There are a number of known problems when using the `address` sanitizer. The
-address sanitizer is known to fail in
-[sha256_sse4::Transform](/src/crypto/sha256_sse4.cpp) which makes it unusable
-unless you also use `--disable-asm` when running configure. We would like to fix
-sanitizer issues, so please send pull requests if you can fix any errors found
-by the address sanitizer (or any other sanitizer).
-
Not all sanitizer options can be enabled at the same time, e.g. trying to build
with `--with-sanitizers=address,thread` will fail in the configure script as
these sanitizers are mutually incompatible. Refer to your compiler manual to
@@ -725,6 +720,47 @@ General Bitcoin Core
- *Explanation*: If the test suite is to be updated for a change, this has to
be done first.
+Logging
+-------
+
+The macros `LogInfo`, `LogDebug`, `LogTrace`, `LogWarning` and `LogError` are available for
+logging messages. They should be used as follows:
+
+- `LogDebug(BCLog::CATEGORY, fmt, params...)` is what you want
+ most of the time, and it should be used for log messages that are
+ useful for debugging and can reasonably be enabled on a production
+ system (that has sufficient free storage space). They will be logged
+ if the program is started with `-debug=category` or `-debug=1`.
+ Note that `LogPrint(BCLog::CATEGORY, fmt, params...)` is a deprecated
+ alias for `LogDebug`.
+
+- `LogInfo(fmt, params...)` should only be used rarely, e.g. for startup
+ messages or for infrequent and important events such as a new block tip
+ being found or a new outbound connection being made. These log messages
+ are unconditional, so care must be taken that they can't be used by an
+ attacker to fill up storage. Note that `LogPrintf(fmt, params...)` is
+ a deprecated alias for `LogInfo`.
+
+- `LogError(fmt, params...)` should be used in place of `LogInfo` for
+ severe problems that require the node (or a subsystem) to shut down
+ entirely (e.g., insufficient storage space).
+
+- `LogWarning(fmt, params...)` should be used in place of `LogInfo` for
+ severe problems that the node admin should address, but are not
+ severe enough to warrant shutting down the node (e.g., system time
+ appears to be wrong, unknown soft fork appears to have activated).
+
+- `LogTrace(BCLog::CATEGORY, fmt, params...)` should be used in place of
+ `LogDebug` for log messages that would be unusable on a production
+ system, e.g. due to being too noisy in normal use, or too resource
+ intensive to process. These will be logged if the startup
+ options `-debug=category -loglevel=category:trace` or `-debug=1
+ -loglevel=trace` are selected.
+
+Note that the format strings and parameters of `LogDebug` and `LogTrace`
+are only evaluated if the logging category is enabled, so you must be
+careful to avoid side-effects in those expressions.
+
Wallet
-------
@@ -887,7 +923,7 @@ Strings and formatting
`wcstoll`, `wcstombs`, `wcstoul`, `wcstoull`, `wcstoumax`, `wcswidth`,
`wcsxfrm`, `wctob`, `wctomb`, `wctrans`, `wctype`, `wcwidth`, `wprintf`
-- For `strprintf`, `LogPrint`, `LogPrintf` formatting characters don't need size specifiers.
+- For `strprintf`, `LogInfo`, `LogDebug`, etc formatting characters don't need size specifiers.
- *Rationale*: Bitcoin Core uses tinyformat, which is type safe. Leave them out to avoid confusion.
@@ -899,7 +935,7 @@ Strings and formatting
- *Rationale*: Although this is guaranteed to be safe starting with C++11, `.data()` communicates the intent better.
- - Do not use it when passing strings to `tfm::format`, `strprintf`, `LogPrint[f]`.
+ - Do not use it when passing strings to `tfm::format`, `strprintf`, `LogInfo`, `LogDebug`, etc.
- *Rationale*: This is redundant. Tinyformat handles strings.
diff --git a/doc/fuzzing.md b/doc/fuzzing.md
index a4b0198dd9..c9fb918c8f 100644
--- a/doc/fuzzing.md
+++ b/doc/fuzzing.md
@@ -127,11 +127,6 @@ The default Clang/LLVM version supplied by Apple on macOS does not include
fuzzing libraries, so macOS users will need to install a full version, for
example using `brew install llvm`.
-Should you run into problems with the address sanitizer, it is possible you
-may need to run `./configure` with `--disable-asm` to avoid errors
-with certain assembly code from Bitcoin Core's code. See [developer notes on sanitizers](https://github.com/bitcoin/bitcoin/blob/master/doc/developer-notes.md#sanitizers)
-for more information.
-
You may also need to take care of giving the correct path for `clang` and
`clang++`, like `CC=/path/to/clang CXX=/path/to/clang++` if the non-systems
`clang` does not come first in your path.
@@ -139,7 +134,7 @@ You may also need to take care of giving the correct path for `clang` and
Full configure that was tested on macOS with `brew` installed `llvm`:
```sh
-./configure --enable-fuzz --with-sanitizers=fuzzer,address,undefined --disable-asm CC=$(brew --prefix llvm)/bin/clang CXX=$(brew --prefix llvm)/bin/clang++
+./configure --enable-fuzz --with-sanitizers=fuzzer,address,undefined CC=$(brew --prefix llvm)/bin/clang CXX=$(brew --prefix llvm)/bin/clang++
```
Read the [libFuzzer documentation](https://llvm.org/docs/LibFuzzer.html) for more information. This [libFuzzer tutorial](https://github.com/google/fuzzing/blob/master/tutorial/libFuzzerTutorial.md) might also be of interest.
diff --git a/doc/multiprocess.md b/doc/multiprocess.md
new file mode 100644
index 0000000000..7ba89b3ff5
--- /dev/null
+++ b/doc/multiprocess.md
@@ -0,0 +1,34 @@
+# Multiprocess Bitcoin
+
+_This document describes usage of the multiprocess feature. For design information, see the [design/multiprocess.md](design/multiprocess.md) file._
+
+## Build Option
+
+On unix systems, the `--enable-multiprocess` build option can be passed to `./configure` to build new `bitcoin-node`, `bitcoin-wallet`, and `bitcoin-gui` executables alongside existing `bitcoind` and `bitcoin-qt` executables.
+
+## Debugging
+
+The `-debug=ipc` command line option can be used to see requests and responses between processes.
+
+## Installation
+
+The multiprocess feature requires [Cap'n Proto](https://capnproto.org/) and [libmultiprocess](https://github.com/chaincodelabs/libmultiprocess) as dependencies. A simple way to get started using it without installing these dependencies manually is to use the [depends system](../depends) with the `MULTIPROCESS=1` [dependency option](../depends#dependency-options) passed to make:
+
+```
+cd <BITCOIN_SOURCE_DIRECTORY>
+make -C depends NO_QT=1 MULTIPROCESS=1
+CONFIG_SITE=$PWD/depends/x86_64-pc-linux-gnu/share/config.site ./configure
+make
+src/bitcoin-node -regtest -printtoconsole -debug=ipc
+BITCOIND=bitcoin-node test/functional/test_runner.py
+```
+
+The configure script will pick up settings and library locations from the depends directory, so there is no need to pass `--enable-multiprocess` as a separate flag when using the depends system (it's controlled by the `MULTIPROCESS=1` option).
+
+Alternately, you can install [Cap'n Proto](https://capnproto.org/) and [libmultiprocess](https://github.com/chaincodelabs/libmultiprocess) packages on your system, and just run `./configure --enable-multiprocess` without using the depends system. The configure script will be able to locate the installed packages via [pkg-config](https://www.freedesktop.org/wiki/Software/pkg-config/). See [Installation](https://github.com/chaincodelabs/libmultiprocess/blob/master/doc/install.md) section of the libmultiprocess readme for install steps. See [build-unix.md](build-unix.md) and [build-osx.md](build-osx.md) for information about installing dependencies in general.
+
+## Usage
+
+`bitcoin-node` is a drop-in replacement for `bitcoind`, and `bitcoin-gui` is a drop-in replacement for `bitcoin-qt`, and there are no differences in use or external behavior between the new and old executables. But internally after [#10102](https://github.com/bitcoin/bitcoin/pull/10102), `bitcoin-gui` will spawn a `bitcoin-node` process to run P2P and RPC code, communicating with it across a socket pair, and `bitcoin-node` will spawn `bitcoin-wallet` to run wallet code, also communicating over a socket pair. This will let node, wallet, and GUI code run in separate address spaces for better isolation, and allow future improvements like being able to start and stop components independently on different machines and environments.
+[#19460](https://github.com/bitcoin/bitcoin/pull/19460) also adds a new `bitcoin-node` `-ipcbind` option and an `bitcoind-wallet` `-ipcconnect` option to allow new wallet processes to connect to an existing node process.
+And [#19461](https://github.com/bitcoin/bitcoin/pull/19461) adds a new `bitcoin-gui` `-ipcconnect` option to allow new GUI processes to connect to an existing node process.
diff --git a/doc/offline-signing-tutorial.md b/doc/offline-signing-tutorial.md
index 4761cf256b..401ee52c1c 100644
--- a/doc/offline-signing-tutorial.md
+++ b/doc/offline-signing-tutorial.md
@@ -114,7 +114,7 @@ At this point, it's important to understand that both the `offline_wallet` and o
tb1qtu5qgc6ddhmqm5yqjvhg83qgk2t4ewajg0h6yh
```
-2. Visit a faucet like https://signet.bc-2.jp and enter your address from the previous command to receive a small amount of signet coins to this address.
+2. Visit a faucet like https://signetfaucet.com and enter your address from the previous command to receive a small amount of signet coins to this address.
3. Confirm that coins were received using the online `watch_only_wallet`. Note that the transaction may take a few moments before being received on your local node, depending on its connectivity. Just re-run the command periodically until the transaction is received.
@@ -252,4 +252,4 @@ You can also show transactions related to the wallet using `listtransactions`
{
...
}
-``` \ No newline at end of file
+```
diff --git a/doc/policy/README.md b/doc/policy/README.md
index 27536407e7..4392ffb610 100644
--- a/doc/policy/README.md
+++ b/doc/policy/README.md
@@ -2,8 +2,8 @@
**Policy** (Mempool or Transaction Relay Policy) is the node's set of validation rules, in addition
to consensus, enforced for unconfirmed transactions before submitting them to the mempool. These
-rules are local to the node and configurable (e.g. `-minrelaytxfee`, `-limitancestorsize`,
-`-incrementalrelayfee`). Policy may include restrictions on the transaction itself, the transaction
+rules are local to the node and configurable, see "Node relay options" when running `-help`.
+Policy may include restrictions on the transaction itself, the transaction
in relation to the current chain tip, and the transaction in relation to the node's mempool
contents. Policy is *not* applied to transactions in blocks.
diff --git a/doc/policy/mempool-replacements.md b/doc/policy/mempool-replacements.md
index b3c4239b73..3fd7ff2ad2 100644
--- a/doc/policy/mempool-replacements.md
+++ b/doc/policy/mempool-replacements.md
@@ -11,7 +11,8 @@ their in-mempool descendants (together, "original transactions") if, in addition
other consensus and policy rules, each of the following conditions are met:
1. The directly conflicting transactions all signal replaceability explicitly. A transaction is
- signaling replaceability if any of its inputs have an nSequence number less than (0xffffffff - 1).
+ signaling BIP125 replaceability if any of its inputs have an nSequence number less than (0xffffffff - 1).
+ A transaction also signals replaceability if its nVersion field is set to 3.
*Rationale*: See [BIP125
explanation](https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki#motivation).
diff --git a/doc/release-notes-28207.md b/doc/release-notes-28207.md
deleted file mode 100644
index 56b88da16a..0000000000
--- a/doc/release-notes-28207.md
+++ /dev/null
@@ -1,7 +0,0 @@
-mempool.dat compatibility
-========================
-
-The `mempool.dat` file created by -persistmempool or the savemempool RPC will
-be written in a new format, which can not be read by previous software
-releases. To allow for a downgrade, a temporary setting `-persistmempoolv1` has
-been added to fall back to the legacy format.
diff --git a/doc/shared-libraries.md b/doc/shared-libraries.md
index 07aee46f0b..3a448c6556 100644
--- a/doc/shared-libraries.md
+++ b/doc/shared-libraries.md
@@ -2,6 +2,7 @@ Shared Libraries
================
## bitcoinconsensus
+***This library is deprecated and will be removed in v28***
The purpose of this library is to make the verification functionality that is critical to Bitcoin's consensus available to other applications, e.g. to language bindings.
diff --git a/doc/translation_process.md b/doc/translation_process.md
index 97a8fbfff2..e5ed7f4e0a 100644
--- a/doc/translation_process.md
+++ b/doc/translation_process.md
@@ -44,21 +44,7 @@ Visit the [Transifex Signup](https://www.transifex.com/signup/) page to create a
You can find the Bitcoin translation project at [https://www.transifex.com/bitcoin/bitcoin/](https://www.transifex.com/bitcoin/bitcoin/).
### Installing the Transifex client command-line tool
-The client is used to fetch updated translations. If you are having problems, or need more details, see [https://docs.transifex.com/client/installing-the-client](https://docs.transifex.com/client/installing-the-client)
-
-`pip install transifex-client`
-
-Setup your Transifex client config as follows. Please *ignore the token field*.
-
-```ini
-nano ~/.transifexrc
-
-[https://www.transifex.com]
-hostname = https://www.transifex.com
-password = PASSWORD
-token =
-username = USERNAME
-```
+The client is used to fetch updated translations. Please check installation instructions and any other details at https://developers.transifex.com/docs/cli.
The Transifex Bitcoin project config file is included as part of the repo. It can be found at `.tx/config`, however you shouldn’t need to change anything.
diff --git a/src/.clang-format b/src/.clang-format
index 2e5d5c6449..f20e5ee2d4 100644
--- a/src/.clang-format
+++ b/src/.clang-format
@@ -43,5 +43,7 @@ SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
+BreakBeforeConceptDeclarations: Always
+RequiresExpressionIndentation: OuterScope
Standard: c++20
UseTab: Never
diff --git a/src/Makefile.am b/src/Makefile.am
index b6f0daaaba..1f55bfbafd 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -8,8 +8,9 @@ print-%: FORCE
DIST_SUBDIRS = secp256k1
-AM_LDFLAGS = $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) $(GPROF_LDFLAGS) $(SANITIZER_LDFLAGS) $(LTO_LDFLAGS) $(CORE_LDFLAGS)
-AM_CXXFLAGS = $(DEBUG_CXXFLAGS) $(HARDENED_CXXFLAGS) $(WARN_CXXFLAGS) $(NOWARN_CXXFLAGS) $(ERROR_CXXFLAGS) $(GPROF_CXXFLAGS) $(SANITIZER_CXXFLAGS) $(LTO_CXXFLAGS) $(CORE_CXXFLAGS)
+AM_LDFLAGS = $(LIBTOOL_LDFLAGS) $(HARDENED_LDFLAGS) $(GPROF_LDFLAGS) $(SANITIZER_LDFLAGS) $(CORE_LDFLAGS)
+AM_CXXFLAGS = $(CORE_CXXFLAGS) $(DEBUG_CXXFLAGS) $(HARDENED_CXXFLAGS) $(WARN_CXXFLAGS) $(NOWARN_CXXFLAGS) $(ERROR_CXXFLAGS) $(GPROF_CXXFLAGS) $(SANITIZER_CXXFLAGS)
+AM_OBJCXXFLAGS = $(AM_CXXFLAGS)
AM_CPPFLAGS = $(DEBUG_CPPFLAGS) $(HARDENED_CPPFLAGS) $(CORE_CPPFLAGS)
AM_LIBTOOLFLAGS = --preserve-dup-deps
PTHREAD_FLAGS = $(PTHREAD_CFLAGS) $(PTHREAD_LIBS)
@@ -238,6 +239,7 @@ BITCOIN_CORE_H = \
node/validation_cache_args.h \
noui.h \
outputtype.h \
+ policy/v3_policy.h \
policy/feerate.h \
policy/fees.h \
policy/fees_args.h \
@@ -321,6 +323,7 @@ BITCOIN_CORE_H = \
util/spanparsing.h \
util/string.h \
util/syserror.h \
+ util/task_runner.h \
util/thread.h \
util/threadinterrupt.h \
util/threadnames.h \
@@ -437,6 +440,7 @@ libbitcoin_node_a_SOURCES = \
node/utxo_snapshot.cpp \
node/validation_cache_args.cpp \
noui.cpp \
+ policy/v3_policy.cpp \
policy/fees.cpp \
policy/fees_args.cpp \
policy/packages.cpp \
@@ -541,6 +545,10 @@ libbitcoin_wallet_tool_a_SOURCES = \
#
# crypto #
+
+# crypto_base contains the unspecialized (unoptimized) versions of our
+# crypto functions. Functions that require custom compiler flags and/or
+# runtime opt-in are omitted.
crypto_libbitcoin_crypto_base_la_CPPFLAGS = $(AM_CPPFLAGS)
# Specify -static in both CXXFLAGS and LDFLAGS so libtool will only build a
@@ -574,6 +582,7 @@ crypto_libbitcoin_crypto_base_la_SOURCES = \
crypto/sha1.h \
crypto/sha256.cpp \
crypto/sha256.h \
+ crypto/sha256_sse4.cpp \
crypto/sha3.cpp \
crypto/sha3.h \
crypto/sha512.cpp \
@@ -581,10 +590,6 @@ crypto_libbitcoin_crypto_base_la_SOURCES = \
crypto/siphash.cpp \
crypto/siphash.h
-if USE_ASM
-crypto_libbitcoin_crypto_base_la_SOURCES += crypto/sha256_sse4.cpp
-endif
-
# See explanation for -static in crypto_libbitcoin_crypto_base_la's LDFLAGS and
# CXXFLAGS above
crypto_libbitcoin_crypto_sse41_la_LDFLAGS = $(AM_LDFLAGS) -static
@@ -691,6 +696,7 @@ libbitcoin_common_a_SOURCES = \
netbase.cpp \
net_permissions.cpp \
outputtype.cpp \
+ policy/v3_policy.cpp \
policy/feerate.cpp \
policy/policy.cpp \
protocol.cpp \
@@ -906,7 +912,7 @@ lib_LTLIBRARIES += $(LIBBITCOINKERNEL)
libbitcoinkernel_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS) $(PTHREAD_FLAGS)
libbitcoinkernel_la_LIBADD = $(LIBBITCOIN_CRYPTO) $(LIBLEVELDB) $(LIBMEMENV) $(LIBSECP256K1)
-libbitcoinkernel_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS)
+libbitcoinkernel_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include $(BOOST_CPPFLAGS) $(LEVELDB_CPPFLAGS)
# libbitcoinkernel requires default symbol visibility, explicitly specify that
# here so that things still work even when user configures with
@@ -949,6 +955,7 @@ libbitcoinkernel_la_SOURCES = \
node/blockstorage.cpp \
node/chainstate.cpp \
node/utxo_snapshot.cpp \
+ policy/v3_policy.cpp \
policy/feerate.cpp \
policy/packages.cpp \
policy/policy.cpp \
@@ -960,7 +967,6 @@ libbitcoinkernel_la_SOURCES = \
pubkey.cpp \
random.cpp \
randomenv.cpp \
- scheduler.cpp \
script/interpreter.cpp \
script/script.cpp \
script/script_error.cpp \
@@ -977,7 +983,6 @@ libbitcoinkernel_la_SOURCES = \
util/batchpriority.cpp \
util/chaintype.cpp \
util/check.cpp \
- util/exception.cpp \
util/fs.cpp \
util/fs_helpers.cpp \
util/hasher.cpp \
@@ -988,7 +993,6 @@ libbitcoinkernel_la_SOURCES = \
util/strencodings.cpp \
util/string.cpp \
util/syserror.cpp \
- util/thread.cpp \
util/threadnames.cpp \
util/time.cpp \
util/tokenpipe.cpp \
@@ -1012,7 +1016,7 @@ libbitcoinconsensus_la_SOURCES = support/cleanse.cpp $(crypto_libbitcoin_crypto_
libbitcoinconsensus_la_LDFLAGS = $(AM_LDFLAGS) -no-undefined $(RELDFLAGS)
libbitcoinconsensus_la_LIBADD = $(LIBSECP256K1)
-libbitcoinconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL
+libbitcoinconsensus_la_CPPFLAGS = $(AM_CPPFLAGS) -I$(builddir)/obj -I$(srcdir)/secp256k1/include -DBUILD_BITCOIN_INTERNAL -DDISABLE_OPTIMIZED_SHA256
libbitcoinconsensus_la_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
endif
@@ -1090,6 +1094,7 @@ ipc/capnp/libbitcoin_ipc_a-protocol.$(OBJEXT): $(libbitcoin_ipc_mpgen_input:=.h)
if BUILD_MULTIPROCESS
LIBBITCOIN_IPC=libbitcoin_ipc.a
libbitcoin_ipc_a_SOURCES = \
+ ipc/capnp/common-types.h \
ipc/capnp/context.h \
ipc/capnp/init-types.h \
ipc/capnp/protocol.cpp \
diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include
index 217f123b16..b24405ce19 100644
--- a/src/Makefile.bench.include
+++ b/src/Makefile.bench.include
@@ -46,6 +46,7 @@ bench_bench_bitcoin_SOURCES = \
bench/poly1305.cpp \
bench/pool.cpp \
bench/prevector.cpp \
+ bench/readblock.cpp \
bench/rollingbloom.cpp \
bench/rpc_blockchain.cpp \
bench/rpc_mempool.cpp \
@@ -87,6 +88,8 @@ bench_bench_bitcoin_SOURCES += bench/wallet_balance.cpp
bench_bench_bitcoin_SOURCES += bench/wallet_create.cpp
bench_bench_bitcoin_SOURCES += bench/wallet_loading.cpp
bench_bench_bitcoin_SOURCES += bench/wallet_create_tx.cpp
+bench_bench_bitcoin_SOURCES += bench/wallet_ismine.cpp
+
bench_bench_bitcoin_LDADD += $(BDB_LIBS) $(SQLITE_LIBS)
endif
diff --git a/src/Makefile.qt_locale.include b/src/Makefile.qt_locale.include
index d7f586f3dc..2af9fd01af 100644
--- a/src/Makefile.qt_locale.include
+++ b/src/Makefile.qt_locale.include
@@ -1,4 +1,5 @@
QT_TS = \
+ qt/locale/bitcoin_af.ts \
qt/locale/bitcoin_am.ts \
qt/locale/bitcoin_ar.ts \
qt/locale/bitcoin_az.ts \
@@ -31,6 +32,7 @@ QT_TS = \
qt/locale/bitcoin_fa.ts \
qt/locale/bitcoin_fi.ts \
qt/locale/bitcoin_fil.ts \
+ qt/locale/bitcoin_fo.ts \
qt/locale/bitcoin_fr.ts \
qt/locale/bitcoin_fr_CM.ts \
qt/locale/bitcoin_fr_LU.ts \
@@ -52,6 +54,7 @@ QT_TS = \
qt/locale/bitcoin_ja.ts \
qt/locale/bitcoin_ka.ts \
qt/locale/bitcoin_kk.ts \
+ qt/locale/bitcoin_kk@latin.ts \
qt/locale/bitcoin_kl.ts \
qt/locale/bitcoin_km.ts \
qt/locale/bitcoin_kn.ts \
@@ -60,15 +63,18 @@ QT_TS = \
qt/locale/bitcoin_ku_IQ.ts \
qt/locale/bitcoin_ky.ts \
qt/locale/bitcoin_la.ts \
+ qt/locale/bitcoin_lb.ts \
qt/locale/bitcoin_lt.ts \
qt/locale/bitcoin_lv.ts \
qt/locale/bitcoin_mg.ts \
+ qt/locale/bitcoin_mi.ts \
qt/locale/bitcoin_mk.ts \
qt/locale/bitcoin_ml.ts \
qt/locale/bitcoin_mn.ts \
qt/locale/bitcoin_mr.ts \
qt/locale/bitcoin_mr_IN.ts \
qt/locale/bitcoin_ms.ts \
+ qt/locale/bitcoin_mt.ts \
qt/locale/bitcoin_my.ts \
qt/locale/bitcoin_nb.ts \
qt/locale/bitcoin_ne.ts \
@@ -78,11 +84,11 @@ QT_TS = \
qt/locale/bitcoin_pam.ts \
qt/locale/bitcoin_pl.ts \
qt/locale/bitcoin_pt.ts \
- qt/locale/bitcoin_pt@qtfiletype.ts \
qt/locale/bitcoin_pt_BR.ts \
qt/locale/bitcoin_ro.ts \
qt/locale/bitcoin_ru.ts \
qt/locale/bitcoin_sc.ts \
+ qt/locale/bitcoin_sd.ts \
qt/locale/bitcoin_si.ts \
qt/locale/bitcoin_sk.ts \
qt/locale/bitcoin_sl.ts \
@@ -97,7 +103,6 @@ QT_TS = \
qt/locale/bitcoin_szl.ts \
qt/locale/bitcoin_ta.ts \
qt/locale/bitcoin_te.ts \
- qt/locale/bitcoin_th.ts \
qt/locale/bitcoin_tk.ts \
qt/locale/bitcoin_tl.ts \
qt/locale/bitcoin_tr.ts \
diff --git a/src/Makefile.test.include b/src/Makefile.test.include
index 416a11b0c0..9f9bdbbd0c 100644
--- a/src/Makefile.test.include
+++ b/src/Makefile.test.include
@@ -117,6 +117,7 @@ BITCOIN_TESTS =\
test/net_tests.cpp \
test/netbase_tests.cpp \
test/orphanage_tests.cpp \
+ test/peerman_tests.cpp \
test/pmt_tests.cpp \
test/policy_fee_tests.cpp \
test/policyestimator_tests.cpp \
@@ -216,6 +217,39 @@ BITCOIN_TEST_SUITE += \
wallet/test/init_test_fixture.h
endif # ENABLE_WALLET
+if BUILD_MULTIPROCESS
+# Add boost ipc_tests definition to BITCOIN_TESTS
+BITCOIN_TESTS += test/ipc_tests.cpp
+
+# Build ipc_test code in a separate library so it can be compiled with custom
+# LIBMULTIPROCESS_CFLAGS without those flags affecting other tests
+LIBBITCOIN_IPC_TEST=libbitcoin_ipc_test.a
+EXTRA_LIBRARIES += $(LIBBITCOIN_IPC_TEST)
+libbitcoin_ipc_test_a_SOURCES = \
+ test/ipc_test.cpp \
+ test/ipc_test.h
+libbitcoin_ipc_test_a_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES)
+libbitcoin_ipc_test_a_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS) $(LIBMULTIPROCESS_CFLAGS)
+
+# Generate various .c++/.h files from the ipc_test.capnp file
+include $(MPGEN_PREFIX)/include/mpgen.mk
+EXTRA_DIST += test/ipc_test.capnp
+libbitcoin_ipc_test_mpgen_output = \
+ test/ipc_test.capnp.c++ \
+ test/ipc_test.capnp.h \
+ test/ipc_test.capnp.proxy-client.c++ \
+ test/ipc_test.capnp.proxy-server.c++ \
+ test/ipc_test.capnp.proxy-types.c++ \
+ test/ipc_test.capnp.proxy-types.h \
+ test/ipc_test.capnp.proxy.h
+nodist_libbitcoin_ipc_test_a_SOURCES = $(libbitcoin_ipc_test_mpgen_output)
+CLEANFILES += $(libbitcoin_ipc_test_mpgen_output)
+endif
+
+# Explicitly list dependencies on generated headers as described in
+# https://www.gnu.org/software/automake/manual/html_node/Built-Sources-Example.html#Recording-Dependencies-manually
+test/libbitcoin_ipc_test_a-ipc_test.$(OBJEXT): test/ipc_test.capnp.h
+
test_test_bitcoin_SOURCES = $(BITCOIN_TEST_SUITE) $(BITCOIN_TESTS) $(JSON_TEST_FILES) $(RAW_TEST_FILES)
test_test_bitcoin_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(TESTDEFS) $(BOOST_CPPFLAGS) $(EVENT_CFLAGS)
test_test_bitcoin_LDADD = $(LIBTEST_UTIL)
@@ -223,6 +257,9 @@ if ENABLE_WALLET
test_test_bitcoin_LDADD += $(LIBBITCOIN_WALLET)
test_test_bitcoin_CPPFLAGS += $(BDB_CPPFLAGS)
endif
+if BUILD_MULTIPROCESS
+test_test_bitcoin_LDADD += $(LIBBITCOIN_IPC_TEST) $(LIBMULTIPROCESS_LIBS)
+endif
test_test_bitcoin_LDADD += $(LIBBITCOIN_NODE) $(LIBBITCOIN_CLI) $(LIBBITCOIN_COMMON) $(LIBBITCOIN_UTIL) $(LIBBITCOIN_CONSENSUS) $(LIBBITCOIN_CRYPTO) $(LIBUNIVALUE) \
$(LIBLEVELDB) $(LIBMEMENV) $(LIBSECP256K1) $(EVENT_LIBS) $(EVENT_PTHREADS_LIBS) $(MINISKETCH_LIBS)
@@ -240,7 +277,7 @@ if ENABLE_FUZZ_BINARY
test_fuzz_fuzz_CPPFLAGS = $(AM_CPPFLAGS) $(BITCOIN_INCLUDES) $(BOOST_CPPFLAGS)
test_fuzz_fuzz_CXXFLAGS = $(AM_CXXFLAGS) $(PIE_FLAGS)
test_fuzz_fuzz_LDADD = $(FUZZ_SUITE_LD_COMMON)
-test_fuzz_fuzz_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS) $(RUNTIME_LDFLAGS)
+test_fuzz_fuzz_LDFLAGS = $(RELDFLAGS) $(AM_LDFLAGS) $(LIBTOOL_APP_LDFLAGS) $(PTHREAD_FLAGS)
test_fuzz_fuzz_SOURCES = \
$(FUZZ_WALLET_SRC) \
test/fuzz/addition_overflow.cpp \
@@ -382,7 +419,9 @@ bitcoin_test_check: $(TEST_BINARY) FORCE
bitcoin_test_clean : FORCE
rm -f $(CLEAN_BITCOIN_TEST) $(test_test_bitcoin_OBJECTS) $(TEST_BINARY)
-check-local: $(BITCOIN_TESTS:.cpp=.cpp.test)
+check-unit: $(BITCOIN_TESTS:.cpp=.cpp.test)
+
+check-local: check-unit
if BUILD_BITCOIN_TX
@echo "Running test/util/test_runner.py..."
$(PYTHON) $(top_builddir)/test/util/test_runner.py
diff --git a/src/addrdb.cpp b/src/addrdb.cpp
index 8cf932bcb6..fd2a363b8a 100644
--- a/src/addrdb.cpp
+++ b/src/addrdb.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <addrdb.h>
#include <addrman.h>
diff --git a/src/addrman.cpp b/src/addrman.cpp
index a8206de6ee..ef8ed92bb5 100644
--- a/src/addrman.cpp
+++ b/src/addrman.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <addrman.h>
#include <addrman_impl.h>
@@ -585,11 +589,10 @@ bool AddrManImpl::AddSingle(const CAddress& addr, const CNetAddr& source, std::c
return false;
// stochastic test: previous nRefCount == N: 2^N times harder to increase it
- int nFactor = 1;
- for (int n = 0; n < pinfo->nRefCount; n++)
- nFactor *= 2;
- if (nFactor > 1 && (insecure_rand.randrange(nFactor) != 0))
- return false;
+ if (pinfo->nRefCount > 0) {
+ const int nFactor{1 << pinfo->nRefCount};
+ if (insecure_rand.randrange(nFactor) != 0) return false;
+ }
} else {
pinfo = Create(addr, source, &nId);
pinfo->nTime = std::max(NodeSeconds{0s}, pinfo->nTime - time_penalty);
diff --git a/src/addrman.h b/src/addrman.h
index ef9c766eff..be2ee8c2cb 100644
--- a/src/addrman.h
+++ b/src/addrman.h
@@ -111,13 +111,16 @@ public:
/**
* Attempt to add one or more addresses to addrman's new table.
+ * If an address already exists in addrman, the existing entry may be updated
+ * (e.g. adding additional service flags). If the existing entry is in the new table,
+ * it may be added to more buckets, improving the probability of selection.
*
* @param[in] vAddr Address records to attempt to add.
* @param[in] source The address of the node that sent us these addr records.
* @param[in] time_penalty A "time penalty" to apply to the address record's nTime. If a peer
* sends us an address record with nTime=n, then we'll add it to our
* addrman with nTime=(n - time_penalty).
- * @return true if at least one address is successfully added. */
+ * @return true if at least one address is successfully added, or added to an additional bucket. Unaffected by updates. */
bool Add(const std::vector<CAddress>& vAddr, const CNetAddr& source, std::chrono::seconds time_penalty = 0s);
/**
diff --git a/src/bench/ellswift.cpp b/src/bench/ellswift.cpp
index f0348421b3..82e8dec982 100644
--- a/src/bench/ellswift.cpp
+++ b/src/bench/ellswift.cpp
@@ -11,9 +11,7 @@ static void EllSwiftCreate(benchmark::Bench& bench)
{
ECC_Start();
- CKey key;
- key.MakeNewKey(true);
-
+ CKey key = GenerateRandomKey();
uint256 entropy = GetRandHash();
bench.batch(1).unit("pubkey").run([&] {
diff --git a/src/bench/readblock.cpp b/src/bench/readblock.cpp
new file mode 100644
index 0000000000..0545c6b017
--- /dev/null
+++ b/src/bench/readblock.cpp
@@ -0,0 +1,53 @@
+// Copyright (c) 2023 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <bench/bench.h>
+#include <bench/data.h>
+
+#include <consensus/validation.h>
+#include <node/blockstorage.h>
+#include <streams.h>
+#include <test/util/setup_common.h>
+#include <util/chaintype.h>
+#include <validation.h>
+
+static FlatFilePos WriteBlockToDisk(ChainstateManager& chainman)
+{
+ DataStream stream{benchmark::data::block413567};
+ CBlock block;
+ stream >> TX_WITH_WITNESS(block);
+
+ return chainman.m_blockman.SaveBlockToDisk(block, 0, nullptr);
+}
+
+static void ReadBlockFromDiskTest(benchmark::Bench& bench)
+{
+ const auto testing_setup{MakeNoLogFileContext<const TestingSetup>(ChainType::MAIN)};
+ ChainstateManager& chainman{*testing_setup->m_node.chainman};
+
+ CBlock block;
+ const auto pos{WriteBlockToDisk(chainman)};
+
+ bench.run([&] {
+ const auto success{chainman.m_blockman.ReadBlockFromDisk(block, pos)};
+ assert(success);
+ });
+}
+
+static void ReadRawBlockFromDiskTest(benchmark::Bench& bench)
+{
+ const auto testing_setup{MakeNoLogFileContext<const TestingSetup>(ChainType::MAIN)};
+ ChainstateManager& chainman{*testing_setup->m_node.chainman};
+
+ std::vector<uint8_t> block_data;
+ const auto pos{WriteBlockToDisk(chainman)};
+
+ bench.run([&] {
+ const auto success{chainman.m_blockman.ReadRawBlockFromDisk(block_data, pos)};
+ assert(success);
+ });
+}
+
+BENCHMARK(ReadBlockFromDiskTest, benchmark::PriorityLevel::HIGH);
+BENCHMARK(ReadRawBlockFromDiskTest, benchmark::PriorityLevel::HIGH);
diff --git a/src/bench/verify_script.cpp b/src/bench/verify_script.cpp
index 3682b33518..e7166a91cf 100644
--- a/src/bench/verify_script.cpp
+++ b/src/bench/verify_script.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <bench/bench.h>
#include <key.h>
#if defined(HAVE_CONSENSUS_LIB)
diff --git a/src/bench/wallet_balance.cpp b/src/bench/wallet_balance.cpp
index bf2195293e..7a10b167a6 100644
--- a/src/bench/wallet_balance.cpp
+++ b/src/bench/wallet_balance.cpp
@@ -39,7 +39,8 @@ static void WalletBalance(benchmark::Bench& bench, const bool set_dirty, const b
generatetoaddress(test_setup->m_node, address_mine.value_or(ADDRESS_WATCHONLY));
generatetoaddress(test_setup->m_node, ADDRESS_WATCHONLY);
}
- SyncWithValidationInterfaceQueue();
+ // Calls SyncWithValidationInterfaceQueue
+ wallet.chain().waitForNotificationsIfTipChanged(uint256::ZERO);
auto bal = GetBalance(wallet); // Cache
diff --git a/src/bench/wallet_create.cpp b/src/bench/wallet_create.cpp
index 993c4c4b3f..32f55f51e1 100644
--- a/src/bench/wallet_create.cpp
+++ b/src/bench/wallet_create.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <bench/bench.h>
#include <node/context.h>
#include <random.h>
diff --git a/src/bench/wallet_ismine.cpp b/src/bench/wallet_ismine.cpp
new file mode 100644
index 0000000000..3f922e18a5
--- /dev/null
+++ b/src/bench/wallet_ismine.cpp
@@ -0,0 +1,77 @@
+// Copyright (c) 2022 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif // HAVE_CONFIG_H
+#include <bench/bench.h>
+#include <interfaces/chain.h>
+#include <key.h>
+#include <key_io.h>
+#include <node/context.h>
+#include <test/util/setup_common.h>
+#include <util/translation.h>
+#include <validationinterface.h>
+#include <wallet/context.h>
+#include <wallet/test/util.h>
+#include <wallet/wallet.h>
+#include <wallet/walletutil.h>
+
+namespace wallet {
+static void WalletIsMine(benchmark::Bench& bench, bool legacy_wallet, int num_combo = 0)
+{
+ const auto test_setup = MakeNoLogFileContext<TestingSetup>();
+
+ WalletContext context;
+ context.args = &test_setup->m_args;
+ context.chain = test_setup->m_node.chain.get();
+
+ // Setup the wallet
+ // Loading the wallet will also create it
+ uint64_t create_flags = 0;
+ if (!legacy_wallet) {
+ create_flags = WALLET_FLAG_DESCRIPTORS;
+ }
+ auto database = CreateMockableWalletDatabase();
+ auto wallet = TestLoadWallet(std::move(database), context, create_flags);
+
+ // For a descriptor wallet, fill with num_combo combo descriptors with random keys
+ // This benchmarks a non-HD wallet migrated to descriptors
+ if (!legacy_wallet && num_combo > 0) {
+ LOCK(wallet->cs_wallet);
+ for (int i = 0; i < num_combo; ++i) {
+ CKey key;
+ key.MakeNewKey(/*fCompressed=*/true);
+ FlatSigningProvider keys;
+ std::string error;
+ std::unique_ptr<Descriptor> desc = Parse("combo(" + EncodeSecret(key) + ")", keys, error, /*require_checksum=*/false);
+ WalletDescriptor w_desc(std::move(desc), /*creation_time=*/0, /*range_start=*/0, /*range_end=*/0, /*next_index=*/0);
+ auto spkm = wallet->AddWalletDescriptor(w_desc, keys, /*label=*/"", /*internal=*/false);
+ assert(spkm);
+ }
+ }
+
+ const CScript script = GetScriptForDestination(DecodeDestination(ADDRESS_BCRT1_UNSPENDABLE));
+
+ bench.run([&] {
+ LOCK(wallet->cs_wallet);
+ isminetype mine = wallet->IsMine(script);
+ assert(mine == ISMINE_NO);
+ });
+
+ TestUnloadWallet(std::move(wallet));
+}
+
+#ifdef USE_BDB
+static void WalletIsMineLegacy(benchmark::Bench& bench) { WalletIsMine(bench, /*legacy_wallet=*/true); }
+BENCHMARK(WalletIsMineLegacy, benchmark::PriorityLevel::LOW);
+#endif
+
+#ifdef USE_SQLITE
+static void WalletIsMineDescriptors(benchmark::Bench& bench) { WalletIsMine(bench, /*legacy_wallet=*/false); }
+static void WalletIsMineMigratedDescriptors(benchmark::Bench& bench) { WalletIsMine(bench, /*legacy_wallet=*/false, /*num_combo=*/2000); }
+BENCHMARK(WalletIsMineDescriptors, benchmark::PriorityLevel::LOW);
+BENCHMARK(WalletIsMineMigratedDescriptors, benchmark::PriorityLevel::LOW);
+#endif
+} // namespace wallet
diff --git a/src/bench/wallet_loading.cpp b/src/bench/wallet_loading.cpp
index b17c7fe05a..6305126c7d 100644
--- a/src/bench/wallet_loading.cpp
+++ b/src/bench/wallet_loading.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <bench/bench.h>
#include <interfaces/chain.h>
#include <node/context.h>
diff --git a/src/bitcoin-chainstate.cpp b/src/bitcoin-chainstate.cpp
index ee8b0a44c5..3eb64aa344 100644
--- a/src/bitcoin-chainstate.cpp
+++ b/src/bitcoin-chainstate.cpp
@@ -23,11 +23,10 @@
#include <node/caches.h>
#include <node/chainstate.h>
#include <random.h>
-#include <scheduler.h>
#include <script/sigcache.h>
#include <util/chaintype.h>
#include <util/fs.h>
-#include <util/thread.h>
+#include <util/task_runner.h>
#include <validation.h>
#include <validationinterface.h>
@@ -68,16 +67,7 @@ int main(int argc, char* argv[])
Assert(InitSignatureCache(validation_cache_sizes.signature_cache_bytes));
Assert(InitScriptExecutionCache(validation_cache_sizes.script_execution_cache_bytes));
-
- // SETUP: Scheduling and Background Signals
- CScheduler scheduler{};
- // Start the lightweight task scheduler thread
- scheduler.m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { scheduler.serviceQueue(); });
-
- // Gather some entropy once per minute.
- scheduler.scheduleEvery(RandAddPeriodic, std::chrono::minutes{1});
-
- GetMainSignals().RegisterBackgroundSignalScheduler(scheduler);
+ ValidationSignals validation_signals{std::make_unique<util::ImmediateTaskRunner>()};
class KernelNotifications : public kernel::Notifications
{
@@ -117,8 +107,8 @@ int main(int argc, char* argv[])
const ChainstateManager::Options chainman_opts{
.chainparams = *chainparams,
.datadir = abs_datadir,
- .adjusted_time_callback = NodeClock::now,
.notifications = *notifications,
+ .signals = &validation_signals,
};
const node::BlockManager::Options blockman_opts{
.chainparams = chainman_opts.chainparams,
@@ -236,9 +226,9 @@ int main(int argc, char* argv[])
bool new_block;
auto sc = std::make_shared<submitblock_StateCatcher>(block.GetHash());
- RegisterSharedValidationInterface(sc);
+ validation_signals.RegisterSharedValidationInterface(sc);
bool accepted = chainman.ProcessNewBlock(blockptr, /*force_processing=*/true, /*min_pow_checked=*/true, /*new_block=*/&new_block);
- UnregisterSharedValidationInterface(sc);
+ validation_signals.UnregisterSharedValidationInterface(sc);
if (!new_block && accepted) {
std::cerr << "duplicate" << std::endl;
break;
@@ -288,10 +278,9 @@ int main(int argc, char* argv[])
epilogue:
// Without this precise shutdown sequence, there will be a lot of nullptr
// dereferencing and UB.
- scheduler.stop();
if (chainman.m_thread_load.joinable()) chainman.m_thread_load.join();
- GetMainSignals().FlushBackgroundCallbacks();
+ validation_signals.FlushBackgroundCallbacks();
{
LOCK(cs_main);
for (Chainstate* chainstate : chainman.GetAll()) {
@@ -301,5 +290,4 @@ epilogue:
}
}
}
- GetMainSignals().UnregisterBackgroundSignalScheduler();
}
diff --git a/src/bitcoin-cli.cpp b/src/bitcoin-cli.cpp
index 45db7a9a66..f0e27cb675 100644
--- a/src/bitcoin-cli.cpp
+++ b/src/bitcoin-cli.cpp
@@ -406,6 +406,7 @@ private:
std::string conn_type;
std::string network;
std::string age;
+ std::string transport_protocol_type;
double min_ping;
double ping;
int64_t addr_processed;
@@ -517,10 +518,11 @@ public:
const std::string addr{peer["addr"].get_str()};
const std::string age{conn_time == 0 ? "" : ToString((time_now - conn_time) / 60)};
const std::string sub_version{peer["subver"].get_str()};
+ const std::string transport{peer["transport_protocol_type"].isNull() ? "v1" : peer["transport_protocol_type"].get_str()};
const bool is_addr_relay_enabled{peer["addr_relay_enabled"].isNull() ? false : peer["addr_relay_enabled"].get_bool()};
const bool is_bip152_hb_from{peer["bip152_hb_from"].get_bool()};
const bool is_bip152_hb_to{peer["bip152_hb_to"].get_bool()};
- m_peers.push_back({addr, sub_version, conn_type, NETWORK_SHORT_NAMES[network_id], age, min_ping, ping, addr_processed, addr_rate_limited, last_blck, last_recv, last_send, last_trxn, peer_id, mapped_as, version, is_addr_relay_enabled, is_bip152_hb_from, is_bip152_hb_to, is_outbound, is_tx_relay});
+ m_peers.push_back({addr, sub_version, conn_type, NETWORK_SHORT_NAMES[network_id], age, transport, min_ping, ping, addr_processed, addr_rate_limited, last_blck, last_recv, last_send, last_trxn, peer_id, mapped_as, version, is_addr_relay_enabled, is_bip152_hb_from, is_bip152_hb_to, is_outbound, is_tx_relay});
m_max_addr_length = std::max(addr.length() + 1, m_max_addr_length);
m_max_addr_processed_length = std::max(ToString(addr_processed).length(), m_max_addr_processed_length);
m_max_addr_rate_limited_length = std::max(ToString(addr_rate_limited).length(), m_max_addr_rate_limited_length);
@@ -536,7 +538,7 @@ public:
// Report detailed peer connections list sorted by direction and minimum ping time.
if (DetailsRequested() && !m_peers.empty()) {
std::sort(m_peers.begin(), m_peers.end());
- result += strprintf("<-> type net mping ping send recv txn blk hb %*s%*s%*s ",
+ result += strprintf("<-> type net v mping ping send recv txn blk hb %*s%*s%*s ",
m_max_addr_processed_length, "addrp",
m_max_addr_rate_limited_length, "addrl",
m_max_age_length, "age");
@@ -545,10 +547,11 @@ public:
for (const Peer& peer : m_peers) {
std::string version{ToString(peer.version) + peer.sub_version};
result += strprintf(
- "%3s %6s %5s%7s%7s%5s%5s%5s%5s %2s %*s%*s%*s%*i %*s %-*s%s\n",
+ "%3s %6s %5s %2s%7s%7s%5s%5s%5s%5s %2s %*s%*s%*s%*i %*s %-*s%s\n",
peer.is_outbound ? "out" : "in",
ConnectionTypeForNetinfo(peer.conn_type),
peer.network,
+ peer.transport_protocol_type.starts_with('v') ? peer.transport_protocol_type[1] : ' ',
PingTimeToString(peer.min_ping),
PingTimeToString(peer.ping),
peer.last_send ? ToString(time_now - peer.last_send) : "",
@@ -570,7 +573,7 @@ public:
IsAddressSelected() ? peer.addr : "",
IsVersionSelected() && version != "0" ? version : "");
}
- result += strprintf(" ms ms sec sec min min %*s\n\n", m_max_age_length, "min");
+ result += strprintf(" ms ms sec sec min min %*s\n\n", m_max_age_length, "min");
}
// Report peer connection totals by type.
@@ -658,6 +661,7 @@ public:
" \"feeler\" - short-lived connection for testing addresses\n"
" \"addr\" - address fetch; short-lived connection for requesting addresses\n"
" net Network the peer connected through (\"ipv4\", \"ipv6\", \"onion\", \"i2p\", \"cjdns\", or \"npr\" (not publicly routable))\n"
+ " v Version of transport protocol used for the connection\n"
" mping Minimum observed ping time, in milliseconds (ms)\n"
" ping Last observed ping time, in milliseconds (ms)\n"
" send Time since last message sent to the peer, in seconds\n"
diff --git a/src/chain.h b/src/chain.h
index f9121fb861..fa165a4aa7 100644
--- a/src/chain.h
+++ b/src/chain.h
@@ -11,15 +11,20 @@
#include <flatfile.h>
#include <kernel/cs_main.h>
#include <primitives/block.h>
+#include <serialize.h>
#include <sync.h>
#include <uint256.h>
#include <util/time.h>
+#include <algorithm>
+#include <cassert>
+#include <cstdint>
+#include <string>
#include <vector>
/**
* Maximum amount of time that a block timestamp is allowed to exceed the
- * current network-adjusted time before the block will be accepted.
+ * current time before the block will be accepted.
*/
static constexpr int64_t MAX_FUTURE_BLOCK_TIME = 2 * 60 * 60;
diff --git a/src/chainparamsseeds.h b/src/chainparamsseeds.h
index dca6028c63..554d0cae5a 100644
--- a/src/chainparamsseeds.h
+++ b/src/chainparamsseeds.h
@@ -7,983 +7,1783 @@
* Each line contains a BIP155 serialized (networkID, addr, port) tuple.
*/
static const uint8_t chainparams_seed_main[] = {
- 0x01,0x04,0x01,0x41,0xc3,0x62,0x20,0x8d,
- 0x01,0x04,0x02,0x3b,0xec,0x38,0x20,0x8d,
- 0x01,0x04,0x02,0x53,0x72,0x14,0x20,0x8d,
- 0x01,0x04,0x02,0xf8,0xc2,0x10,0x20,0x8d,
- 0x01,0x04,0x05,0x02,0x9a,0x06,0x20,0x8d,
- 0x01,0x04,0x05,0x65,0x8c,0x1e,0x20,0x8d,
+ 0x01,0x04,0x01,0xfd,0x9f,0x13,0x20,0x8d,
+ 0x01,0x04,0x02,0x98,0x4a,0xd3,0x20,0x8d,
+ 0x01,0x04,0x05,0x02,0x17,0xe2,0x20,0x8d,
0x01,0x04,0x05,0x80,0x57,0x7e,0x20,0x8d,
- 0x01,0x04,0x05,0x90,0x15,0x31,0x20,0x8d,
- 0x01,0x04,0x05,0xac,0x84,0x68,0x20,0x8d,
+ 0x01,0x04,0x05,0x9d,0x67,0xca,0x20,0x8d,
0x01,0x04,0x05,0xbc,0x3e,0x12,0x20,0x8d,
- 0x01,0x04,0x05,0xc8,0x02,0xb4,0x20,0x8d,
+ 0x01,0x04,0x05,0xfd,0x12,0xda,0x20,0x8d,
+ 0x01,0x04,0x05,0xff,0x6d,0xa0,0x20,0x8d,
0x01,0x04,0x08,0x81,0xb8,0xff,0x20,0x8d,
- 0x01,0x04,0x08,0xd1,0x69,0x8a,0x20,0x8d,
+ 0x01,0x04,0x08,0xd1,0x46,0x4d,0x20,0x8d,
+ 0x01,0x04,0x08,0xd2,0x12,0x38,0x20,0x8d,
0x01,0x04,0x0c,0x22,0x62,0x94,0x20,0x8d,
- 0x01,0x04,0x0e,0xc7,0x66,0x97,0x20,0x8d,
0x01,0x04,0x12,0x1b,0x4f,0x11,0x20,0x8d,
- 0x01,0x04,0x12,0x1b,0x7c,0xe7,0x20,0x8d,
- 0x01,0x04,0x12,0xd8,0xf9,0x97,0x20,0x8d,
- 0x01,0x04,0x17,0x58,0x9b,0x3a,0x20,0x8d,
- 0x01,0x04,0x17,0x5d,0x65,0x9e,0x20,0x8d,
- 0x01,0x04,0x17,0x6d,0x9c,0x4c,0x20,0x8d,
- 0x01,0x04,0x17,0xaf,0x00,0xdc,0x20,0x8d,
+ 0x01,0x04,0x17,0x5d,0xaa,0x76,0x20,0x8d,
+ 0x01,0x04,0x17,0x9a,0x88,0x90,0x20,0x8d,
+ 0x01,0x04,0x17,0xaf,0x00,0xd4,0x20,0x8d,
0x01,0x04,0x17,0xaf,0x00,0xde,0x20,0x8d,
- 0x01,0x04,0x18,0xe8,0x24,0xe1,0x20,0x8d,
+ 0x01,0x04,0x18,0x54,0xa4,0x32,0x20,0x8d,
+ 0x01,0x04,0x18,0x56,0x5a,0x7f,0x20,0x8d,
+ 0x01,0x04,0x18,0x65,0x7e,0xc2,0x20,0x8d,
+ 0x01,0x04,0x18,0xb7,0x4b,0x9a,0x20,0x8d,
0x01,0x04,0x1b,0x7c,0x6c,0x13,0x20,0x8d,
0x01,0x04,0x1b,0x94,0xce,0x8c,0x20,0x8d,
- 0x01,0x04,0x1f,0x07,0x46,0xc3,0x20,0x8d,
0x01,0x04,0x1f,0x19,0x62,0x10,0x20,0x8d,
0x01,0x04,0x1f,0x29,0x17,0xf9,0x20,0x8d,
- 0x01,0x04,0x1f,0x2f,0x66,0x5c,0x20,0x8d,
0x01,0x04,0x1f,0x2f,0xca,0x70,0x20,0x8d,
- 0x01,0x04,0x1f,0xa5,0x4e,0x92,0x20,0x8d,
- 0x01,0x04,0x1f,0xa5,0xe4,0x8a,0x20,0x8d,
- 0x01,0x04,0x22,0x40,0x65,0x04,0x20,0x8d,
- 0x01,0x04,0x22,0x69,0x13,0x61,0x20,0x8d,
- 0x01,0x04,0x22,0x7e,0x6b,0xb3,0x20,0x8d,
- 0x01,0x04,0x22,0x7e,0x73,0x23,0x20,0x8d,
- 0x01,0x04,0x23,0xf5,0xba,0x75,0x20,0x8d,
+ 0x01,0x04,0x1f,0x9c,0x80,0xf8,0x20,0x8d,
+ 0x01,0x04,0x1f,0xa4,0xa0,0xa2,0x20,0x8d,
+ 0x01,0x04,0x1f,0xc9,0xbe,0x86,0x20,0x8d,
+ 0x01,0x04,0x1f,0xd0,0x22,0x3d,0x20,0x8d,
+ 0x01,0x04,0x22,0x4e,0x0e,0x19,0x20,0x8d,
+ 0x01,0x04,0x22,0x50,0x86,0x44,0x20,0x8d,
+ 0x01,0x04,0x23,0x89,0x85,0xe1,0x20,0x8d,
+ 0x01,0x04,0x23,0xc1,0xc0,0x30,0x20,0x8d,
+ 0x01,0x04,0x23,0xc2,0x27,0xfa,0x20,0x8d,
0x01,0x04,0x25,0x0f,0x3c,0x90,0x20,0x8d,
- 0x01,0x04,0x25,0x10,0x69,0x3f,0x20,0x8d,
- 0x01,0x04,0x25,0x78,0x9b,0x22,0x20,0x8d,
+ 0x01,0x04,0x25,0x3c,0xe4,0xfb,0x20,0x8d,
+ 0x01,0x04,0x25,0x3c,0xe5,0x75,0x20,0x8d,
+ 0x01,0x04,0x25,0x6e,0x84,0x5e,0x20,0x8d,
0x01,0x04,0x25,0x78,0xb3,0x1d,0x20,0x8d,
0x01,0x04,0x25,0x8b,0x66,0x49,0x20,0x8d,
- 0x01,0x04,0x25,0xc1,0xe3,0x10,0x20,0x8d,
+ 0x01,0x04,0x25,0x9d,0xc0,0x5e,0x20,0x8d,
0x01,0x04,0x25,0xdc,0x87,0x97,0x20,0x8d,
- 0x01,0x04,0x26,0x35,0x81,0x43,0x20,0x8d,
+ 0x01,0x04,0x26,0x09,0x51,0xa0,0x20,0x8d,
+ 0x01,0x04,0x26,0x15,0xdd,0xfc,0x20,0x8d,
0x01,0x04,0x26,0x36,0x0e,0x59,0x20,0x8d,
- 0x01,0x04,0x26,0x8d,0x86,0x8c,0x20,0x8d,
- 0x01,0x04,0x26,0x91,0x97,0x96,0x20,0x8d,
- 0x01,0x04,0x29,0x48,0x9a,0x42,0x20,0x8d,
- 0x01,0x04,0x2b,0x8f,0xcb,0xc6,0x20,0x8d,
- 0x01,0x04,0x2d,0x0f,0x7c,0x75,0x20,0x8d,
- 0x01,0x04,0x2d,0x2b,0x61,0x67,0x20,0x8d,
- 0x01,0x04,0x2d,0x2c,0xd5,0x74,0x20,0x8d,
- 0x01,0x04,0x2d,0x3a,0xbb,0x65,0x20,0x8d,
- 0x01,0x04,0x2d,0x4f,0xc0,0xec,0x20,0x8d,
- 0x01,0x04,0x2d,0x51,0xf1,0x61,0x20,0x8d,
- 0x01,0x04,0x2d,0x53,0xdc,0x66,0x20,0x8d,
- 0x01,0x04,0x2d,0x53,0xf1,0x2e,0x20,0x8d,
- 0x01,0x04,0x2d,0x57,0x6a,0x39,0x20,0x8d,
- 0x01,0x04,0x2d,0x81,0x26,0x05,0x20,0x8d,
- 0x01,0x04,0x2d,0x82,0x14,0xb1,0x20,0x8d,
- 0x01,0x04,0x2d,0x86,0x8e,0x28,0x20,0x8d,
- 0x01,0x04,0x2d,0x87,0x04,0x8f,0x20,0x8d,
- 0x01,0x04,0x2d,0x87,0x5c,0x7f,0x20,0x8d,
- 0x01,0x04,0x2d,0x91,0xbc,0x70,0x20,0x8d,
- 0x01,0x04,0x2e,0x17,0x57,0xda,0x20,0x8d,
- 0x01,0x04,0x2e,0x20,0x32,0x62,0x20,0x8d,
- 0x01,0x04,0x2e,0x20,0x4e,0x11,0x20,0x8d,
- 0x01,0x04,0x2e,0x3b,0x28,0x5b,0x20,0x8d,
- 0x01,0x04,0x2e,0x8a,0xf6,0x4d,0x20,0x8d,
+ 0x01,0x04,0x26,0x5b,0x6a,0x6f,0x20,0x8d,
+ 0x01,0x04,0x26,0x66,0x55,0x24,0x20,0x8d,
+ 0x01,0x04,0x2a,0x02,0xa2,0xda,0x20,0x8d,
+ 0x01,0x04,0x2b,0x81,0x4b,0x14,0x20,0x8d,
+ 0x01,0x04,0x2b,0x9f,0x3d,0x10,0x20,0x8d,
+ 0x01,0x04,0x2b,0xe1,0x3e,0x6b,0x20,0x8d,
+ 0x01,0x04,0x2b,0xf5,0xc4,0xd6,0x20,0x8d,
+ 0x01,0x04,0x2d,0x0d,0x07,0xdd,0x20,0x8d,
+ 0x01,0x04,0x2d,0x2c,0xd5,0x7b,0x20,0x8d,
+ 0x01,0x04,0x2d,0x30,0x4b,0xe0,0x20,0x8d,
+ 0x01,0x04,0x2d,0x4f,0x4c,0x0c,0x20,0x8d,
+ 0x01,0x04,0x2d,0x5e,0xd1,0x7f,0x20,0x8d,
+ 0x01,0x04,0x2d,0x82,0x17,0x39,0x20,0x8d,
+ 0x01,0x04,0x2d,0x84,0x76,0x19,0x20,0x8d,
+ 0x01,0x04,0x2d,0x90,0xf9,0xcf,0x20,0x8d,
+ 0x01,0x04,0x2d,0x91,0x28,0x2b,0x20,0x8d,
+ 0x01,0x04,0x2d,0x9b,0xa9,0x1e,0x20,0x8d,
+ 0x01,0x04,0x2e,0x11,0x63,0x0d,0x20,0x8d,
+ 0x01,0x04,0x2e,0x11,0x63,0x1a,0x20,0x8d,
+ 0x01,0x04,0x2e,0x15,0xfa,0x19,0x20,0x8d,
+ 0x01,0x04,0x2e,0x1c,0xcc,0xa1,0x20,0x8d,
+ 0x01,0x04,0x2e,0x80,0xc7,0x1a,0x20,0x8d,
+ 0x01,0x04,0x2e,0xa4,0x3b,0x8b,0x20,0x8d,
0x01,0x04,0x2e,0xa6,0x8e,0x02,0x20,0x8d,
- 0x01,0x04,0x2e,0xa6,0xa2,0x3b,0x20,0x8d,
- 0x01,0x04,0x2e,0xaf,0xb2,0x03,0x20,0x8d,
- 0x01,0x04,0x2e,0xbc,0x0f,0x06,0x20,0x8d,
- 0x01,0x04,0x2e,0xbc,0x1e,0x76,0x20,0x8d,
- 0x01,0x04,0x2e,0xdf,0xdf,0xd8,0x20,0x8d,
- 0x01,0x04,0x2e,0xe2,0x12,0x87,0x20,0x8d,
- 0x01,0x04,0x2f,0x58,0x56,0x4f,0x20,0x8d,
- 0x01,0x04,0x2f,0x94,0x07,0x45,0x20,0x8d,
- 0x01,0x04,0x2f,0xc6,0xdf,0x3c,0x20,0x8d,
- 0x01,0x04,0x32,0x02,0x0d,0xa4,0x20,0x8d,
- 0x01,0x04,0x32,0x04,0x87,0x54,0x20,0x8d,
- 0x01,0x04,0x32,0x35,0x27,0xed,0x20,0x8d,
+ 0x01,0x04,0x2e,0xac,0xe9,0xf1,0x20,0x8d,
+ 0x01,0x04,0x2e,0xfc,0x05,0x70,0x20,0x8d,
+ 0x01,0x04,0x2f,0x1c,0x55,0x47,0x20,0x8d,
+ 0x01,0x04,0x2f,0xb0,0xf8,0xfa,0x20,0x8d,
+ 0x01,0x04,0x2f,0xc6,0x3c,0xb4,0x20,0x8d,
+ 0x01,0x04,0x32,0x1b,0x16,0x8d,0x20,0x8d,
+ 0x01,0x04,0x32,0x27,0xaa,0x95,0x20,0x8d,
0x01,0x04,0x32,0x35,0xfa,0xa2,0x20,0x8d,
- 0x01,0x04,0x32,0x44,0x79,0x2c,0x20,0x8d,
- 0x01,0x04,0x32,0x75,0x84,0xb2,0x20,0x8d,
0x01,0x04,0x33,0x9a,0x3e,0x67,0x20,0x8d,
0x01,0x04,0x33,0x9e,0x96,0x9b,0x20,0x8d,
- 0x01,0x04,0x33,0xfa,0x2e,0xd7,0x20,0x8d,
- 0x01,0x04,0x36,0xb0,0x3f,0x10,0x20,0x8d,
- 0x01,0x04,0x3a,0x9e,0x00,0x56,0x20,0x8d,
+ 0x01,0x04,0x33,0xae,0xce,0x4c,0x20,0x8d,
+ 0x01,0x04,0x36,0xd9,0x88,0x7a,0x20,0x8d,
+ 0x01,0x04,0x36,0xfd,0x0f,0x21,0x20,0x8d,
+ 0x01,0x04,0x39,0x80,0x60,0x73,0x20,0x8d,
+ 0x01,0x04,0x39,0x80,0x94,0xa9,0x20,0x8d,
+ 0x01,0x04,0x3a,0x06,0x2e,0xab,0x20,0x8d,
+ 0x01,0x04,0x3a,0x60,0x4d,0x72,0x20,0x8d,
+ 0x01,0x04,0x3a,0x60,0x7b,0x78,0x20,0x8d,
+ 0x01,0x04,0x3a,0xa8,0xfd,0x23,0x20,0x8d,
+ 0x01,0x04,0x3b,0xa7,0xbf,0x3c,0x20,0x8d,
0x01,0x04,0x3c,0xcd,0xcd,0x77,0x20,0x8d,
+ 0x01,0x04,0x3c,0xd4,0xbd,0x97,0x20,0x8d,
0x01,0x04,0x3d,0x4a,0x63,0xc1,0x20,0x8d,
- 0x01,0x04,0x3d,0x5c,0x3b,0x68,0x20,0x8d,
- 0x01,0x04,0x3e,0x7a,0xad,0xab,0x20,0x8d,
+ 0x01,0x04,0x3e,0x18,0x4c,0x7a,0x20,0x8d,
+ 0x01,0x04,0x3e,0x6a,0x46,0xf9,0x20,0x8d,
+ 0x01,0x04,0x3e,0xa8,0x41,0x2a,0x20,0x8d,
0x01,0x04,0x3e,0xab,0x81,0x20,0x20,0x8d,
- 0x01,0x04,0x3e,0xb2,0x1b,0xef,0x20,0x8d,
- 0x01,0x04,0x3e,0xd1,0xd2,0x03,0x20,0x8d,
- 0x01,0x04,0x3e,0xd7,0x7f,0x49,0x20,0x8d,
- 0x01,0x04,0x3e,0xee,0x94,0x68,0x20,0x8d,
- 0x01,0x04,0x3e,0xf5,0x99,0x08,0x20,0x8d,
- 0x01,0x04,0x40,0x92,0x88,0x2d,0x20,0x8d,
- 0x01,0x04,0x41,0x15,0x86,0xb8,0x20,0x8d,
- 0x01,0x04,0x42,0x12,0x0d,0x92,0x20,0x8d,
- 0x01,0x04,0x42,0x17,0xe9,0x2b,0x20,0x8d,
- 0x01,0x04,0x42,0x1b,0x62,0xd8,0x20,0x8d,
- 0x01,0x04,0x42,0x1d,0x81,0xda,0x20,0x8d,
- 0x01,0x04,0x42,0x26,0x5e,0x0d,0x20,0x8d,
+ 0x01,0x04,0x3e,0xf5,0x4b,0x46,0x20,0x8d,
+ 0x01,0x04,0x3e,0xf8,0x08,0xa7,0x20,0x8d,
+ 0x01,0x04,0x40,0x17,0x96,0xd3,0x20,0x8d,
+ 0x01,0x04,0x40,0x62,0x77,0x88,0x20,0x8d,
+ 0x01,0x04,0x41,0x18,0x4b,0x22,0x20,0x8d,
+ 0x01,0x04,0x41,0xaf,0xb9,0x65,0x20,0x8d,
0x01,0x04,0x42,0x2d,0x8d,0x2e,0x20,0x8d,
- 0x01,0x04,0x42,0x3a,0xf3,0xd7,0x20,0x8d,
- 0x01,0x04,0x42,0x72,0x21,0x31,0x20,0x8d,
- 0x01,0x04,0x42,0xc6,0xd3,0xa7,0x20,0x8d,
- 0x01,0x04,0x42,0xd0,0x40,0x80,0x20,0x8d,
- 0x01,0x04,0x42,0xdb,0xc4,0xaa,0x20,0x8d,
+ 0x01,0x04,0x42,0x3a,0xa3,0xb9,0x20,0x8d,
+ 0x01,0x04,0x42,0x55,0x85,0xb6,0x20,0x8d,
+ 0x01,0x04,0x42,0xce,0x16,0x1a,0x20,0x8d,
+ 0x01,0x04,0x43,0x28,0x66,0x21,0x20,0x8d,
+ 0x01,0x04,0x43,0x2b,0xd2,0x3e,0x20,0x8d,
+ 0x01,0x04,0x43,0x52,0x88,0xb1,0x20,0x8d,
+ 0x01,0x04,0x43,0xc1,0x57,0x32,0x20,0x8d,
0x01,0x04,0x43,0xd2,0xe4,0xcb,0x20,0x8d,
- 0x01,0x04,0x44,0xb7,0x4b,0xfb,0x20,0x8d,
- 0x01,0x04,0x44,0xc2,0x7d,0x8c,0x20,0x8d,
- 0x01,0x04,0x44,0xc7,0x78,0x11,0x20,0x8d,
+ 0x01,0x04,0x43,0xd3,0xd3,0x76,0x20,0x8d,
+ 0x01,0x04,0x43,0xe7,0xf6,0x3a,0x20,0x8d,
+ 0x01,0x04,0x44,0x06,0x54,0xde,0x20,0x8d,
+ 0x01,0x04,0x44,0x30,0x88,0xd8,0x20,0x8d,
+ 0x01,0x04,0x44,0x45,0xaa,0x5c,0x20,0x8d,
0x01,0x04,0x45,0x04,0x5e,0xe2,0x20,0x8d,
0x01,0x04,0x45,0x08,0xaf,0xc9,0x20,0x8d,
- 0x01,0x04,0x45,0x3b,0x12,0x16,0x20,0x8d,
+ 0x01,0x04,0x45,0x39,0xa0,0x31,0x20,0x8d,
+ 0x01,0x04,0x45,0x70,0x67,0x7c,0x20,0x8d,
0x01,0x04,0x45,0xc4,0x98,0x21,0x20,0x8d,
- 0x01,0x04,0x45,0xe4,0xdb,0x7c,0x20,0x8d,
- 0x01,0x04,0x46,0x40,0x1b,0x0c,0x20,0x8d,
- 0x01,0x04,0x46,0xa0,0xf0,0x84,0x20,0x8d,
- 0x01,0x04,0x47,0x4f,0x6d,0x80,0x20,0x8d,
- 0x01,0x04,0x47,0xb8,0xc1,0x4b,0x20,0x8d,
- 0x01,0x04,0x48,0x0f,0x3b,0xad,0x20,0x8d,
- 0x01,0x04,0x48,0x30,0xfd,0xa8,0x20,0x8d,
- 0x01,0x04,0x48,0xcf,0xab,0xd2,0x20,0x8d,
- 0x01,0x04,0x49,0x75,0x84,0x8a,0x20,0x8d,
- 0x01,0x04,0x49,0xd4,0xe2,0x3b,0x20,0x8d,
- 0x01,0x04,0x4a,0x4c,0x97,0x6e,0x20,0x8d,
- 0x01,0x04,0x4a,0x5b,0x73,0xe5,0x20,0x8d,
+ 0x01,0x04,0x47,0x13,0x94,0xb4,0x20,0x8d,
+ 0x01,0x04,0x49,0xe3,0x99,0xd5,0x20,0x8d,
+ 0x01,0x04,0x4a,0x32,0x51,0x5d,0x20,0x8d,
+ 0x01,0x04,0x4a,0x65,0xcd,0xd6,0x20,0x8d,
0x01,0x04,0x4a,0x76,0x89,0x77,0x20,0x8d,
0x01,0x04,0x4a,0xd5,0xaf,0x6c,0x20,0x8d,
0x01,0x04,0x4a,0xd5,0xfb,0xef,0x20,0x8d,
0x01,0x04,0x4a,0xdc,0xff,0xbe,0x20,0x8d,
- 0x01,0x04,0x4a,0xdd,0xbd,0x6d,0x20,0x8d,
- 0x01,0x04,0x4b,0x53,0xcb,0xe1,0x20,0x8d,
- 0x01,0x04,0x4b,0xac,0x34,0xba,0x20,0x8d,
- 0x01,0x04,0x4c,0x18,0x8f,0x16,0x20,0x8d,
- 0x01,0x04,0x4c,0x45,0xca,0xf7,0x20,0x8d,
- 0x01,0x04,0x4c,0x49,0xc6,0xf2,0x20,0x8d,
- 0x01,0x04,0x4c,0x77,0xf8,0xf0,0x20,0x8d,
0x01,0x04,0x4d,0x14,0x30,0x90,0x20,0x8d,
- 0x01,0x04,0x4d,0x16,0x98,0xef,0x20,0x8d,
- 0x01,0x04,0x4d,0x25,0xe0,0xde,0x20,0x8d,
- 0x01,0x04,0x4d,0x30,0xc4,0xea,0x20,0x8d,
- 0x01,0x04,0x4d,0x46,0x10,0xf5,0x20,0x8d,
+ 0x01,0x04,0x4d,0x15,0x95,0xa0,0x20,0x8d,
+ 0x01,0x04,0x4d,0x25,0xf0,0xd1,0x20,0x8d,
+ 0x01,0x04,0x4d,0x2b,0x0e,0x44,0x20,0x8d,
+ 0x01,0x04,0x4d,0x6f,0x39,0x6d,0x20,0x8d,
0x01,0x04,0x4d,0xa2,0xbe,0x5a,0x20,0x8d,
- 0x01,0x04,0x4e,0x14,0xe3,0xf9,0x20,0x8d,
- 0x01,0x04,0x4e,0x15,0xa7,0x08,0x20,0x8d,
+ 0x01,0x04,0x4d,0xad,0x84,0x8c,0x20,0x8d,
+ 0x01,0x04,0x4d,0xca,0x0a,0xdc,0x20,0x8d,
+ 0x01,0x04,0x4e,0x1b,0x8b,0x0d,0x20,0x8d,
+ 0x01,0x04,0x4e,0x1f,0x47,0xbe,0x20,0x8d,
0x01,0x04,0x4e,0x23,0x93,0xcb,0x20,0x8d,
- 0x01,0x04,0x4e,0x6c,0x6c,0x19,0x20,0x8d,
- 0x01,0x04,0x4e,0x9a,0xed,0x3c,0x20,0x8d,
- 0x01,0x04,0x4f,0x0b,0x1f,0x4c,0x20,0x8d,
- 0x01,0x04,0x4f,0x57,0x58,0xeb,0x20,0x8d,
- 0x01,0x04,0x4f,0x65,0x01,0x19,0x20,0x8d,
- 0x01,0x04,0x4f,0x7c,0x07,0xf1,0x20,0x8d,
+ 0x01,0x04,0x4e,0x2a,0x90,0x18,0x20,0x8d,
+ 0x01,0x04,0x4e,0x2b,0x99,0xb9,0x20,0x8d,
+ 0x01,0x04,0x4e,0x38,0x59,0x92,0x20,0x8d,
+ 0x01,0x04,0x4e,0x46,0xd0,0x35,0x20,0x8d,
+ 0x01,0x04,0x4f,0x6d,0x78,0x26,0x20,0x8d,
+ 0x01,0x04,0x4f,0x74,0x38,0x59,0x20,0x8d,
0x01,0x04,0x4f,0x7c,0x07,0xfd,0x20,0x8d,
- 0x01,0x04,0x4f,0x96,0x44,0x2a,0x20,0x8d,
- 0x01,0x04,0x4f,0xf9,0x0a,0x35,0x20,0x8d,
- 0x01,0x04,0x50,0x52,0x15,0x4d,0x20,0x8d,
- 0x01,0x04,0x50,0x52,0x4c,0x3b,0x20,0x8d,
- 0x01,0x04,0x50,0x58,0xac,0xe3,0x20,0x8d,
- 0x01,0x04,0x50,0x5d,0xd5,0xf6,0x20,0x8d,
- 0x01,0x04,0x50,0x6f,0x8e,0xd5,0x20,0x8d,
- 0x01,0x04,0x50,0xd0,0xe3,0x86,0x20,0x8d,
- 0x01,0x04,0x50,0xd0,0xe4,0x09,0x20,0x8d,
- 0x01,0x04,0x50,0xd1,0x40,0x56,0x20,0x8d,
+ 0x01,0x04,0x4f,0x88,0xfa,0xa2,0x20,0x8d,
+ 0x01,0x04,0x50,0x53,0xba,0x19,0x20,0x8d,
+ 0x01,0x04,0x50,0x62,0x4b,0xf8,0x20,0x8d,
0x01,0x04,0x50,0xe5,0x1c,0x3c,0x20,0x8d,
- 0x01,0x04,0x51,0x07,0x10,0xb6,0x20,0x8d,
+ 0x01,0x04,0x50,0xf4,0x1a,0xc0,0x20,0x8d,
+ 0x01,0x04,0x51,0x04,0x6e,0xa8,0x20,0x8d,
+ 0x01,0x04,0x51,0x07,0x11,0xca,0x20,0x8d,
0x01,0x04,0x51,0x13,0x0a,0x02,0x20,0x8d,
- 0x01,0x04,0x51,0xa2,0xc4,0x2b,0x20,0x8d,
+ 0x01,0x04,0x51,0x53,0xd6,0x86,0x20,0x8d,
+ 0x01,0x04,0x51,0xaa,0x8e,0x64,0x20,0x8d,
0x01,0x04,0x51,0xab,0x16,0x8f,0x20,0x8d,
- 0x01,0x04,0x51,0xac,0xdd,0x04,0x20,0x8d,
- 0x01,0x04,0x51,0xe0,0x2c,0xa4,0x20,0x8d,
- 0x01,0x04,0x51,0xf5,0x60,0x24,0x20,0x8d,
- 0x01,0x04,0x52,0x01,0x44,0x36,0x20,0x8d,
+ 0x01,0x04,0x51,0xf2,0xef,0x8b,0x20,0x8d,
0x01,0x04,0x52,0x42,0x0a,0x0b,0x20,0x8d,
- 0x01,0x04,0x52,0x42,0xd3,0x1f,0x20,0x8d,
- 0x01,0x04,0x52,0x47,0x04,0x9a,0x20,0x8d,
+ 0x01,0x04,0x52,0x42,0xcc,0xb1,0x20,0x8d,
0x01,0x04,0x52,0x60,0x60,0x28,0x20,0x8d,
- 0x01,0x04,0x52,0x74,0x32,0x65,0x20,0x8d,
- 0x01,0x04,0x52,0x88,0x62,0xf9,0x20,0x8d,
- 0x01,0x04,0x52,0xc3,0xed,0xfd,0x20,0x8d,
- 0x01,0x04,0x53,0x89,0x29,0x0a,0x20,0x8d,
- 0x01,0x04,0x53,0xab,0xaf,0x05,0x20,0x8d,
+ 0x01,0x04,0x52,0x95,0xe1,0xf9,0x20,0x8d,
+ 0x01,0x04,0x52,0x9b,0x94,0xd3,0x20,0x8d,
+ 0x01,0x04,0x52,0xb5,0xda,0x85,0x20,0x8d,
+ 0x01,0x04,0x53,0x63,0xf7,0x19,0x20,0x8d,
+ 0x01,0x04,0x53,0x88,0xe8,0x15,0x20,0x8d,
+ 0x01,0x04,0x53,0xc0,0xe2,0x42,0x20,0x8d,
0x01,0x04,0x53,0xd0,0xc1,0xf2,0x20,0x8d,
- 0x01,0x04,0x53,0xe9,0x4c,0xa5,0x20,0x8d,
- 0x01,0x04,0x53,0xf0,0x59,0xc4,0x20,0x8d,
- 0x01,0x04,0x54,0x26,0x03,0xf9,0x20,0x8d,
- 0x01,0x04,0x54,0x36,0x17,0x30,0x20,0x8d,
- 0x01,0x04,0x54,0x7e,0xd8,0x4d,0x20,0x8d,
+ 0x01,0x04,0x53,0xf0,0x76,0xc4,0x20,0x8d,
+ 0x01,0x04,0x54,0x07,0xdb,0x82,0x20,0x8d,
+ 0x01,0x04,0x54,0x34,0x40,0x52,0x20,0x8d,
+ 0x01,0x04,0x54,0x40,0x63,0x4e,0x20,0x8d,
+ 0x01,0x04,0x54,0x70,0x3c,0x10,0x20,0x8d,
+ 0x01,0x04,0x54,0x71,0x81,0xc3,0x20,0x8d,
0x01,0x04,0x54,0xd3,0xbb,0xd3,0x20,0x8d,
- 0x01,0x04,0x54,0xf6,0xc8,0x7a,0x20,0x8d,
- 0x01,0x04,0x54,0xff,0xf4,0x3d,0x20,0x8d,
- 0x01,0x04,0x55,0xa5,0x2a,0x73,0x20,0x8d,
- 0x01,0x04,0x55,0xc2,0xee,0x86,0x20,0x8d,
- 0x01,0x04,0x55,0xd0,0x45,0x15,0x20,0x8d,
- 0x01,0x04,0x55,0xd0,0x47,0x24,0x20,0x8d,
- 0x01,0x04,0x55,0xd1,0xf0,0x5b,0x20,0x8d,
+ 0x01,0x04,0x54,0xd9,0x86,0xd5,0x20,0x8d,
+ 0x01,0x04,0x54,0xf7,0x80,0x0f,0x20,0x8d,
+ 0x01,0x04,0x54,0xf7,0x84,0x1b,0x20,0x8d,
+ 0x01,0x04,0x54,0xf7,0xad,0x75,0x20,0x8d,
+ 0x01,0x04,0x54,0xf7,0xb3,0x33,0x20,0x8d,
+ 0x01,0x04,0x54,0xff,0xf5,0xc2,0x20,0x8d,
+ 0x01,0x04,0x55,0x91,0x4f,0x1a,0x20,0x8d,
+ 0x01,0x04,0x55,0xad,0xa5,0x42,0x20,0x8d,
+ 0x01,0x04,0x55,0xc3,0xc4,0x56,0x20,0x8d,
0x01,0x04,0x55,0xd6,0x76,0x47,0x20,0x8d,
- 0x01,0x04,0x55,0xd6,0xa1,0xfc,0x20,0x8d,
- 0x01,0x04,0x55,0xec,0xbe,0xfc,0x20,0x8d,
- 0x01,0x04,0x55,0xf3,0x73,0x88,0x20,0x8d,
0x01,0x04,0x56,0x16,0x14,0x0d,0x20,0x8d,
- 0x01,0x04,0x56,0x31,0x22,0x5c,0x20,0x8d,
- 0x01,0x04,0x56,0x5f,0x08,0xf9,0x20,0x8d,
- 0x01,0x04,0x56,0x68,0xe4,0x0a,0x20,0x8d,
- 0x01,0x04,0x56,0x68,0xe4,0x17,0x20,0x8d,
+ 0x01,0x04,0x56,0x2d,0xee,0x73,0x20,0x8d,
+ 0x01,0x04,0x56,0xb6,0xdf,0xbd,0x20,0x8d,
+ 0x01,0x04,0x56,0xd7,0xa8,0x73,0x20,0x8d,
0x01,0x04,0x57,0x4f,0x5e,0xdd,0x20,0x8d,
- 0x01,0x04,0x58,0x0a,0x59,0x17,0x20,0x8d,
+ 0x01,0x04,0x57,0x5a,0x5e,0x78,0x20,0x8d,
+ 0x01,0x04,0x57,0x5c,0xab,0x35,0x20,0x8d,
+ 0x01,0x04,0x57,0xec,0xc3,0xc6,0x20,0x8d,
+ 0x01,0x04,0x57,0xec,0xc7,0xc5,0x20,0x8d,
+ 0x01,0x04,0x58,0x06,0x1f,0x42,0x20,0x8d,
+ 0x01,0x04,0x58,0x09,0x49,0xfc,0x20,0x8d,
0x01,0x04,0x58,0x54,0xdf,0x1e,0x20,0x8d,
- 0x01,0x04,0x58,0x56,0x7d,0x32,0x20,0x8d,
- 0x01,0x04,0x58,0x5a,0x4d,0x64,0x20,0x8d,
- 0x01,0x04,0x58,0x61,0x28,0x32,0x20,0x8d,
- 0x01,0x04,0x58,0x89,0x6d,0x3e,0x20,0x8d,
- 0x01,0x04,0x58,0x93,0xf4,0xfa,0x20,0x8d,
- 0x01,0x04,0x58,0xd0,0x73,0x46,0x20,0x8d,
- 0x01,0x04,0x58,0xd4,0x35,0xf6,0x20,0x8d,
- 0x01,0x04,0x59,0x23,0x8e,0xa8,0x20,0x8d,
- 0x01,0x04,0x59,0x4e,0x6f,0xc5,0x20,0x8d,
- 0x01,0x04,0x59,0x75,0x3b,0x81,0x20,0x8d,
- 0x01,0x04,0x59,0x93,0x6c,0xc8,0x20,0x8d,
- 0x01,0x04,0x59,0xa3,0x84,0xb4,0x20,0x8d,
+ 0x01,0x04,0x58,0x92,0x72,0xad,0x20,0x8d,
+ 0x01,0x04,0x59,0x23,0x8e,0xb1,0x20,0x8d,
+ 0x01,0x04,0x59,0x2c,0x29,0x8e,0x20,0x8d,
+ 0x01,0x04,0x59,0x74,0x19,0xea,0x20,0x8d,
+ 0x01,0x04,0x59,0x75,0x3a,0x71,0x20,0x8d,
+ 0x01,0x04,0x59,0x75,0xac,0x79,0x20,0x8d,
0x01,0x04,0x59,0xa5,0xe8,0xf2,0x20,0x8d,
- 0x01,0x04,0x59,0xd8,0x15,0x60,0x20,0x8d,
- 0x01,0x04,0x5a,0x32,0xac,0xb6,0x20,0x8d,
- 0x01,0x04,0x5a,0x92,0x82,0xd6,0x20,0x8d,
- 0x01,0x04,0x5a,0x92,0xd0,0xa2,0x20,0x8d,
+ 0x01,0x04,0x59,0xbe,0x8e,0x38,0x20,0x8d,
+ 0x01,0x04,0x59,0xd8,0x5b,0x78,0x20,0x8d,
+ 0x01,0x04,0x59,0xf7,0xe0,0x1c,0x20,0x8d,
+ 0x01,0x04,0x5a,0x92,0xcf,0x43,0x20,0x8d,
0x01,0x04,0x5a,0x9c,0x1a,0x94,0x20,0x8d,
- 0x01,0x04,0x5a,0xa3,0xac,0x8b,0x20,0x8d,
- 0x01,0x04,0x5a,0xb1,0xa3,0x4d,0x20,0x8d,
- 0x01,0x04,0x5b,0x43,0x91,0x6e,0x20,0x8d,
- 0x01,0x04,0x5b,0x5d,0xc2,0x9a,0x20,0x8d,
+ 0x01,0x04,0x5a,0xa3,0xac,0x4e,0x20,0x8d,
+ 0x01,0x04,0x5a,0xc0,0x76,0xca,0x20,0x8d,
+ 0x01,0x04,0x5a,0xd0,0x9f,0x0b,0x20,0x8d,
+ 0x01,0x04,0x5a,0xf7,0x46,0x1f,0x20,0x8d,
+ 0x01,0x04,0x5b,0x56,0x19,0xcf,0x20,0x8d,
0x01,0x04,0x5b,0x7b,0xb6,0xa4,0x20,0x8d,
0x01,0x04,0x5b,0x7b,0xb7,0xdb,0x20,0x8d,
+ 0x01,0x04,0x5b,0x86,0x91,0xca,0x20,0x8d,
0x01,0x04,0x5b,0x87,0x00,0xbb,0x20,0x8d,
- 0x01,0x04,0x5b,0x93,0xe8,0x62,0x20,0x8d,
- 0x01,0x04,0x5b,0xb8,0xa8,0xf9,0x20,0x8d,
- 0x01,0x04,0x5b,0xc1,0xed,0x74,0x20,0x8d,
- 0x01,0x04,0x5b,0xc7,0x29,0x2d,0x20,0x8d,
+ 0x01,0x04,0x5b,0x98,0x7a,0x24,0x20,0x8d,
+ 0x01,0x04,0x5b,0xb8,0xae,0xbf,0x20,0x8d,
0x01,0x04,0x5b,0xcc,0x95,0x05,0x20,0x8d,
+ 0x01,0x04,0x5b,0xce,0x11,0xc3,0x20,0x8d,
+ 0x01,0x04,0x5b,0xd1,0x33,0x83,0x20,0x8d,
0x01,0x04,0x5b,0xd7,0x5b,0xfe,0x20,0x8d,
- 0x01,0x04,0x5b,0xdb,0x19,0xe8,0x20,0x8d,
+ 0x01,0x04,0x5b,0xe7,0xb6,0x35,0x20,0x8d,
+ 0x01,0x04,0x5b,0xec,0xfb,0x89,0x20,0x8d,
+ 0x01,0x04,0x5b,0xec,0xfb,0x8b,0x20,0x8d,
0x01,0x04,0x5b,0xed,0x58,0xda,0x20,0x8d,
0x01,0x04,0x5c,0x1b,0x96,0x2e,0x20,0x8d,
0x01,0x04,0x5c,0x1b,0x96,0x2f,0x20,0x8d,
- 0x01,0x04,0x5c,0xdd,0x14,0xe8,0x20,0x8d,
- 0x01,0x04,0x5c,0xdd,0x7e,0x41,0x20,0x8d,
- 0x01,0x04,0x5d,0x21,0xc0,0xcc,0x20,0x8d,
- 0x01,0x04,0x5d,0x29,0xed,0x4e,0x20,0x8d,
- 0x01,0x04,0x5d,0x5f,0x58,0x0d,0x20,0x8d,
- 0x01,0x04,0x5d,0x5f,0xe3,0x7d,0x20,0x8d,
+ 0x01,0x04,0x5c,0x2a,0x6e,0xdb,0x20,0x8d,
+ 0x01,0x04,0x5c,0x2b,0xbb,0x22,0x20,0x8d,
+ 0x01,0x04,0x5c,0xce,0x69,0x1f,0x20,0x8d,
+ 0x01,0x04,0x5c,0xe9,0x02,0x3b,0x20,0x8d,
+ 0x01,0x04,0x5c,0xf0,0xb5,0x2d,0x20,0x8d,
+ 0x01,0x04,0x5d,0x33,0x0d,0x78,0x20,0x8d,
+ 0x01,0x04,0x5d,0x39,0x51,0xa2,0x20,0x8d,
+ 0x01,0x04,0x5d,0x47,0x13,0x82,0x20,0x8d,
+ 0x01,0x04,0x5d,0x51,0xfe,0x9f,0x20,0x8d,
+ 0x01,0x04,0x5d,0x5a,0x52,0xe3,0x20,0x8d,
+ 0x01,0x04,0x5d,0x64,0x23,0xbd,0x20,0x8d,
0x01,0x04,0x5d,0x67,0x0d,0x01,0x20,0x8d,
- 0x01,0x04,0x5d,0x73,0x56,0xef,0x20,0x8d,
0x01,0x04,0x5d,0x7b,0xb4,0xa4,0x20,0x8d,
- 0x01,0x04,0x5d,0xba,0xc9,0xad,0x20,0x8d,
- 0x01,0x04,0x5d,0xbe,0x75,0x1a,0x20,0x8d,
+ 0x01,0x04,0x5d,0xb1,0xbc,0x4a,0x20,0x8d,
+ 0x01,0x04,0x5d,0xbc,0x66,0x35,0x20,0x8d,
0x01,0x04,0x5e,0x13,0x07,0x37,0x20,0x8d,
- 0x01,0x04,0x5e,0x17,0x15,0x50,0x20,0x8d,
- 0x01,0x04,0x5e,0x17,0xcd,0x6e,0x20,0x8d,
- 0x01,0x04,0x5e,0x83,0x00,0x49,0x20,0x8d,
- 0x01,0x04,0x5e,0x8e,0xed,0x04,0x20,0x8d,
- 0x01,0x04,0x5e,0x9a,0x9f,0x63,0x20,0x8d,
- 0x01,0x04,0x5e,0xca,0x32,0xc8,0x20,0x8d,
+ 0x01,0x04,0x5e,0x3f,0x4b,0x4a,0x20,0x8d,
+ 0x01,0x04,0x5e,0x48,0x8d,0x3d,0x20,0x8d,
+ 0x01,0x04,0x5e,0x48,0x8f,0x2f,0x20,0x8d,
+ 0x01,0x04,0x5e,0x69,0x35,0x7c,0x20,0x8d,
+ 0x01,0x04,0x5e,0xb5,0x2e,0x6a,0x20,0x8d,
0x01,0x04,0x5e,0xe7,0xfd,0x12,0x20,0x8d,
0x01,0x04,0x5f,0x2a,0x8c,0x8e,0x20,0x8d,
- 0x01,0x04,0x5f,0x43,0x12,0x64,0x20,0x8d,
- 0x01,0x04,0x5f,0x46,0xee,0xb0,0x20,0x8d,
- 0x01,0x04,0x5f,0x53,0x49,0x1f,0x20,0x8d,
- 0x01,0x04,0x5f,0x5a,0x80,0x03,0x20,0x8d,
+ 0x01,0x04,0x5f,0x52,0x82,0xdf,0x20,0x8d,
+ 0x01,0x04,0x5f,0x58,0x3d,0xb0,0x20,0x8d,
+ 0x01,0x04,0x5f,0x69,0xac,0xab,0x20,0x8d,
0x01,0x04,0x5f,0x6e,0xea,0x5d,0x20,0x8d,
- 0x01,0x04,0x5f,0xa1,0x0c,0x2d,0x20,0x8d,
- 0x01,0x04,0x5f,0xac,0x3e,0xa7,0x20,0x8d,
- 0x01,0x04,0x5f,0xb3,0x80,0x57,0x20,0x8d,
+ 0x01,0x04,0x5f,0xa4,0xb6,0x2c,0x20,0x8d,
0x01,0x04,0x5f,0xbf,0x82,0x64,0x20,0x8d,
- 0x01,0x04,0x5f,0xd6,0x35,0x9a,0x20,0x8d,
0x01,0x04,0x60,0x03,0x35,0xfe,0x20,0x8d,
- 0x01,0x04,0x61,0x4b,0x91,0x0c,0x20,0x8d,
- 0x01,0x04,0x61,0x51,0xc6,0xb4,0x20,0x8d,
- 0x01,0x04,0x61,0x57,0xd8,0x6e,0x20,0x8d,
- 0x01,0x04,0x63,0xe5,0xd2,0x6f,0x20,0x8d,
+ 0x01,0x04,0x61,0x4b,0x90,0x09,0x20,0x8d,
+ 0x01,0x04,0x62,0x11,0x5f,0x5d,0x20,0x8d,
+ 0x01,0x04,0x62,0x80,0xe6,0xba,0x20,0x8d,
+ 0x01,0x04,0x62,0xa3,0xf2,0x95,0x20,0x8d,
+ 0x01,0x04,0x62,0xe5,0x7e,0x17,0x20,0x8d,
+ 0x01,0x04,0x63,0xe9,0x14,0xd7,0x20,0x8d,
0x01,0x04,0x63,0xf6,0x57,0x02,0x20,0x8d,
- 0x01,0x04,0x65,0x2b,0x7c,0xc3,0x20,0x8d,
- 0x01,0x04,0x66,0x84,0xc0,0x8d,0x20,0x8d,
- 0x01,0x04,0x67,0x15,0x03,0x59,0x20,0x8d,
- 0x01,0x04,0x67,0x23,0x79,0x48,0x20,0x8d,
- 0x01,0x04,0x67,0x63,0xa8,0x64,0x20,0x8d,
- 0x01,0x04,0x67,0x63,0xa8,0x8c,0x20,0x8d,
+ 0x01,0x04,0x65,0x33,0x8a,0xc2,0x20,0x8d,
+ 0x01,0x04,0x66,0x82,0x71,0x5e,0x20,0x8d,
0x01,0x04,0x67,0x63,0xaa,0xd2,0x20,0x8d,
0x01,0x04,0x67,0x63,0xaa,0xdc,0x20,0x8d,
- 0x01,0x04,0x67,0x69,0xca,0x32,0x20,0x8d,
- 0x01,0x04,0x68,0xee,0xdc,0xc7,0x20,0x8d,
- 0x01,0x04,0x68,0xf3,0x21,0xa5,0x20,0x8d,
+ 0x01,0x04,0x67,0x9c,0xa5,0xab,0x20,0x8d,
+ 0x01,0x04,0x67,0xdb,0xa9,0x31,0x20,0x8d,
+ 0x01,0x04,0x68,0xab,0xca,0xf4,0x20,0x8d,
+ 0x01,0x04,0x68,0xe1,0xdc,0x21,0x20,0x8d,
0x01,0x04,0x68,0xf4,0x49,0x06,0x20,0x8d,
- 0x01,0x04,0x6c,0x1a,0x7d,0xd6,0x20,0x8d,
+ 0x01,0x04,0x68,0xf4,0x4f,0x83,0x20,0x8d,
+ 0x01,0x04,0x6c,0x31,0x41,0x84,0x20,0x8d,
0x01,0x04,0x6d,0x56,0x3c,0x21,0x20,0x8d,
+ 0x01,0x04,0x6d,0x5b,0x8d,0x91,0x20,0x8d,
0x01,0x04,0x6d,0x63,0x3f,0x9f,0x20,0x8d,
0x01,0x04,0x6d,0x78,0xc2,0x88,0x20,0x8d,
- 0x01,0x04,0x6d,0x7b,0xe9,0x8a,0x20,0x8d,
- 0x01,0x04,0x6d,0x7b,0xf0,0x35,0x20,0x8d,
- 0x01,0x04,0x6d,0x99,0x5e,0x23,0x20,0x8d,
- 0x01,0x04,0x6d,0xad,0x7e,0x9d,0x20,0x8d,
- 0x01,0x04,0x6d,0xc1,0x4c,0xc8,0x20,0x8d,
- 0x01,0x04,0x6d,0xdd,0xe5,0xc5,0x20,0x8d,
- 0x01,0x04,0x6d,0xec,0x5a,0x75,0x20,0x8d,
- 0x01,0x04,0x6d,0xf8,0xce,0x0d,0x20,0x8d,
- 0x01,0x04,0x6f,0x5a,0x8c,0x17,0x20,0x8d,
+ 0x01,0x04,0x6d,0xc4,0x7c,0xb6,0x20,0x8d,
+ 0x01,0x04,0x6d,0xc9,0xa8,0x20,0x20,0x8d,
+ 0x01,0x04,0x6d,0xe0,0x54,0x95,0x20,0x8d,
0x01,0x04,0x6f,0x5a,0x8c,0x2e,0x20,0x8d,
- 0x01,0x04,0x6f,0x5a,0x91,0x25,0x20,0x8d,
- 0x01,0x04,0x72,0xad,0x9f,0xd1,0x20,0x8d,
+ 0x01,0x04,0x70,0x8b,0x0a,0x19,0x20,0x8d,
+ 0x01,0x04,0x72,0x22,0x82,0xce,0x20,0x8d,
0x01,0x04,0x74,0x3a,0xab,0x43,0x20,0x8d,
+ 0x01,0x04,0x74,0x56,0xc3,0xc0,0x20,0x8d,
0x01,0x04,0x77,0x1f,0xb3,0xca,0x20,0x8d,
0x01,0x04,0x77,0x2a,0x37,0xcb,0x20,0x8d,
- 0x01,0x04,0x7a,0xde,0xa0,0xbe,0x20,0x8d,
+ 0x01,0x04,0x78,0xe2,0x27,0x64,0x20,0x8d,
+ 0x01,0x04,0x78,0xe2,0x27,0x67,0x20,0x8d,
+ 0x01,0x04,0x79,0x06,0x45,0x49,0x20,0x8d,
+ 0x01,0x04,0x79,0x63,0xf0,0x57,0x20,0x8d,
+ 0x01,0x04,0x7a,0x94,0x93,0x88,0x20,0x8d,
+ 0x01,0x04,0x7a,0xc7,0x28,0x15,0x20,0x8d,
0x01,0x04,0x7b,0x3c,0xd5,0xc0,0x20,0x8d,
+ 0x01,0x04,0x7b,0xca,0xc1,0x79,0x20,0x8d,
+ 0x01,0x04,0x7c,0xaa,0xb6,0xc2,0x20,0x8d,
0x01,0x04,0x7c,0xc5,0x36,0x71,0x20,0x8d,
- 0x01,0x04,0x7d,0xa8,0x8c,0x6c,0x20,0x8d,
+ 0x01,0x04,0x7d,0xa8,0x6e,0x1c,0x20,0x8d,
+ 0x01,0x04,0x7d,0xe3,0xb2,0x44,0x20,0x8d,
0x01,0x04,0x80,0x00,0xbe,0x1a,0x20,0x8d,
- 0x01,0x04,0x80,0x41,0xc2,0x88,0x20,0x8d,
- 0x01,0x04,0x81,0x0d,0xbd,0xd4,0x20,0x8d,
0x01,0x04,0x81,0x0d,0xbd,0xd7,0x20,0x8d,
- 0x01,0x04,0x81,0xe2,0xd8,0x94,0x20,0x8d,
- 0x01,0x04,0x83,0xbc,0x28,0xbf,0x20,0x8d,
- 0x01,0x04,0x86,0x41,0x09,0x3f,0x20,0x8d,
- 0x01,0x04,0x86,0x7a,0xc8,0xa0,0x20,0x8d,
- 0x01,0x04,0x86,0xc3,0xb9,0x34,0x20,0x8d,
+ 0x01,0x04,0x82,0x2c,0xb0,0x6f,0x20,0x8d,
+ 0x01,0x04,0x82,0xcc,0xa1,0x03,0x20,0x8d,
+ 0x01,0x04,0x83,0x99,0xe8,0x8b,0x20,0x8d,
+ 0x01,0x04,0x83,0xbc,0x28,0x2f,0x20,0x8d,
+ 0x01,0x04,0x86,0x41,0xc1,0x95,0x20,0x8d,
+ 0x01,0x04,0x87,0x13,0x29,0xd0,0x20,0x8d,
0x01,0x04,0x87,0x13,0xfd,0x65,0x20,0x8d,
- 0x01,0x04,0x88,0x1d,0x6d,0x3a,0x20,0x8d,
- 0x01,0x04,0x88,0x20,0xee,0x06,0x20,0x8d,
- 0x01,0x04,0x88,0x31,0xc9,0x18,0x20,0x8d,
+ 0x01,0x04,0x87,0x17,0xcc,0x62,0x20,0x8d,
+ 0x01,0x04,0x87,0xb5,0xd7,0xed,0x20,0x8d,
+ 0x01,0x04,0x88,0x37,0x2e,0x0f,0x20,0x8d,
+ 0x01,0x04,0x88,0x3e,0x3a,0xe0,0x20,0x8d,
+ 0x01,0x04,0x88,0xaf,0x08,0xaf,0x20,0x8d,
+ 0x01,0x04,0x88,0xf4,0x13,0x7e,0x20,0x8d,
0x01,0x04,0x89,0xe2,0x22,0x2e,0x20,0x8d,
- 0x01,0x04,0x8a,0xcf,0xd3,0xbd,0x20,0x8d,
- 0x01,0x04,0x8b,0x82,0x29,0x52,0x20,0x8d,
+ 0x01,0x04,0x8a,0x3b,0x14,0xd1,0x20,0x8d,
+ 0x01,0x04,0x8b,0x3b,0x46,0xa3,0x20,0x8d,
0x01,0x04,0x8c,0xee,0xdc,0x63,0x20,0x8d,
+ 0x01,0x04,0x8d,0xc1,0x44,0x0b,0x20,0x8d,
0x01,0x04,0x8e,0x36,0xb5,0xda,0x20,0x8d,
- 0x01,0x04,0x8e,0xa6,0x13,0x17,0x20,0x8d,
- 0x01,0x04,0x8e,0xfe,0x57,0x73,0x20,0x8d,
- 0x01,0x04,0x8f,0xb1,0xe5,0x95,0x20,0x8d,
- 0x01,0x04,0x90,0x02,0x65,0x15,0x20,0x8d,
+ 0x01,0x04,0x8e,0x73,0x8c,0x02,0x20,0x8d,
+ 0x01,0x04,0x8e,0xbc,0x7d,0xc8,0x20,0x8d,
+ 0x01,0x04,0x8f,0x6e,0xfc,0x7c,0x20,0x8d,
0x01,0x04,0x90,0x18,0xec,0x40,0x20,0x8d,
- 0x01,0x04,0x91,0x28,0x33,0x34,0x20,0x8d,
+ 0x01,0x04,0x90,0x89,0x1d,0xb5,0x20,0x8d,
0x01,0x04,0x92,0x47,0x45,0x67,0x20,0x8d,
- 0x01,0x04,0x92,0x78,0xf1,0xad,0x20,0x8d,
- 0x01,0x04,0x93,0x32,0xee,0x35,0x20,0x8d,
- 0x01,0x04,0x94,0x67,0x65,0x84,0x20,0x8d,
- 0x01,0x04,0x95,0x4b,0x30,0x5c,0x20,0x8d,
+ 0x01,0x04,0x95,0x1c,0x9f,0x8d,0x20,0x8d,
+ 0x01,0x04,0x95,0x8f,0x20,0x1a,0x20,0x8d,
+ 0x01,0x04,0x95,0xca,0x4f,0xc7,0x20,0x8d,
+ 0x01,0x04,0x95,0xf8,0x01,0xfe,0x20,0x8d,
+ 0x01,0x04,0x97,0xf8,0xdd,0xc5,0x20,0x8d,
0x01,0x04,0x98,0x2c,0x89,0x53,0x20,0x8d,
- 0x01,0x04,0x9a,0x00,0x03,0xc2,0x20,0x8d,
+ 0x01,0x04,0x98,0xe6,0xb4,0x73,0x20,0x8d,
0x01,0x04,0x9a,0x1a,0x89,0x69,0x20,0x8d,
- 0x01,0x04,0x9a,0x1a,0x9a,0x49,0x20,0x8d,
- 0x01,0x04,0x9a,0x39,0x05,0x0b,0x20,0x8d,
- 0x01,0x04,0x9b,0x04,0x37,0x15,0x20,0x8d,
- 0x01,0x04,0x9c,0x92,0x89,0x8e,0x20,0x8d,
- 0x01,0x04,0x9c,0x92,0xb1,0xdd,0x20,0x8d,
- 0x01,0x04,0x9d,0x16,0x48,0xaf,0x20,0x8d,
- 0x01,0x04,0x9d,0x61,0x00,0x76,0x20,0x8d,
- 0x01,0x04,0x9e,0x8c,0x8d,0x45,0x20,0x8d,
- 0x01,0x04,0x9e,0xb5,0x84,0x54,0x20,0x8d,
- 0x01,0x04,0x9f,0x02,0xd7,0x62,0x20,0x8d,
- 0x01,0x04,0x9f,0xc4,0x03,0xef,0x20,0x8d,
- 0x01,0x04,0x9f,0xe0,0xbd,0xfa,0x20,0x8d,
- 0x01,0x04,0xa0,0x50,0x0c,0x10,0x20,0x8d,
- 0x01,0x04,0xa1,0xe6,0x26,0xa0,0x20,0x8d,
- 0x01,0x04,0xa1,0xf6,0x0b,0xe6,0x20,0x8d,
- 0x01,0x04,0xa2,0x00,0xd2,0x98,0x20,0x8d,
- 0x01,0x04,0xa2,0x3e,0x12,0xe2,0x20,0x8d,
- 0x01,0x04,0xa2,0xfe,0x76,0x14,0x20,0x8d,
- 0x01,0x04,0xa3,0x9e,0xa8,0xb5,0x20,0x8d,
- 0x01,0x04,0xa5,0xad,0x13,0x21,0x20,0x8d,
- 0x01,0x04,0xa5,0xe4,0xae,0x75,0x20,0x8d,
+ 0x01,0x04,0x9a,0x5c,0x6f,0x64,0x20,0x8d,
+ 0x01,0x04,0x9d,0x83,0x14,0xae,0x20,0x8d,
+ 0x01,0x04,0x9e,0x81,0x8c,0xc9,0x20,0x8d,
+ 0x01,0x04,0x9e,0xb5,0x72,0xc4,0x20,0x8d,
+ 0x01,0x04,0x9e,0xdc,0x55,0x52,0x20,0x8d,
+ 0x01,0x04,0x9e,0xdc,0x79,0x5d,0x20,0x8d,
+ 0x01,0x04,0x9f,0x02,0xbf,0xaf,0x20,0x8d,
+ 0x01,0x04,0x9f,0xe0,0xee,0x91,0x20,0x8d,
+ 0x01,0x04,0xa1,0x61,0xa7,0x0a,0x20,0x8d,
+ 0x01,0x04,0xa2,0xd5,0x77,0x0c,0x20,0x8d,
+ 0x01,0x04,0xa2,0xe2,0x3d,0x08,0x20,0x8d,
+ 0x01,0x04,0xa2,0xfe,0xab,0xd1,0x20,0x8d,
+ 0x01,0x04,0xa3,0x72,0x9f,0xcd,0x20,0x8d,
+ 0x01,0x04,0xa3,0xac,0x54,0x86,0x20,0x8d,
0x01,0x04,0xa5,0xff,0xf1,0xb8,0x20,0x8d,
- 0x01,0x04,0xa7,0x58,0x0b,0xcb,0x20,0x8d,
0x01,0x04,0xa7,0xb3,0x93,0x9b,0x20,0x8d,
+ 0x01,0x04,0xa9,0x96,0xce,0xce,0x20,0x8d,
0x01,0x04,0xaa,0x11,0x97,0xeb,0x20,0x8d,
- 0x01,0x04,0xaa,0x40,0xae,0xe6,0x20,0x8d,
+ 0x01,0x04,0xaa,0xfe,0x93,0x74,0x20,0x8d,
0x01,0x04,0xac,0x5c,0x66,0x73,0x20,0x8d,
0x01,0x04,0xac,0x69,0x15,0xd8,0x20,0x8d,
- 0x01,0x04,0xac,0x6f,0xb0,0xf4,0x20,0x8d,
- 0x01,0x04,0xac,0xff,0x62,0x6c,0x20,0x8d,
- 0x01,0x04,0xad,0x52,0x05,0xca,0x20,0x8d,
+ 0x01,0x04,0xac,0xdb,0xe5,0xfc,0x20,0x8d,
+ 0x01,0x04,0xac,0xfb,0x65,0x1b,0x20,0x8d,
+ 0x01,0x04,0xad,0x0c,0x77,0x85,0x20,0x8d,
+ 0x01,0x04,0xad,0x13,0xb0,0xe4,0x20,0x8d,
0x01,0x04,0xad,0xb5,0x23,0x32,0x20,0x8d,
- 0x01,0x04,0xad,0xd4,0xfd,0x89,0x20,0x8d,
- 0x01,0x04,0xad,0xeb,0x49,0x57,0x20,0x8d,
- 0x01,0x04,0xae,0x1e,0x1d,0x55,0x20,0x8d,
- 0x01,0x04,0xae,0x8d,0xd1,0x28,0x20,0x8d,
+ 0x01,0x04,0xad,0xd4,0x62,0x00,0x20,0x8d,
+ 0x01,0x04,0xad,0xf1,0xe3,0xf3,0x20,0x8d,
+ 0x01,0x04,0xad,0xf6,0x1f,0x72,0x20,0x8d,
+ 0x01,0x04,0xae,0x14,0x39,0x1e,0x20,0x8d,
+ 0x01,0x04,0xaf,0x1b,0xf7,0x68,0x20,0x8d,
+ 0x01,0x04,0xaf,0x88,0xae,0xae,0x20,0x8d,
0x01,0x04,0xb0,0x09,0x11,0x79,0x20,0x8d,
- 0x01,0x04,0xb0,0x0c,0x10,0x87,0x20,0x8d,
+ 0x01,0x04,0xb0,0x25,0x52,0x53,0x20,0x8d,
0x01,0x04,0xb0,0x4a,0x88,0xed,0x20,0x8d,
- 0x01,0x04,0xb0,0x4a,0x8b,0x78,0x20,0x8d,
- 0x01,0x04,0xb0,0x7a,0x7a,0x86,0x20,0x8d,
- 0x01,0x04,0xb0,0x7e,0xa7,0x0a,0x20,0x8d,
- 0x01,0x04,0xb0,0x97,0xf4,0x82,0x20,0x8d,
- 0x01,0x04,0xb0,0xba,0x13,0x6a,0x20,0x8d,
- 0x01,0x04,0xb0,0xd4,0xb9,0x99,0x20,0x8d,
- 0x01,0x04,0xb1,0x8e,0x92,0xc1,0x20,0x8d,
+ 0x01,0x04,0xb0,0x76,0xdc,0x1d,0x20,0x8d,
+ 0x01,0x04,0xb0,0x8a,0xe9,0xa6,0x20,0x8d,
+ 0x01,0x04,0xb1,0x20,0x32,0xa7,0x20,0x8d,
0x01,0x04,0xb2,0x15,0x76,0xb2,0x20,0x8d,
- 0x01,0x04,0xb2,0x3d,0x8d,0xc6,0x20,0x8d,
- 0x01,0x04,0xb2,0x7c,0xa2,0xd1,0x20,0x8d,
- 0x01,0x04,0xb2,0x8f,0x19,0xc2,0x20,0x8d,
- 0x01,0x04,0xb2,0x9a,0xe9,0xc5,0x20,0x8d,
+ 0x01,0x04,0xb2,0x29,0x0b,0xfe,0x20,0x8d,
+ 0x01,0x04,0xb2,0x4f,0x53,0x93,0x20,0x8d,
+ 0x01,0x04,0xb2,0x58,0xbd,0xfe,0x20,0x8d,
+ 0x01,0x04,0xb2,0x9a,0xde,0x68,0x20,0x8d,
0x01,0x04,0xb2,0x9f,0x62,0x85,0x20,0x8d,
- 0x01,0x04,0xb2,0xe8,0xba,0xbf,0x20,0x8d,
- 0x01,0x04,0xb2,0xec,0x89,0x3f,0x20,0x8d,
- 0x01,0x04,0xb3,0x3c,0x95,0x04,0x20,0x8d,
- 0x01,0x04,0xb8,0xa0,0x6e,0x68,0x20,0x8d,
- 0x01,0x04,0xb8,0xae,0x25,0x8b,0x20,0x8d,
- 0x01,0x04,0xb9,0x08,0x68,0xb3,0x20,0x8d,
- 0x01,0x04,0xb9,0x0e,0x1e,0x19,0x20,0x8d,
+ 0x01,0x04,0xb2,0xc6,0x17,0x78,0x20,0x8d,
+ 0x01,0x04,0xb2,0xfa,0xe8,0x6f,0x20,0x8d,
+ 0x01,0x04,0xb6,0xe5,0x91,0xa1,0x20,0x8d,
+ 0x01,0x04,0xb7,0x58,0xdf,0xd0,0x20,0x8d,
+ 0x01,0x04,0xb7,0x81,0xb2,0xcd,0x20,0x8d,
0x01,0x04,0xb9,0x19,0x30,0xb8,0x20,0x8d,
+ 0x01,0x04,0xb9,0x1a,0x63,0xab,0x20,0x8d,
+ 0x01,0x04,0xb9,0x1f,0x88,0xf6,0x20,0x8d,
0x01,0x04,0xb9,0x34,0x5d,0x2d,0x20,0x8d,
- 0x01,0x04,0xb9,0x40,0x74,0x0f,0x20,0x8d,
- 0x01,0x04,0xb9,0x45,0x69,0x75,0x20,0x8d,
- 0x01,0x04,0xb9,0x62,0x36,0x14,0x20,0x8d,
+ 0x01,0x04,0xb9,0x45,0x35,0x99,0x20,0x8d,
+ 0x01,0x04,0xb9,0x54,0xe0,0x74,0x20,0x8d,
0x01,0x04,0xb9,0x6b,0x53,0x37,0x20,0x8d,
- 0x01,0x04,0xb9,0x84,0x6d,0x7a,0x20,0x8d,
- 0x01,0x04,0xb9,0x87,0x51,0x32,0x20,0x8d,
- 0x01,0x04,0xb9,0x8c,0xfd,0xa9,0x20,0x8d,
+ 0x01,0x04,0xb9,0x74,0x5e,0xef,0x20,0x8d,
+ 0x01,0x04,0xb9,0x8c,0xd1,0x9f,0x20,0x8d,
0x01,0x04,0xb9,0x94,0x03,0xe3,0x20,0x8d,
- 0x01,0x04,0xb9,0x9a,0x02,0x03,0x20,0x8d,
- 0x01,0x04,0xb9,0xa2,0x5c,0x24,0x20,0x8d,
- 0x01,0x04,0xb9,0xa3,0x2c,0x24,0x20,0x8d,
+ 0x01,0x04,0xb9,0x98,0x8a,0x4a,0x20,0x8d,
+ 0x01,0x04,0xb9,0x99,0xc4,0x0e,0x20,0x8d,
+ 0x01,0x04,0xb9,0x99,0xc4,0xa2,0x20,0x8d,
+ 0x01,0x04,0xb9,0x9c,0x25,0x1e,0x20,0x8d,
+ 0x01,0x04,0xb9,0x9c,0x9a,0x81,0x20,0x8d,
+ 0x01,0x04,0xb9,0x9e,0x71,0xac,0x20,0x8d,
0x01,0x04,0xb9,0xa5,0xaa,0x13,0x20,0x8d,
- 0x01,0x04,0xb9,0xa7,0x71,0x3b,0x20,0x8d,
- 0x01,0x04,0xb9,0xb9,0x3b,0x0c,0x20,0x8d,
+ 0x01,0x04,0xb9,0xbe,0x18,0x48,0x20,0x8d,
+ 0x01,0x04,0xb9,0xc7,0xd1,0x34,0x20,0x8d,
0x01,0x04,0xb9,0xcb,0x29,0x94,0x20,0x8d,
0x01,0x04,0xb9,0xd1,0x0c,0x4c,0x20,0x8d,
- 0x01,0x04,0xb9,0xd1,0x46,0x11,0x20,0x8d,
0x01,0x04,0xb9,0xd2,0x7d,0x21,0x20,0x8d,
0x01,0x04,0xb9,0xe9,0xbd,0xd2,0x20,0x8d,
- 0x01,0x04,0xb9,0xee,0x83,0x13,0x20,0x8d,
- 0x01,0x04,0xb9,0xef,0xdc,0xd2,0x20,0x8d,
- 0x01,0x04,0xb9,0xef,0xdd,0x05,0x20,0x8d,
- 0x01,0x04,0xb9,0xfa,0x5a,0xf6,0x20,0x8d,
- 0x01,0x04,0xba,0xf9,0xd9,0x19,0x20,0x8d,
- 0x01,0x04,0xba,0xfa,0x5f,0x84,0x20,0x8d,
+ 0x01,0x04,0xb9,0xfa,0x24,0x42,0x20,0x8d,
+ 0x01,0x04,0xb9,0xfe,0x61,0xa4,0x20,0x8d,
+ 0x01,0x04,0xba,0xeb,0x56,0xf9,0x20,0x8d,
+ 0x01,0x04,0xbc,0x1b,0x4f,0xeb,0x20,0x8d,
0x01,0x04,0xbc,0x23,0xa7,0x0e,0x20,0x8d,
0x01,0x04,0xbc,0x44,0x35,0x2c,0x20,0x8d,
- 0x01,0x04,0xbc,0x78,0xff,0x73,0x20,0x8d,
- 0x01,0x04,0xbd,0x06,0xc3,0x6f,0x20,0x8d,
- 0x01,0x04,0xbe,0x02,0x82,0x2c,0x20,0x8d,
- 0x01,0x04,0xbe,0x0d,0x7a,0x59,0x20,0x8d,
- 0x01,0x04,0xbe,0x7b,0x1b,0x0b,0x20,0x8d,
- 0x01,0x04,0xbe,0x91,0x7f,0xfe,0x20,0x8d,
- 0x01,0x04,0xbf,0xdc,0x9c,0x40,0x20,0x8d,
- 0x01,0x04,0xc0,0x1f,0x88,0x5a,0x20,0x8d,
- 0x01,0x04,0xc0,0x45,0x35,0x2b,0x20,0x8d,
+ 0x01,0x04,0xbc,0x77,0x43,0x89,0x20,0x8d,
+ 0x01,0x04,0xbc,0x7f,0xf3,0x29,0x20,0x8d,
+ 0x01,0x04,0xbc,0x8a,0x70,0x3c,0x20,0x8d,
+ 0x01,0x04,0xbc,0x8e,0xc7,0x11,0x20,0x8d,
+ 0x01,0x04,0xbc,0x9b,0x48,0xa0,0x20,0x8d,
+ 0x01,0x04,0xbc,0xd6,0x81,0x34,0x20,0x8d,
+ 0x01,0x04,0xbc,0xd6,0x81,0x8b,0x20,0x8d,
+ 0x01,0x04,0xbc,0xd7,0x3e,0x7a,0x20,0x8d,
+ 0x01,0x04,0xbc,0xed,0xa7,0x33,0x20,0x8d,
+ 0x01,0x04,0xbc,0xf6,0xe0,0x0c,0x20,0x8d,
+ 0x01,0x04,0xbd,0x06,0xdd,0x25,0x20,0x8d,
+ 0x01,0x04,0xbe,0x02,0x92,0x5a,0x20,0x8d,
+ 0x01,0x04,0xbe,0x11,0x12,0xbe,0x20,0x8d,
+ 0x01,0x04,0xbe,0xd2,0x62,0xfd,0x20,0x8d,
+ 0x01,0x04,0xc0,0x03,0x0b,0x18,0x20,0x8d,
+ 0x01,0x04,0xc0,0x45,0x35,0x12,0x20,0x8d,
0x01,0x04,0xc0,0x92,0x89,0x2c,0x20,0x8d,
- 0x01,0x04,0xc0,0xae,0x79,0x21,0x20,0x8d,
- 0x01,0x04,0xc0,0xde,0x93,0xaf,0x20,0x8d,
- 0x01,0x04,0xc1,0xc6,0x22,0x18,0x20,0x8d,
- 0x01,0x04,0xc1,0xde,0x82,0x0e,0x20,0x8d,
- 0x01,0x04,0xc2,0x23,0xb9,0xa7,0x20,0x8d,
- 0x01,0x04,0xc2,0x36,0x53,0xea,0x20,0x8d,
- 0x01,0x04,0xc2,0xe9,0x54,0x64,0x20,0x8d,
- 0x01,0x04,0xc3,0x02,0x49,0x58,0x20,0x8d,
- 0x01,0x04,0xc3,0x30,0x0c,0x08,0x20,0x8d,
- 0x01,0x04,0xc3,0x9a,0xc8,0x9d,0x20,0x8d,
- 0x01,0x04,0xc5,0xd3,0x85,0x0f,0x20,0x8d,
- 0x01,0x04,0xc6,0x54,0x92,0x08,0x20,0x8d,
- 0x01,0x04,0xc6,0x62,0x37,0x56,0x20,0x8d,
- 0x01,0x04,0xc7,0xf7,0x07,0xd0,0x20,0x8d,
- 0x01,0x04,0xc8,0x74,0x9a,0x83,0x20,0x8d,
- 0x01,0x04,0xc9,0xbf,0x06,0x67,0x20,0x8d,
- 0x01,0x04,0xc9,0xdd,0xea,0xc8,0x20,0x8d,
- 0x01,0x04,0xca,0x2f,0xe1,0xf2,0x20,0x8d,
- 0x01,0x04,0xca,0x6b,0xdb,0x82,0x20,0x8d,
- 0x01,0x04,0xca,0x6c,0xd3,0x87,0x20,0x8d,
- 0x01,0x04,0xca,0x8a,0x0d,0x7a,0x20,0x8d,
- 0x01,0x04,0xcb,0x56,0xc3,0x20,0x20,0x8d,
- 0x01,0x04,0xcb,0xb8,0x34,0xf7,0x20,0x8d,
- 0x01,0x04,0xcc,0x6f,0xa3,0x72,0x20,0x8d,
- 0x01,0x04,0xcd,0xb2,0x29,0x7c,0x20,0x8d,
+ 0x01,0x04,0xc1,0x16,0x80,0x0c,0x20,0x8d,
+ 0x01,0x04,0xc1,0x27,0x8e,0x59,0x20,0x8d,
+ 0x01,0x04,0xc1,0x2e,0x4a,0xfc,0x20,0x8d,
+ 0x01,0x04,0xc1,0x2e,0x4a,0xfe,0x20,0x8d,
+ 0x01,0x04,0xc1,0x5f,0xf9,0x03,0x20,0x8d,
+ 0x01,0x04,0xc1,0x95,0xb0,0xc8,0x20,0x8d,
+ 0x01,0x04,0xc1,0x97,0x9b,0x7a,0x20,0x8d,
+ 0x01,0x04,0xc1,0xbb,0x5a,0x7a,0x20,0x8d,
+ 0x01,0x04,0xc1,0xc4,0x25,0x3e,0x20,0x8d,
+ 0x01,0x04,0xc2,0x23,0xb8,0x5f,0x20,0x8d,
+ 0x01,0x04,0xc2,0xa5,0x1e,0x14,0x20,0x8d,
+ 0x01,0x04,0xc2,0xbf,0xe8,0x99,0x20,0x8d,
+ 0x01,0x04,0xc3,0x20,0x6c,0xa4,0x20,0x8d,
+ 0x01,0x04,0xc3,0x38,0x3f,0x0b,0x20,0x8d,
+ 0x01,0x04,0xc3,0x38,0x3f,0x0c,0x20,0x8d,
+ 0x01,0x04,0xc3,0x7b,0xd9,0x3f,0x20,0x8d,
+ 0x01,0x04,0xc3,0x80,0xf8,0x99,0x20,0x8d,
+ 0x01,0x04,0xc3,0x8c,0xe2,0x9a,0x20,0x8d,
+ 0x01,0x04,0xc3,0xa0,0xde,0x51,0x20,0x8d,
+ 0x01,0x04,0xc3,0xce,0x69,0x07,0x20,0x8d,
+ 0x01,0x04,0xc7,0x24,0xfd,0xfc,0x20,0x8d,
+ 0x01,0x04,0xc7,0x3a,0x64,0x73,0x20,0x8d,
+ 0x01,0x04,0xca,0x5a,0xf2,0x5d,0x20,0x8d,
+ 0x01,0x04,0xca,0x70,0xee,0x80,0x20,0x8d,
+ 0x01,0x04,0xca,0xba,0x26,0x63,0x20,0x8d,
+ 0x01,0x04,0xcb,0x0c,0x00,0xa7,0x20,0x8d,
+ 0x01,0x04,0xcb,0x0c,0x0a,0xe0,0x20,0x8d,
+ 0x01,0x04,0xcb,0xd2,0xc1,0x15,0x20,0x8d,
+ 0x01,0x04,0xcc,0xe4,0x8e,0xd3,0x20,0x8d,
+ 0x01,0x04,0xcd,0xb2,0xb6,0x85,0x20,0x8d,
+ 0x01,0x04,0xce,0x37,0xb2,0x9d,0x20,0x8d,
0x01,0x04,0xce,0xc0,0xcb,0x00,0x20,0x8d,
- 0x01,0x04,0xcf,0xe5,0x2e,0x50,0x20,0x8d,
- 0x01,0x04,0xcf,0xf4,0xf8,0x51,0x20,0x8d,
+ 0x01,0x04,0xcf,0x62,0xfd,0x58,0x20,0x8d,
+ 0x01,0x04,0xcf,0x73,0x54,0x2f,0x20,0x8d,
0x01,0x04,0xcf,0xff,0xc1,0x2f,0x20,0x8d,
- 0x01,0x04,0xd0,0x3b,0x85,0x3f,0x20,0x8d,
- 0x01,0x04,0xd1,0x3a,0x91,0x9d,0x20,0x8d,
- 0x01,0x04,0xd1,0x61,0xbd,0xf9,0x20,0x8d,
- 0x01,0x04,0xd1,0xb1,0x8a,0xf5,0x20,0x8d,
+ 0x01,0x04,0xd0,0x68,0x5c,0x4a,0x20,0x8d,
+ 0x01,0x04,0xd1,0x26,0xf4,0x57,0x20,0x8d,
+ 0x01,0x04,0xd1,0xcc,0x1d,0x12,0x20,0x8d,
+ 0x01,0x04,0xd1,0xcd,0xcc,0xda,0x20,0x8d,
0x01,0x04,0xd1,0xed,0x85,0x36,0x20,0x8d,
- 0x01,0x04,0xd2,0x36,0x25,0xbe,0x20,0x8d,
- 0x01,0x04,0xd2,0x36,0x27,0xee,0x20,0x8d,
- 0x01,0x04,0xd4,0x22,0xe1,0x76,0x20,0x8d,
- 0x01,0x04,0xd4,0x29,0x09,0x1e,0x20,0x8d,
- 0x01,0x04,0xd4,0x33,0x84,0xb0,0x20,0x8d,
- 0x01,0x04,0xd4,0x45,0x3c,0x4d,0x20,0x8d,
+ 0x01,0x04,0xd2,0x06,0x5f,0x7f,0x20,0x8d,
+ 0x01,0x04,0xd2,0xcd,0x92,0x72,0x20,0x8d,
+ 0x01,0x04,0xd3,0xdd,0x2a,0x8f,0x20,0x8d,
+ 0x01,0x04,0xd4,0x05,0x9d,0x28,0x20,0x8d,
+ 0x01,0x04,0xd4,0x33,0x88,0x32,0x20,0x8d,
0x01,0x04,0xd4,0x56,0x20,0x6a,0x20,0x8d,
- 0x01,0x04,0xd5,0x2f,0x40,0x69,0x20,0x8d,
+ 0x01,0x04,0xd4,0xa2,0x98,0x95,0x20,0x8d,
+ 0x01,0x04,0xd4,0xe3,0x96,0x93,0x20,0x8d,
+ 0x01,0x04,0xd4,0xe3,0x9b,0xaa,0x20,0x8d,
+ 0x01,0x04,0xd4,0xfb,0xa2,0xbe,0x20,0x8d,
+ 0x01,0x04,0xd5,0x6d,0xec,0x81,0x20,0x8d,
0x01,0x04,0xd5,0x8d,0x9a,0xc9,0x20,0x8d,
- 0x01,0x04,0xd5,0x8e,0x94,0xa9,0x20,0x8d,
- 0x01,0x04,0xd5,0xb8,0xf4,0x18,0x20,0x8d,
- 0x01,0x04,0xd5,0xe3,0x93,0xf4,0x20,0x8d,
- 0x01,0x04,0xd5,0xfa,0x15,0x70,0x20,0x8d,
- 0x01,0x04,0xd8,0x92,0xfb,0x08,0x20,0x8d,
- 0x01,0x04,0xd8,0xe8,0x9d,0x68,0x20,0x8d,
- 0x01,0x04,0xd9,0x0f,0xb2,0x0b,0x20,0x8d,
- 0x01,0x04,0xd9,0x1a,0x20,0x0a,0x20,0x8d,
+ 0x01,0x04,0xd5,0xc1,0x53,0xfb,0x20,0x8d,
+ 0x01,0x04,0xd5,0xc1,0x53,0xfc,0x20,0x8d,
+ 0x01,0x04,0xd5,0xca,0xe1,0x7a,0x20,0x8d,
+ 0x01,0x04,0xd8,0x53,0x96,0x8e,0x20,0x8d,
+ 0x01,0x04,0xd8,0xba,0xec,0x62,0x20,0x8d,
+ 0x01,0x04,0xd8,0xe8,0x21,0x18,0x20,0x8d,
+ 0x01,0x04,0xd9,0x40,0x2f,0x8a,0x20,0x8d,
0x01,0x04,0xd9,0x40,0x2f,0xc8,0x20,0x8d,
- 0x01,0x04,0xd9,0x4c,0x33,0x19,0x20,0x8d,
+ 0x01,0x04,0xd9,0x4c,0x3d,0x4e,0x20,0x8d,
0x01,0x04,0xd9,0x5c,0x37,0xf6,0x20,0x8d,
+ 0x01,0x04,0xd9,0x71,0x79,0xa9,0x20,0x8d,
+ 0x01,0x04,0xd9,0x9b,0xf4,0xaa,0x20,0x8d,
0x01,0x04,0xd9,0xaa,0x7c,0xaa,0x20,0x8d,
+ 0x01,0x04,0xd9,0xad,0xec,0x19,0x20,0x8d,
+ 0x01,0x04,0xd9,0xb4,0xc0,0x74,0x20,0x8d,
0x01,0x04,0xd9,0xb4,0xdd,0xa2,0x20,0x8d,
- 0x01,0x04,0xd9,0xb4,0xee,0x89,0x20,0x8d,
- 0x01,0x04,0xdc,0x54,0xe8,0x2e,0x20,0x8d,
- 0x01,0x04,0xdc,0x85,0x27,0x3d,0x20,0x8d,
- 0x01,0x04,0xdc,0xe9,0x5b,0xb6,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x19,0xf0,0x10,0x00,0x1d,0xb3,0x54,0x00,0x04,0xff,0xfe,0x56,0x5a,0x8d,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x24,0xda,0x3e,0xec,0xef,0xff,0xfe,0xb9,0xf3,0x6e,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x24,0xda,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x45,0x35,0x3e,0xec,0xef,0xff,0xfe,0xb9,0x87,0xe4,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x19,0xf0,0x00,0x05,0x45,0x35,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x01,0x04,0xda,0x2b,0x7b,0xec,0x20,0x8d,
+ 0x01,0x04,0xdb,0x4d,0x4f,0x80,0x20,0x8d,
+ 0x01,0x04,0xdf,0x12,0xde,0xd2,0x20,0x8d,
+ 0x01,0x04,0xdf,0xa7,0x4b,0xa5,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x16,0x20,0x55,0x66,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x2c,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x16,0x20,0x0a,0x21,0x00,0x00,0xda,0x5e,0xd3,0xff,0xfe,0xe3,0x68,0xa0,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x19,0xf0,0x44,0x01,0x0e,0x8a,0x54,0x00,0x04,0xff,0xfe,0x8e,0xd3,0x98,0x20,0x8d,
0x02,0x10,0x20,0x01,0x1b,0xc0,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x1c,0x04,0x40,0x08,0x63,0x00,0x8a,0x5f,0x26,0x78,0x11,0x4b,0xa6,0x60,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0x37,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0x8f,0x49,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0xbb,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x02,0xbf,0x8f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x03,0x03,0xde,0x8b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x40,0x60,0x44,0x19,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x02,0x03,0x8f,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x03,0x0e,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
0x02,0x10,0x20,0x01,0x41,0xd0,0x04,0x03,0x3d,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xd0,0x04,0x05,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x04,0x05,0x6e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x08,0x83,0xcf,0x19,0x5b,0xb2,0x02,0x92,0x71,0xcc,0x5b,0x20,0x8d,
0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x08,0xed,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x0a,0x69,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x41,0xf0,0x00,0x00,0x00,0x00,0x00,0x62,0x69,0x74,0x63,0x6f,0x69,0x6e,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x41,0xd0,0x00,0x0a,0x6b,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1b,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
0x02,0x10,0x20,0x01,0x04,0x70,0x1b,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x05,0x04,0x3b,0x28,0x31,0x85,0x30,0x71,0x79,0x58,0x64,0x20,0x8d,
0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x09,0x0b,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x15,0x01,0x06,0xe2,0xd5,0x5e,0xff,0xfe,0x42,0x7a,0xe5,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x1b,0x03,0x65,0xaa,0x20,0x66,0xff,0xfe,0x3f,0x19,0x09,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x0a,0x08,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x20,0x01,0x04,0x70,0x1f,0x1b,0x05,0xa6,0x02,0x16,0x3e,0xff,0xfe,0x24,0x11,0x62,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x6a,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
0x02,0x10,0x20,0x01,0x04,0x70,0x75,0xe9,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0x8c,0xa0,0x00,0x02,0x4e,0x72,0xb9,0xff,0xfe,0x56,0xf8,0xb8,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x04,0x70,0xdb,0xc7,0x00,0x00,0x10,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x4b,0xa0,0xca,0xfe,0x14,0xcc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x4b,0xa0,0xff,0xff,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x88,0xff,0x00,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x8c,0xa0,0x00,0x02,0x76,0x46,0xa0,0xff,0xfe,0x9b,0xe6,0x62,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x0a,0x0c,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x04,0x70,0x00,0x0c,0x10,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0x30,0xb7,0x1d,0x7b,0x6f,0xec,0x4c,0x5c,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0x08,0x8e,0xb4,0xff,0x2a,0xd0,0x69,0x9b,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0x9c,0x1c,0xcc,0x31,0x9f,0xe8,0x55,0x05,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0xa0,0xc4,0xd4,0x1f,0x04,0xc4,0x1b,0xb0,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x00,0xfd,0x76,0xc1,0xd3,0x18,0x54,0x5b,0xd9,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x01,0x00,0x00,0x00,0x00,0x76,0x76,0x80,0x90,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0x35,0x64,0x00,0x01,0xb9,0x77,0xbd,0x71,0x46,0x12,0x8e,0x40,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0xaf,0x0e,0x35,0x64,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x01,0x20,0x8d,
0x02,0x10,0x20,0x01,0x4d,0xd0,0xaf,0x0e,0x35,0x64,0x00,0x00,0x00,0x00,0x00,0x69,0x00,0x90,0x20,0x8d,
0x02,0x10,0x20,0x01,0x05,0x60,0x44,0x1f,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x06,0x38,0xa0,0x00,0x41,0x40,0x00,0x00,0x00,0x00,0xff,0xff,0x01,0x91,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x06,0x7c,0x25,0xdc,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x05,0xa8,0x40,0xc7,0xf5,0x00,0x7a,0x0d,0x0d,0x50,0x25,0x5e,0xdb,0xac,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x38,0xa0,0x00,0x41,0x40,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x47,0x20,0x8d,
0x02,0x10,0x20,0x01,0x06,0x7c,0x26,0xb4,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x06,0x7c,0x2d,0xb8,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x7c,0x04,0x40,0x06,0x88,0x00,0x91,0x02,0x36,0x02,0x51,0x01,0x37,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x06,0x7c,0x04,0x40,0x06,0x88,0x00,0x91,0x02,0x36,0x02,0x51,0x01,0x39,0x20,0x8d,
0x02,0x10,0x20,0x01,0x07,0xc0,0x23,0x10,0x00,0x00,0xf8,0x16,0x3e,0xff,0xfe,0x6c,0x4f,0x58,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x08,0x61,0x32,0x42,0x84,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x08,0xb0,0x13,0x01,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0xb0,0x30,0x24,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0x07,0x02,0xef,0x6e,0x4a,0x00,0x3d,0x97,0x4e,0x78,0x4a,0x68,0x4b,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0x07,0x5d,0x32,0xb1,0x42,0x8f,0x77,0x3c,0x7d,0xa2,0xfd,0xed,0x2e,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x08,0x61,0x0c,0x62,0x2f,0xd0,0xca,0x7f,0x54,0xff,0xfe,0xce,0x06,0xd9,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x08,0x71,0x02,0x3d,0xd5,0xd1,0x5a,0x47,0xca,0xff,0xfe,0x71,0x0c,0x8d,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x09,0x10,0x10,0x9d,0x2c,0x03,0xd2,0x17,0xc2,0xff,0xfe,0x07,0x2c,0xd9,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x61,0x78,0x11,0x04,0x89,0xd2,0xda,0x0e,0x07,0x1a,0xf7,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x6b,0x80,0x74,0x32,0xe8,0x92,0x43,0xa3,0x37,0xe6,0x0a,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0x07,0x64,0x6b,0x80,0x74,0x4c,0xc6,0x79,0xa5,0x3a,0xf7,0x71,0x32,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0x07,0x0a,0xd4,0xca,0x4b,0x7d,0xd5,0x84,0x71,0x50,0xc3,0x53,0x63,0x20,0x8d,
+ 0x02,0x10,0x20,0x01,0x0b,0xc8,0x12,0x01,0x07,0x15,0xca,0x1f,0x66,0xff,0xfe,0xc9,0x5f,0xf0,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0xc8,0x12,0x01,0x07,0x1a,0x2e,0x59,0xe5,0xff,0xfe,0x42,0x52,0xf4,0x20,0x8d,
0x02,0x10,0x20,0x01,0x0b,0xc8,0x16,0x00,0x00,0x00,0x02,0x08,0xa2,0xff,0xfe,0x0c,0x8a,0x2e,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0xc8,0x32,0x3c,0x00,0xff,0xa6,0x34,0x38,0x4f,0x18,0x49,0xf4,0xbc,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0xc8,0x32,0x3c,0x00,0xff,0xd2,0x17,0xc2,0xff,0xfe,0x07,0x2c,0xd9,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0xc8,0x07,0x00,0x2b,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0b,0xc8,0x07,0x00,0x8d,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x20,0x01,0x0e,0x68,0x54,0x00,0x58,0xd0,0xbd,0x15,0xea,0x8c,0x5b,0x20,0x75,0x23,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x24,0x11,0xa3,0xe1,0x49,0x00,0x72,0x98,0xf5,0x50,0x67,0xe7,0xb9,0x9b,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x2b,0x5c,0x0b,0x20,0x8d,
- 0x02,0x10,0x24,0x00,0x89,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x5a,0x68,0x5c,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xdc,0x2f,0x4a,0xeb,0x00,0x4e,0xcc,0x6a,0xff,0xfe,0x25,0xc9,0xa3,0x20,0x8d,
+ 0x02,0x10,0x20,0x03,0x00,0xf6,0x3f,0x31,0x06,0x00,0x4c,0x9f,0x76,0x20,0x83,0x24,0xd4,0xa7,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x08,0x48,0x50,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x09,0x40,0x40,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x09,0x53,0x80,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x02,0x20,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x0f,0x90,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x3d,0xb0,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x3f,0x10,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x49,0xa0,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x56,0xd0,0x01,0x20,0x8d,
+ 0x02,0x10,0x24,0x00,0x61,0x80,0x01,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x0a,0x56,0xe0,0x01,0x20,0x8d,
0x02,0x10,0x24,0x01,0xb1,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x10,0x20,0x8d,
0x02,0x10,0x24,0x01,0xb1,0x40,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x20,0x20,0x8d,
- 0x02,0x10,0x24,0x01,0xd0,0x02,0x39,0x02,0x07,0x00,0xd7,0x2c,0x5e,0x22,0x4e,0x95,0x38,0x9d,0x20,0x8d,
- 0x02,0x10,0x24,0x04,0x44,0x08,0x63,0xa4,0x0a,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x50,0x20,0x8d,
+ 0x02,0x10,0x24,0x02,0xe2,0x80,0x3d,0x17,0x09,0x45,0x18,0x89,0xd3,0xc6,0x8e,0x85,0xd3,0xc4,0x20,0x8d,
+ 0x02,0x10,0x24,0x03,0x62,0x00,0x88,0x21,0x2f,0xdf,0x39,0x03,0xa2,0xb1,0x00,0x9f,0xc8,0x97,0x20,0x8d,
0x02,0x10,0x24,0x06,0x34,0x00,0x02,0x16,0x8b,0x00,0x02,0x11,0x32,0xff,0xfe,0xca,0x33,0x6b,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0x8c,0x00,0x00,0x00,0x34,0x22,0x01,0x33,0x00,0x18,0x02,0x28,0x01,0x08,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x11,0x01,0x69,0x0b,0x03,0x32,0xb5,0xf9,0x01,0x9f,0x7c,0x3e,0x4b,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x18,0x09,0xf1,0xf3,0x01,0x7d,0x2e,0xc2,0x56,0xc1,0x12,0xf2,0xbe,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x18,0x09,0xf1,0xf3,0x03,0xc1,0xc9,0xc5,0x69,0xb7,0x99,0x20,0x57,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x1e,0x0a,0x4e,0x8a,0x00,0x20,0xdb,0xdd,0x8d,0x36,0x70,0x28,0xf0,0x20,0x8d,
- 0x02,0x10,0x24,0x06,0xda,0x1e,0x0a,0x4e,0x8a,0x03,0x2a,0xad,0x49,0x6b,0x76,0x8d,0xe4,0x97,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x14,0x03,0x35,0xb6,0x00,0xeb,0x14,0x05,0xfd,0x20,0x72,0x36,0x53,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x1c,0x05,0x0b,0xcd,0x00,0x3c,0xae,0x17,0x28,0xec,0xfc,0x43,0x34,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x1c,0x05,0x0b,0xcd,0x03,0x36,0xd6,0x13,0xfa,0xeb,0xa8,0x65,0x43,0x20,0x8d,
+ 0x02,0x10,0x24,0x06,0xda,0x1e,0x0a,0x4e,0x8a,0x03,0xd9,0x0a,0xfb,0xb0,0x23,0xd3,0xcc,0xb4,0x20,0x8d,
0x02,0x10,0x24,0x07,0x36,0x40,0x21,0x07,0x12,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x07,0x36,0x40,0x30,0x10,0x40,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x24,0x07,0x88,0x00,0xbc,0x61,0x22,0x02,0xd6,0x3d,0x7e,0xff,0xfe,0x6c,0xdc,0x36,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x17,0x00,0x5c,0x5b,0x00,0xb0,0xaa,0xa1,0x59,0xff,0xfe,0x5f,0x61,0x5a,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x17,0x00,0xec,0x7b,0x57,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x48,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x00,0x4c,0xc4,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x00,0x4c,0xc4,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x00,0x4c,0xc4,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x00,0x4c,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x19,0x00,0x40,0x30,0xa2,0x5e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x1f,0x14,0x04,0x0e,0xe3,0x01,0xaf,0xdd,0xad,0x00,0xe5,0x68,0xd2,0x20,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x1f,0x1c,0x02,0xd3,0x24,0x00,0xf1,0x5e,0x2f,0x2a,0x76,0x0d,0xa3,0x3d,0x20,0x8d,
+ 0x02,0x10,0x24,0x07,0x70,0x00,0x9f,0x71,0x2d,0x00,0x1c,0x5a,0x52,0x92,0x51,0x08,0xc7,0x34,0x20,0x8d,
+ 0x02,0x10,0x24,0x08,0x82,0x07,0x26,0x55,0xfa,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x0b,0x20,0x8d,
+ 0x02,0x10,0x24,0x08,0x82,0x07,0x54,0x56,0xd8,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xc6,0x20,0x8d,
+ 0x02,0x10,0x24,0x09,0x02,0x50,0x60,0xa0,0x26,0x00,0xa9,0x71,0x1c,0xdd,0x3d,0x5b,0x65,0x4d,0x20,0x8d,
+ 0x02,0x10,0x24,0x0d,0x00,0x1a,0x04,0xb1,0xe7,0x00,0x00,0x19,0xd9,0xef,0x07,0xf3,0x8e,0x75,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x17,0x00,0x39,0x48,0x08,0x2f,0xce,0x04,0xd3,0x82,0x52,0x26,0x4c,0xac,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x16,0x0a,0x08,0xb9,0x00,0x4b,0xfe,0x2f,0x81,0xae,0x31,0x05,0xf5,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x1c,0x02,0xd3,0x24,0x01,0x69,0x89,0xb1,0xfd,0xd2,0xa6,0xfb,0xc8,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x1f,0x1e,0x02,0xfe,0x36,0x01,0x63,0xa8,0xeb,0xf6,0x83,0xe4,0x19,0x32,0x20,0x8d,
0x02,0x10,0x26,0x00,0x21,0x04,0x10,0x03,0xc5,0xab,0xdc,0x5e,0x90,0xff,0xfe,0x18,0x1d,0x08,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0x92,0x27,0x45,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0xcf,0x61,0xb6,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x00,0xe0,0x02,0x2e,0x32,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x14,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x2a,0x52,0x66,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x74,0x5f,0x59,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0xe6,0x21,0x46,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x92,0xff,0xfe,0x5d,0x09,0xfb,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x40,0x40,0x20,0x04,0x32,0x01,0x45,0x9f,0x8f,0xe8,0x44,0x4d,0xba,0xf1,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x40,0x40,0x45,0x41,0x49,0x00,0x04,0xe1,0xb5,0x8a,0x84,0x38,0x45,0x0e,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0xf0,0x3c,0x91,0xff,0xfe,0x4b,0x0c,0x52,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x00,0xe0,0x02,0x2e,0x32,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x3c,0x02,0x00,0x00,0x00,0x00,0xf0,0x3c,0x94,0xff,0xfe,0xcc,0xc9,0x9c,0x20,0x8d,
+ 0x02,0x10,0x26,0x00,0x6c,0x4e,0x0a,0x00,0x0c,0xd0,0x42,0x8d,0x5c,0xff,0xfe,0x58,0x48,0x84,0x20,0x8d,
0x02,0x10,0x26,0x00,0x6c,0x54,0x71,0x00,0x1a,0xd1,0xc9,0x2e,0x03,0x6d,0x06,0x51,0xbd,0x18,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x88,0x01,0x2f,0x80,0x04,0x77,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x1c,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x88,0x01,0x8d,0x00,0x3e,0xb0,0x02,0x0c,0x29,0xff,0xfe,0xc3,0xd7,0x99,0x20,0x8d,
- 0x02,0x10,0x26,0x00,0x88,0x05,0x24,0x00,0x01,0x4e,0x12,0xdd,0xb1,0xff,0xfe,0xf2,0x30,0x13,0x20,0x8d,
0x02,0x10,0x26,0x01,0x01,0x84,0x03,0x00,0x15,0x6c,0xba,0x4c,0x00,0x30,0x09,0xda,0x6c,0x06,0x20,0x8d,
- 0x02,0x10,0x26,0x01,0x03,0x46,0x0d,0x7f,0xff,0xf7,0x18,0xc6,0x48,0x56,0xef,0x75,0x74,0x4c,0x20,0x8d,
- 0x02,0x10,0x26,0x01,0x04,0x05,0x4a,0x00,0x08,0x76,0xc8,0xd3,0xf0,0x81,0x2c,0xe8,0xba,0x8e,0x20,0x8d,
- 0x02,0x10,0x26,0x02,0x02,0x4c,0x0b,0x8f,0xcd,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x40,0x20,0x8d,
- 0x02,0x10,0x26,0x02,0xfe,0xc3,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x69,0x20,0x8d,
- 0x02,0x10,0x26,0x02,0xff,0x16,0x00,0x01,0x00,0x00,0x00,0x01,0x04,0x12,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x30,0x01,0x26,0x18,0xc0,0x00,0x2e,0xc1,0xdf,0x1f,0xa4,0x63,0x91,0x19,0x20,0x8d,
+ 0x02,0x10,0x26,0x01,0x01,0x85,0x83,0x02,0x12,0xf0,0x1a,0xb2,0x28,0x40,0x9d,0xe4,0x15,0x50,0x20,0x8d,
0x02,0x10,0x26,0x03,0x30,0x03,0x01,0x1b,0xe1,0x00,0x02,0x0c,0x29,0xff,0xfe,0x38,0xbb,0xc0,0x20,0x8d,
0x02,0x10,0x26,0x03,0x30,0x04,0x06,0xa1,0x38,0x00,0x85,0x1f,0x58,0x4d,0x7a,0xba,0xaf,0xfb,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x30,0x04,0x06,0xa1,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7b,0xba,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x30,0x04,0x06,0xa1,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf6,0x67,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x30,0x24,0x16,0x06,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0xec,0x20,0x8d,
0x02,0x10,0x26,0x03,0x30,0x24,0x18,0xee,0x80,0x00,0x02,0x0e,0xc4,0xff,0xfe,0xd1,0xef,0x15,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x60,0x00,0xa4,0x00,0x93,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x60,0x10,0x70,0x01,0x48,0x30,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x20,0x8d,
0x02,0x10,0x26,0x03,0x80,0x80,0x1f,0x07,0x6f,0xdd,0x7d,0xe2,0xd9,0x69,0x78,0xc9,0xb7,0xea,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x80,0x80,0xd6,0x00,0x18,0x00,0x7c,0xe1,0x74,0xa2,0x6a,0x8a,0x46,0x43,0x20,0x8d,
- 0x02,0x10,0x26,0x03,0x80,0x81,0x6c,0x00,0x30,0x6e,0x02,0x15,0x5d,0xff,0xfe,0x02,0x15,0x0a,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0x3d,0x09,0x71,0x82,0x87,0x00,0xbb,0xa9,0xcd,0xe6,0x5b,0x37,0xa8,0xdf,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0x40,0x80,0x10,0x36,0x80,0xb1,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xbe,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0x0a,0x00,0x00,0x03,0x12,0x23,0x02,0x16,0x3e,0xff,0xfe,0x27,0x76,0xe0,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0xa8,0x80,0x04,0x00,0x00,0xd0,0x00,0x00,0x00,0x00,0x26,0x1f,0x60,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x01,0x3e,0xf0,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x01,0x7a,0x70,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x00,0xc1,0x30,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x04,0xa8,0x80,0x00,0x04,0x01,0xd0,0x00,0x00,0x00,0x00,0x00,0xe5,0xb0,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0x4a,0x80,0xa3,0x02,0x79,0x40,0x72,0x54,0x1e,0xd4,0x90,0xd7,0x4f,0x39,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0x4a,0x80,0xa3,0x02,0x79,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x04,0x40,0x80,0x10,0x36,0x80,0xb1,0x50,0xe1,0x43,0xff,0xfe,0x0e,0x9d,0xf5,0x20,0x8d,
0x02,0x10,0x26,0x05,0x64,0x00,0x00,0x30,0xf2,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0xa1,0x40,0x30,0x10,0x40,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0xae,0x00,0x02,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x03,0x20,0x8d,
- 0x02,0x10,0x26,0x05,0x0b,0x40,0x14,0xd0,0x5b,0x00,0x79,0x88,0x0e,0xb8,0x6b,0xb6,0x66,0xe2,0x20,0x8d,
+ 0x02,0x10,0x26,0x05,0x64,0x00,0x00,0x30,0xfd,0x6f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x20,0x8d,
0x02,0x10,0x26,0x05,0xc0,0x00,0x2a,0x0a,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x20,0x8d,
+ 0x02,0x10,0x26,0x06,0x6d,0x00,0x01,0x00,0x51,0x02,0x03,0xd2,0xf0,0x6a,0xc2,0xe8,0x0a,0x54,0x20,0x8d,
+ 0x02,0x10,0x26,0x07,0x53,0x00,0x00,0x60,0x2e,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x26,0x07,0x53,0x00,0x00,0x61,0x08,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x14,0x25,0xb5,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x21,0x9c,0x2f,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x21,0xbf,0x32,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x33,0x4d,0x1b,0x20,0x8d,
0x02,0x10,0x26,0x07,0x92,0x80,0x00,0x0b,0x07,0x3b,0x02,0x50,0x56,0xff,0xfe,0x3d,0x04,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0x6e,0xa0,0x00,0x00,0x01,0x00,0x42,0x00,0x42,0x00,0x42,0x00,0x42,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x05,0x16,0x01,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x09,0x90,0x0b,0x20,0x8d,
- 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x0b,0x30,0x0e,0x20,0x8d,
- 0x02,0x10,0x28,0x00,0x01,0x50,0x01,0x1d,0x0d,0x2f,0xbd,0xac,0x78,0x07,0x02,0xf5,0x4a,0xa0,0x20,0x8d,
- 0x02,0x10,0x28,0x03,0x98,0x00,0xa0,0x07,0x82,0xba,0x65,0x0b,0x82,0xb8,0x83,0x77,0x00,0xd0,0x20,0x8d,
- 0x02,0x10,0x28,0x04,0x01,0x4c,0x01,0x55,0x45,0xe0,0x1e,0x86,0x15,0xa3,0xef,0xd9,0x72,0x87,0x20,0x8d,
- 0x02,0x10,0x28,0x04,0x01,0x4c,0x65,0x7d,0x40,0x30,0x28,0xb4,0x0e,0xff,0xfe,0x9b,0x88,0x94,0x20,0x8d,
- 0x02,0x10,0x28,0x04,0x01,0x4d,0x10,0x87,0x94,0x34,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x02,0x20,0x8d,
- 0x02,0x10,0x28,0x04,0x09,0x54,0x00,0x24,0x00,0x02,0xb3,0x90,0xd8,0x3b,0x35,0x8a,0xdb,0x53,0x20,0x8d,
- 0x02,0x10,0x28,0x04,0x0d,0x57,0x55,0x4d,0xde,0x00,0x3e,0x7c,0x3f,0xff,0xfe,0x7b,0x80,0xaa,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x10,0x28,0x83,0x8c,0x56,0x3a,0xfd,0x25,0x87,0xb6,0x5a,0x54,0x08,0x11,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x0d,0x30,0x15,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x03,0x26,0x6c,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x09,0x93,0x0b,0x20,0x8d,
+ 0x02,0x10,0x26,0x20,0x00,0xa6,0x20,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x0b,0x30,0x11,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x01,0x50,0x01,0x1d,0x24,0x26,0x06,0x2b,0xb1,0x64,0x70,0x4a,0x69,0x62,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x03,0x00,0x82,0x51,0x0b,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x03,0x00,0x82,0x51,0x0b,0x50,0x0e,0x92,0x64,0xf5,0x22,0xaf,0xc3,0x1e,0x20,0x8d,
+ 0x02,0x10,0x28,0x00,0x00,0x40,0x00,0x15,0x06,0xad,0x48,0xe8,0x22,0x00,0xa8,0x82,0xe0,0x8e,0x20,0x8d,
+ 0x02,0x10,0x28,0x03,0x51,0x80,0x41,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x28,0x03,0x98,0x00,0x94,0x47,0x84,0xbb,0xca,0xb8,0xd2,0xf5,0x38,0x8c,0x9a,0x57,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x01,0x4d,0x7e,0x33,0x83,0xb0,0x6e,0x41,0x1c,0xcc,0xcf,0x20,0xaf,0xf9,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x04,0x31,0xe0,0x38,0xcd,0x01,0xaa,0xa1,0x59,0xff,0xfe,0x0d,0x44,0xb8,0x20,0x8d,
+ 0x02,0x10,0x28,0x04,0x0d,0x57,0x45,0x0d,0x0f,0x00,0xa4,0x22,0x98,0x28,0xb0,0x0e,0x91,0xe9,0x20,0x8d,
+ 0x02,0x10,0x28,0x06,0x02,0xf0,0x50,0x20,0xd2,0x87,0x4d,0xcd,0x62,0x04,0x90,0x9b,0x41,0x25,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x12,0x98,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x65,0x42,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x13,0x98,0x00,0x04,0x2a,0x03,0x02,0x15,0x5d,0xff,0xfe,0xd6,0x10,0x33,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x12,0xe0,0x01,0x01,0x00,0x99,0x02,0x0c,0x29,0xff,0xfe,0x29,0xd0,0x3f,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x13,0x98,0x00,0x04,0x2a,0x03,0x3e,0xec,0xef,0xff,0xfe,0x05,0xd9,0x3e,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x13,0x98,0x00,0x04,0x2a,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xbc,0x03,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x17,0x68,0x20,0x01,0x00,0x27,0x00,0x00,0x00,0x00,0x00,0x00,0xef,0x6a,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x1f,0x40,0x50,0x01,0x01,0x08,0x5d,0x17,0x77,0x03,0xb0,0xf5,0x41,0x33,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x23,0xc5,0xfe,0x80,0x73,0x01,0xd6,0xae,0x52,0xff,0xfe,0xd5,0x56,0xa5,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x60,0x20,0x13,0xdc,0xbc,0x00,0x55,0x59,0x02,0x58,0x02,0x7d,0xb5,0x2b,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x60,0x20,0x45,0x03,0x37,0x00,0x02,0x0c,0x29,0xff,0xfe,0x61,0x4a,0x4c,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x60,0x20,0xb4,0x34,0xeb,0x00,0xde,0xa6,0x32,0xff,0xfe,0x0d,0xa5,0xc0,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x23,0xc6,0x5c,0x8a,0x5c,0x00,0xc0,0x5a,0x4d,0xff,0xfe,0x65,0x9d,0x69,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0x60,0x20,0x45,0x03,0x37,0x00,0x50,0x54,0x00,0xff,0xfe,0x90,0x64,0x0e,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x60,0x20,0xb4,0x89,0x20,0x00,0x50,0x54,0x00,0xff,0xfe,0xfc,0x5e,0xd8,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x7c,0x80,0x00,0x00,0x01,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x7c,0x80,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x00,0x00,0x00,0xe3,0x7a,0x20,0x8d,
0x02,0x10,0x2a,0x00,0x8a,0x60,0xe0,0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0xbb,0xe0,0x00,0xcc,0x00,0x00,0x5a,0x11,0x22,0xff,0xfe,0xb4,0x8f,0x5c,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0xbb,0xe0,0x00,0xcc,0x00,0x00,0x62,0xa4,0x4c,0xff,0xfe,0x23,0x75,0x10,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x0c,0xa8,0x0a,0x15,0x9a,0x5b,0x8b,0x42,0xa8,0x86,0x7d,0x48,0x7a,0x21,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x0c,0xa8,0x0a,0x1f,0xf9,0xb7,0xcb,0x55,0x57,0x66,0x52,0x4b,0xac,0xaa,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0xd4,0xe0,0x00,0xff,0xfc,0x02,0x5e,0x55,0x4a,0x7c,0xb8,0x3b,0xe5,0xa1,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0xbb,0xe0,0x00,0x00,0x22,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x46,0x20,0x8d,
0x02,0x10,0x2a,0x00,0xd5,0x20,0x00,0x09,0x93,0x00,0x42,0x0b,0x54,0x4e,0x80,0x19,0x6d,0x3a,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0xd8,0x80,0x00,0x05,0x00,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0xd3,0x29,0x20,0x8d,
- 0x02,0x10,0x2a,0x00,0x0e,0xe2,0x12,0x00,0x19,0x00,0x08,0xd3,0xd2,0xff,0xfe,0xb1,0xbc,0x58,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x01,0x73,0x23,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x00,0xfd,0x40,0x00,0x0c,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x01,0x71,0x1f,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x00,0x72,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x02,0x03,0xe6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x21,0x44,0xd7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x31,0x09,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x61,0x2b,0xcd,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x61,0x3c,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x02,0x42,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x42,0x20,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x61,0x42,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf8,0x02,0x72,0x4c,0xd9,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0xa9,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x1a,0xaf,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x2b,0x02,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x3a,0x2d,0xd2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x04,0xf9,0x00,0x5a,0x44,0xa5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x07,0xa7,0x00,0x02,0x28,0x04,0xae,0x1f,0x6b,0xff,0xfe,0x9d,0x6c,0x94,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x07,0xc8,0xaa,0xc2,0x01,0x80,0x50,0x54,0x00,0xff,0xfe,0x56,0x8d,0x10,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x07,0xc8,0xaa,0xc9,0x00,0xc9,0x50,0x54,0x00,0xff,0xfe,0xdf,0xff,0x95,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x7e,0x01,0x00,0x00,0x00,0x00,0xf0,0x3c,0x93,0xff,0xfe,0x49,0x2f,0x5b,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x87,0x40,0x00,0x01,0x07,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0xe5,0xcb,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x87,0x40,0x00,0x01,0xff,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x28,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x87,0x40,0x00,0x01,0xff,0xc5,0x00,0x00,0x00,0x00,0x00,0x00,0x8c,0x6a,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0xcb,0x00,0x0b,0x63,0xc0,0x00,0x02,0x27,0x0e,0xff,0xfe,0x28,0xc5,0x65,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0xcb,0x19,0x06,0x88,0xe9,0x00,0xaa,0x60,0xb6,0xff,0xfe,0x29,0xbb,0xae,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x01,0x63,0xc0,0xb0,0x9d,0xa5,0x16,0x90,0xa1,0x2b,0xbe,0xde,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x02,0x82,0x67,0xb0,0xb4,0xf4,0xaa,0xff,0xfe,0x7c,0x44,0xa6,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x00,0x07,0x90,0xf5,0x00,0x11,0x0b,0xb4,0x46,0x22,0x60,0x7d,0x2c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x10,0x03,0x36,0xcb,0x00,0x61,0xac,0xd1,0x5d,0x4a,0xc0,0x2c,0xbd,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x10,0x03,0x36,0xcb,0x00,0xd2,0x37,0x45,0xff,0xfe,0xc5,0x2c,0xd0,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0xcb,0x15,0x80,0x4c,0x80,0x00,0x02,0x1e,0x06,0xff,0xfe,0x51,0x2c,0x32,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x01,0x85,0x55,0xf0,0xa0,0xba,0x9e,0xaf,0x98,0x53,0x92,0xb7,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0x01,0x70,0x10,0xb8,0x7d,0xe1,0x4b,0xce,0xa9,0xb9,0x98,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0x20,0x39,0xa0,0x32,0x5a,0x3a,0xff,0xfe,0x02,0x31,0x80,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0x51,0x9f,0xb0,0x6b,0xf2,0x95,0xd6,0xb7,0xbd,0xb8,0x46,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x05,0xfa,0xa0,0xa0,0xca,0x1f,0x66,0xff,0xfe,0xce,0xb8,0xa2,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x08,0x3d,0xdd,0x30,0x36,0x76,0x5d,0x8e,0x8a,0x6f,0x11,0x5a,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x09,0xe9,0xc2,0x40,0x7b,0x44,0xf3,0x2a,0x6e,0xc0,0xa8,0xaf,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x03,0xb3,0x14,0x20,0x7c,0xa0,0x3a,0x9a,0x5c,0xc3,0xb6,0x44,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x00,0x05,0x93,0x90,0xbf,0x35,0x4d,0x41,0x8a,0x2a,0x05,0x70,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x09,0xe9,0xc2,0x40,0x8e,0x3a,0xaf,0x64,0x04,0xf0,0x8f,0x79,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x0b,0x0f,0x37,0xe0,0xa1,0x3f,0x0e,0x65,0xac,0x42,0x8e,0x36,0x20,0x8d,
0x02,0x10,0x2a,0x01,0x0e,0x0a,0x00,0xb5,0x7f,0x50,0xc2,0x57,0xa5,0x5b,0x48,0x46,0x97,0xe1,0x20,0x8d,
- 0x02,0x10,0x2a,0x01,0x0e,0x11,0x10,0x0c,0x00,0x70,0xcb,0xc8,0x9e,0x31,0x4b,0x77,0x16,0x26,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x12,0x10,0x2c,0xdf,0x46,0x00,0x02,0xbc,0xe0,0x3e,0x43,0xe8,0x47,0x18,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x0a,0x0b,0xf6,0x8d,0x70,0x02,0x0c,0x29,0xff,0xfe,0x30,0x4f,0xd2,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x11,0x10,0x0c,0x00,0x70,0x39,0xf3,0xe3,0xc9,0x83,0x2f,0x03,0x7a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x01,0x0e,0x34,0xec,0x1d,0x71,0x00,0x8a,0xae,0xdd,0xff,0xfe,0x02,0x41,0x59,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x12,0x10,0x7c,0x92,0x51,0x00,0x02,0x11,0x32,0xff,0xfe,0xae,0x15,0x2d,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x12,0x10,0x86,0xbf,0xf1,0x00,0xa9,0xac,0xd0,0x41,0x1f,0x8e,0x69,0x25,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x12,0x10,0x94,0xc3,0x34,0x00,0xd8,0xc3,0x74,0x3c,0x90,0xf6,0xa4,0x8a,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x01,0x68,0x20,0x00,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x01,0x68,0x42,0x0b,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x01,0x68,0x67,0x6e,0x00,0x00,0xe6,0x5f,0x01,0xff,0xfe,0x09,0x35,0x91,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x17,0x48,0xf3,0x9f,0x58,0x72,0x02,0x16,0x3e,0xff,0xfe,0x21,0x02,0x66,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x01,0x80,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0x17,0x10,0xb6,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x27,0x80,0x90,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x27,0x80,0x90,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x27,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x1a,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x2f,0x05,0x60,0x08,0xce,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x22,0xa0,0xbb,0xb3,0xdc,0x10,0x50,0xe1,0x57,0xff,0xfe,0x70,0x94,0x92,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x24,0x7a,0x02,0x15,0x3e,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x2c,0x60,0xf1,0x03,0x07,0xc0,0x1a,0x31,0xbf,0xff,0xfe,0xcc,0x5d,0x91,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x31,0x02,0x4d,0x5c,0xf0,0x00,0xde,0xa6,0x32,0xff,0xfe,0xbb,0xb9,0xcb,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x31,0x02,0xbc,0x00,0x10,0xe9,0x0c,0xa5,0x9d,0xff,0xfe,0xa9,0x1c,0xbb,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x03,0x90,0x90,0x00,0x00,0x00,0xaa,0xa1,0x59,0xff,0xfe,0x43,0xb5,0x7b,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x05,0x78,0x85,0xce,0x16,0x00,0x1e,0x1b,0x0d,0xff,0xfe,0xe3,0x77,0x4b,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x07,0x68,0xf9,0x2b,0xdb,0x46,0x5e,0x46,0x77,0x2b,0x07,0x1d,0x29,0xb7,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7a,0x01,0x00,0x00,0x00,0x00,0x00,0x91,0x02,0x28,0x00,0x45,0x01,0x30,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7b,0x40,0x50,0xd0,0xe3,0x86,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7b,0x40,0x50,0xd1,0xe3,0x5b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7b,0x40,0x59,0x28,0x00,0x89,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7b,0x40,0xb9,0x45,0x34,0x4d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x7b,0x40,0xd4,0x18,0x6d,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x80,0x70,0x0b,0x84,0x6a,0xe0,0xf9,0xc6,0xfb,0xb9,0x1c,0x41,0x81,0xaa,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x80,0x70,0xf1,0x86,0x38,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xd5,0xa6,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x80,0x84,0x01,0x03,0x68,0x10,0x1e,0x69,0x7a,0xff,0xfe,0xa2,0x1a,0xcc,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x83,0x08,0x80,0x81,0xf3,0x00,0x03,0xb8,0x7e,0xc0,0x28,0x37,0x1b,0x57,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x80,0x70,0xf1,0x81,0xf6,0x00,0x0b,0xcb,0x02,0xd1,0xd7,0x90,0x78,0xff,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x80,0x71,0x63,0x80,0xc5,0x00,0x72,0x85,0xc2,0xff,0xfe,0xb5,0xa3,0x9c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x80,0x84,0x20,0x21,0x73,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x66,0xe6,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0x83,0x08,0x81,0x88,0x51,0x00,0x6d,0x8b,0x45,0x31,0x43,0x31,0xee,0xe2,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x83,0x88,0xe3,0x02,0x79,0x80,0x6f,0x85,0xa0,0xb3,0x4b,0x4d,0x8b,0x0f,0x20,0x8d,
0x02,0x10,0x2a,0x02,0x83,0x88,0xe5,0xc3,0x4a,0x80,0x02,0x01,0x2e,0xff,0xfe,0x82,0xb3,0xcc,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x84,0x2a,0x01,0xdf,0x8a,0x01,0x1e,0x1b,0x0d,0xff,0xfe,0x0b,0x23,0x6d,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa2,0x10,0x28,0xbe,0x5f,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x11,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x4b,0x5c,0xf9,0x00,0x01,0xb6,0x2e,0x99,0xff,0xfe,0x49,0xd4,0x92,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x4d,0x14,0xd6,0x00,0x01,0x02,0xc0,0x08,0xff,0xfe,0x8f,0xb3,0xb2,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa3,0x1a,0xe0,0x3d,0x94,0x00,0x3f,0x18,0x27,0x29,0x0c,0x86,0xd7,0x54,0x20,0x8d,
0x02,0x10,0x2a,0x02,0xa4,0x5a,0x94,0xcd,0xf0,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x5f,0x3b,0x9d,0x00,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x99,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x64,0x3d,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x6c,0x7f,0x8e,0x00,0x01,0x35,0xbf,0x3a,0xeb,0x13,0x7c,0x1d,0x35,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xa4,0x6d,0x03,0x6f,0x00,0x01,0x02,0x0d,0xb9,0xff,0xfe,0x4e,0x63,0x98,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x05,0x20,0x21,0x42,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x20,0x44,0x98,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x06,0x20,0x75,0x33,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x00,0x00,0x38,0x29,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x20,0x14,0x41,0x99,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x20,0x14,0x87,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x20,0x26,0x66,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xa4,0x65,0x80,0xf4,0x00,0x01,0xf3,0x69,0x4e,0xf5,0xaa,0x12,0x75,0x66,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xab,0x88,0x02,0x0b,0xce,0x00,0x02,0x23,0x24,0xff,0xfe,0x56,0x62,0x02,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x20,0x16,0x23,0x94,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x56,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x56,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x56,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x58,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x73,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x73,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x02,0xc2,0x06,0x21,0x62,0x80,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
0x02,0x10,0x2a,0x02,0xc2,0x07,0x20,0x34,0x73,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x30,0x02,0x74,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xc2,0x07,0x30,0x08,0x45,0x92,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0xcb,0x43,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x78,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x0e,0x5e,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x20,0x8d,
- 0x02,0x10,0x2a,0x02,0x0e,0x98,0x00,0x20,0x15,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x28,0x00,0x68,0x74,0x11,0x53,0xff,0xfe,0x4c,0x02,0x1d,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0x40,0x00,0x00,0x65,0x0f,0xdc,0x34,0x62,0x66,0xff,0xfe,0x05,0xec,0x5c,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0x60,0x00,0x08,0x70,0x00,0x00,0x00,0x46,0x00,0x23,0x00,0x87,0x02,0x18,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0x94,0xe0,0xff,0xff,0x01,0x85,0x02,0x43,0x02,0x18,0x00,0x00,0x00,0x19,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0x03,0x97,0x60,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x01,0x00,0xe0,0x00,0x00,0x00,0x00,0x07,0x94,0x90,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x00,0x02,0x88,0xc0,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x00,0x03,0x0c,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xb0,0xc0,0x00,0x03,0x00,0xd0,0x00,0x00,0x00,0x00,0x0e,0x3b,0x50,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x5f,0xd6,0x35,0x57,0x20,0x8d,
- 0x02,0x10,0x2a,0x04,0x21,0x80,0xdc,0x05,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3b,0x20,0x8d,
- 0x02,0x10,0x2a,0x04,0x21,0x80,0xff,0xff,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x20,0x8d,
- 0x02,0x10,0x2a,0x04,0x52,0xc0,0x01,0x03,0xc4,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x04,0xbc,0x40,0x1d,0xc3,0x00,0x8d,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0x35,0x80,0xdc,0x0b,0x16,0x00,0xde,0xf4,0x5a,0x62,0xde,0x42,0x32,0x4a,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0xd0,0x14,0x0a,0x55,0x40,0x00,0x8d,0xde,0x06,0x9f,0x4a,0xc7,0x0b,0x26,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0xd0,0x16,0x09,0x8f,0x52,0x01,0x6b,0xe0,0xa4,0xde,0x80,0xc7,0x32,0xd5,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0xd0,0x18,0x0a,0x75,0x6c,0x03,0x07,0x5b,0x2c,0x73,0x8c,0xaa,0x41,0x4b,0x20,0x8d,
- 0x02,0x10,0x2a,0x05,0xf4,0x80,0x18,0x00,0x06,0x97,0x54,0x00,0x02,0xff,0xfe,0xb6,0xc3,0x6d,0x20,0x8d,
- 0x02,0x10,0x2a,0x06,0xe0,0x40,0x76,0x03,0x29,0x18,0xc6,0xef,0x46,0x4e,0x9f,0xe5,0x73,0xec,0x20,0x8d,
- 0x02,0x10,0x2a,0x07,0xab,0xc4,0x00,0x00,0x00,0x00,0x00,0x89,0x02,0x34,0x01,0x80,0x01,0x94,0x20,0x8d,
- 0x02,0x10,0x2a,0x07,0xd8,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x7e,0x20,0x8d,
- 0x02,0x10,0x2a,0x09,0x26,0x81,0x10,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x20,0x8d,
- 0x02,0x10,0x2a,0x09,0x26,0x81,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x20,0x8d,
- 0x02,0x10,0x2a,0x0b,0xf3,0x00,0x00,0x02,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x0d,0x83,0x40,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x20,0x8d,
- 0x02,0x10,0x2a,0x0e,0x8f,0x02,0x21,0xd1,0x01,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x0e,0xb7,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xd1,0xf0,0x5b,0x20,0x8d,
- 0x02,0x10,0x2a,0x10,0x37,0x81,0x2c,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x10,0xd2,0x00,0x00,0x01,0x00,0x33,0xa6,0xbf,0x01,0xff,0xfe,0x6a,0x46,0xa9,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xe4,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
- 0x02,0x10,0x2c,0x0f,0xf8,0xf0,0xda,0x51,0x00,0x00,0x3a,0x45,0xfc,0x57,0x5e,0x30,0x25,0x93,0x20,0x8d,
- 0x04,0x20,0xd0,0x60,0x63,0xb5,0x63,0xa7,0x98,0x2a,0x1b,0x8f,0x42,0xb2,0xf8,0xd8,0xf3,0x4a,0x5b,0x2c,0x10,0x64,0x88,0xa7,0x51,0x23,0xca,0x58,0xad,0x92,0x3d,0xa9,0x1f,0x3c,0x20,0x8d,
- 0x04,0x20,0xe2,0xe3,0xbb,0x69,0x18,0xc2,0xfb,0x4e,0xaf,0xd3,0x74,0x91,0x91,0x2f,0x0a,0x2f,0x6b,0xb9,0x32,0x11,0x74,0x06,0xdd,0x23,0x87,0xda,0xa1,0xe7,0x94,0x21,0x48,0x75,0x20,0x8d,
- 0x04,0x20,0xe9,0xbf,0xa7,0xbd,0x9b,0x54,0x54,0xe8,0xc8,0xae,0x78,0x99,0xa0,0xa3,0xf6,0x5d,0x78,0xe3,0x9e,0x5c,0xa7,0x18,0xb9,0x13,0x0c,0x04,0x9b,0xf3,0x7f,0x27,0x18,0xb0,0x20,0x8d,
- 0x04,0x20,0xec,0x82,0xc1,0x2f,0x8c,0xe8,0x1e,0x8e,0xce,0x00,0x2a,0x38,0x61,0x09,0x51,0x6e,0xf1,0xdd,0x4b,0x3d,0x64,0x95,0x72,0xee,0x7e,0x45,0xb8,0x17,0xfc,0x91,0xb2,0x1f,0x20,0x8d,
- 0x04,0x20,0xff,0xfc,0x02,0x19,0x7f,0x99,0x4e,0x6f,0x39,0x10,0x86,0x3f,0xe4,0xb6,0xd1,0xb0,0x6a,0x2c,0x4e,0x57,0xd4,0x08,0x61,0x18,0xfa,0x62,0x61,0x44,0xad,0x7c,0xdf,0xfc,0x20,0x8d,
- 0x04,0x20,0xff,0xd8,0x39,0x93,0x9a,0x94,0x57,0xcd,0x48,0xe3,0x3e,0x98,0x79,0xa6,0x3f,0x69,0x7e,0x36,0x10,0x70,0x8d,0xbc,0x15,0x08,0x64,0x51,0xc7,0x56,0x35,0x63,0xf3,0x93,0x20,0x8d,
- 0x04,0x20,0x06,0x42,0xf9,0x1f,0x80,0x8c,0x16,0xcf,0x73,0x9a,0xb1,0x50,0xcc,0x7e,0x11,0xf7,0x42,0xc3,0x83,0x59,0x39,0x92,0x6f,0xd8,0x20,0x4a,0x3d,0x5a,0x82,0x86,0xee,0xcf,0x20,0x8d,
- 0x04,0x20,0x0f,0xb9,0x71,0x05,0x64,0x83,0x2c,0x68,0x6a,0x9c,0xf0,0x4f,0xc3,0x90,0xcd,0x5c,0x73,0x9a,0xdd,0xb3,0xc6,0x42,0xca,0x09,0xbb,0xcc,0xfe,0x29,0x49,0x9f,0xc7,0x28,0x20,0x8d,
- 0x04,0x20,0x0c,0xa0,0x19,0x89,0xe0,0x8c,0x4a,0x83,0xae,0xce,0x5c,0xf9,0x73,0x24,0x25,0xe0,0x8d,0x01,0x2a,0xb1,0xac,0x8b,0x8a,0xe3,0xd5,0x3a,0x21,0x16,0x9f,0x96,0xf1,0x8e,0x20,0x8d,
- 0x04,0x20,0x0c,0xa0,0x19,0x8a,0x74,0x59,0x74,0x6e,0x26,0x69,0x90,0xca,0x65,0xe8,0x83,0xfc,0x25,0xec,0xe7,0xb6,0x85,0xf5,0xf8,0x37,0x08,0x42,0xbe,0xb0,0x38,0x4a,0x8e,0x2b,0x20,0x8d,
- 0x04,0x20,0x15,0x91,0xb2,0x2a,0x36,0x3a,0x0d,0xcf,0x8c,0xe7,0xc9,0x48,0xd8,0xf4,0xe1,0xa8,0x94,0x9f,0x97,0x20,0x72,0x70,0x6a,0x83,0x28,0xd2,0xe8,0x29,0x11,0xb6,0x0e,0x6c,0x20,0x8d,
- 0x04,0x20,0x19,0x2a,0x86,0x86,0x62,0x65,0x95,0x44,0x4e,0xb7,0x5e,0xe6,0x54,0x75,0xc5,0xe6,0x41,0x4e,0x7b,0x0c,0x20,0x1a,0xd5,0x26,0xbe,0x2b,0xdb,0x85,0xa8,0xc5,0xdc,0x3a,0x20,0x8d,
- 0x04,0x20,0x19,0x2a,0x86,0x86,0x62,0x9d,0x3f,0x41,0x4d,0x7f,0x3a,0xf1,0xa4,0xd2,0x9b,0x99,0xc2,0x62,0x22,0xa5,0x6d,0x6d,0xb1,0x29,0x3b,0x79,0xf1,0xe6,0xe2,0xaf,0x6d,0xfd,0x20,0x8d,
- 0x04,0x20,0x19,0x2a,0x86,0x86,0x62,0xc2,0xbd,0xcd,0xa2,0x34,0xc9,0x5e,0x0b,0xdb,0x6e,0x6e,0x92,0xa2,0x4f,0xf1,0x0a,0x59,0x6c,0x19,0x9c,0xd0,0xd8,0x3c,0x50,0x3b,0x41,0x27,0x20,0x8d,
- 0x04,0x20,0x1c,0xe0,0xbe,0xd4,0x48,0xe2,0x00,0xc5,0xf0,0x0d,0x65,0x08,0x59,0xc2,0x3f,0x09,0x4d,0x98,0x2c,0x14,0xc9,0x71,0xc8,0x8b,0x53,0x29,0xa8,0xb5,0x8c,0x7b,0x22,0xb0,0x20,0x8d,
- 0x04,0x20,0x23,0x33,0x80,0xcc,0x5a,0xeb,0x86,0x37,0x03,0x4f,0x8b,0x97,0xac,0xb5,0xf9,0xd0,0x2e,0xd8,0x9b,0xca,0xff,0xef,0x63,0x22,0x2c,0x3d,0x7e,0x83,0x39,0x14,0x10,0xc7,0x20,0x8d,
- 0x04,0x20,0x23,0x33,0x80,0xcc,0x5b,0x25,0x8f,0xfc,0xa0,0xef,0x50,0xeb,0x4b,0x2c,0xd7,0x89,0xf2,0x2b,0xe3,0x4f,0xe9,0x6a,0x93,0x19,0xff,0x69,0x92,0x1b,0x8b,0x13,0xbd,0x67,0x20,0x8d,
- 0x04,0x20,0x23,0x33,0x80,0xcc,0x5c,0xef,0x09,0x60,0xd5,0x10,0x6b,0x0d,0x33,0x5f,0x71,0x35,0x02,0xb9,0x19,0x4a,0xd6,0xe3,0xc7,0x34,0x27,0x40,0xc5,0x5d,0xfa,0xd1,0x23,0x28,0x20,0x8d,
- 0x04,0x20,0x23,0x33,0x80,0xcc,0x5d,0x0b,0x5e,0x1d,0x3b,0xc6,0x3f,0x78,0xe8,0x51,0x0e,0xbf,0x78,0xee,0x47,0xf8,0x6f,0x01,0xab,0x21,0x16,0xcc,0x52,0xe6,0xad,0xd4,0x02,0x02,0x20,0x8d,
- 0x04,0x20,0x2b,0xf3,0xe8,0xf5,0xef,0x90,0x14,0xab,0x61,0xe9,0x11,0x97,0x9f,0x18,0x4d,0xb4,0xff,0x89,0x94,0xf7,0x92,0x94,0x53,0xe6,0x9e,0xd4,0xdb,0x85,0x89,0x4d,0x3e,0xc9,0x20,0x8d,
- 0x04,0x20,0x38,0x1b,0x57,0x6c,0xf9,0x80,0x4e,0x28,0x33,0xb5,0x01,0xce,0x8e,0x83,0x62,0xcd,0xee,0x3b,0x0b,0xf5,0x9f,0x7c,0xfe,0x9a,0x3f,0x0a,0x0a,0x2a,0x91,0x60,0x85,0x23,0x20,0x8d,
- 0x04,0x20,0x3e,0x7e,0xe8,0x36,0x75,0x4f,0x00,0x38,0xda,0x70,0x03,0xde,0x23,0x02,0xe5,0x8a,0x02,0x6e,0xd3,0x91,0xa9,0x54,0xfb,0x2d,0xdb,0xbd,0x1f,0xd2,0x8a,0x98,0xae,0x16,0x20,0x8d,
- 0x04,0x20,0x44,0xf1,0x1b,0x9d,0x03,0xaa,0x5a,0x96,0x97,0xc8,0x66,0x71,0x48,0x41,0xaa,0x55,0xa2,0x81,0xa5,0xa4,0x0a,0x82,0xe5,0x5f,0x5d,0x93,0xb7,0x2a,0x43,0x65,0xc9,0x32,0x20,0x8d,
- 0x04,0x20,0x4c,0xdd,0xa4,0x94,0x32,0xb9,0xc3,0xec,0x54,0xe2,0x8c,0x52,0x31,0xc4,0xc1,0x02,0xa6,0x4f,0x4c,0xd2,0xc6,0xc5,0xbc,0xed,0xf1,0x94,0xbd,0xc3,0x34,0x66,0xab,0xab,0x20,0x8d,
- 0x04,0x20,0x57,0xda,0x1d,0xc7,0xe7,0xba,0x3a,0x4b,0xd6,0x3c,0xbb,0x2a,0xd4,0x2c,0xe5,0xb7,0x8e,0x44,0x7e,0x56,0xe4,0x6d,0x9d,0x4f,0xce,0x69,0xf8,0xfc,0x7a,0xc1,0x74,0x41,0x20,0x8d,
- 0x04,0x20,0x53,0xcd,0x56,0x48,0x48,0x8c,0x47,0x07,0x91,0x41,0x82,0x65,0x5b,0x76,0x64,0x03,0x4e,0x09,0xe6,0x6f,0x7e,0x8c,0xbf,0x10,0x84,0xe6,0x54,0xeb,0x56,0xc5,0xbd,0x88,0x20,0x8d,
- 0x04,0x20,0x5f,0xd5,0x6d,0xd5,0x32,0xe0,0x8b,0xd6,0x36,0x84,0x4a,0x4d,0x01,0x5e,0x36,0xf5,0xad,0x24,0xb0,0x01,0x5a,0xe1,0xb3,0xec,0x0c,0xc7,0x0b,0xd8,0x6f,0x63,0xf0,0x8c,0x20,0x8d,
- 0x04,0x20,0x67,0xc4,0x17,0xa5,0xcb,0x77,0xbd,0xaa,0x11,0x7f,0x8b,0xc0,0x81,0xf3,0xc0,0x96,0x9d,0x31,0x27,0x9c,0xad,0x6c,0x6d,0x98,0x42,0x70,0xdb,0x50,0x12,0x96,0x0b,0x36,0x20,0x8d,
- 0x04,0x20,0x63,0xac,0x1d,0x42,0xcf,0x49,0xa5,0xa0,0x7a,0x1b,0xc2,0x77,0x70,0x7d,0xb7,0x52,0xcb,0x29,0x51,0x7c,0xb7,0xf0,0xd7,0x37,0x18,0x15,0xb7,0x4c,0x39,0xe5,0xa6,0xef,0x20,0x8d,
- 0x04,0x20,0x65,0x98,0x55,0xd0,0x8a,0xe0,0x29,0xe6,0x5e,0xef,0xb7,0x8b,0x8f,0xc9,0x27,0x53,0x3d,0xd0,0x8c,0xa2,0xfa,0x32,0x2f,0xad,0xf9,0xdc,0xe2,0x4b,0x14,0x66,0x3e,0x23,0x20,0x8d,
- 0x04,0x20,0x89,0x60,0xc6,0xee,0x04,0xdf,0xa8,0x07,0xcd,0x57,0x38,0xea,0x8f,0xf1,0xfc,0x3e,0x23,0x93,0xa2,0x3e,0xa9,0xd9,0x90,0xe8,0xf0,0x8e,0x2e,0xe1,0xa0,0xdc,0x35,0x09,0x20,0x8d,
- 0x04,0x20,0x8c,0x8d,0x69,0xb5,0xd4,0x91,0x45,0xfc,0xe0,0xdc,0x84,0x99,0xb3,0x54,0x59,0x4d,0xfe,0x24,0x1c,0xfa,0x6a,0x70,0x90,0xa5,0x7b,0x85,0x44,0x9d,0xdc,0xdf,0xb3,0x2a,0x20,0x8d,
- 0x04,0x20,0x96,0x87,0xdd,0x04,0x33,0x9d,0x2c,0x25,0xed,0xe3,0x8d,0xb2,0x7b,0xbd,0x87,0x9d,0xdb,0xb4,0x9b,0x5b,0x38,0x2a,0x98,0x1b,0xa4,0xc1,0xac,0x79,0xa2,0xde,0x59,0xb0,0x20,0x8d,
- 0x04,0x20,0xa3,0xeb,0x33,0xe3,0xfc,0x39,0xaa,0x60,0xc1,0x1e,0xb6,0xf2,0x3d,0x31,0x62,0x3b,0x91,0xd9,0xd6,0xb6,0xf8,0x7a,0x77,0xb1,0x87,0x10,0xc6,0x3e,0x95,0xad,0xb4,0x51,0x20,0x8d,
- 0x04,0x20,0xb1,0xdd,0xb8,0x4b,0x84,0x82,0xe1,0x97,0x5c,0xf0,0x81,0x80,0xde,0x30,0xdd,0xe5,0x01,0xda,0x67,0x6c,0x57,0x16,0x9d,0xec,0x06,0xee,0xc8,0x8e,0x3a,0x35,0x6e,0x5b,0x20,0x8d,
- 0x04,0x20,0xb2,0x32,0x14,0x4f,0xbd,0xef,0x43,0x29,0x2e,0xd5,0xe0,0xa7,0x17,0x35,0xb2,0x32,0xbb,0x53,0xea,0xda,0x78,0xef,0xfa,0xfc,0x98,0xa2,0x2a,0xbc,0x51,0xd3,0x21,0x12,0x20,0x8d,
- 0x04,0x20,0xc4,0x58,0x41,0xc7,0x7d,0x9c,0xf9,0x68,0x15,0xb6,0x32,0x16,0xb9,0xdc,0xfd,0x0b,0x68,0xa2,0x51,0x57,0x4b,0xcc,0x6d,0xa7,0x2c,0x64,0xb0,0xb1,0xf5,0x66,0x93,0x7a,0x20,0x8d,
- 0x05,0x20,0xd7,0x7a,0x53,0x89,0xfe,0x02,0x6a,0x59,0xb7,0x0e,0xf8,0x6d,0x9d,0x81,0xbb,0x9f,0x01,0xc0,0xc4,0xee,0x7b,0x36,0x10,0x33,0x07,0xd2,0x29,0xd8,0xec,0xcd,0x8e,0xa3,0x00,0x00,
- 0x05,0x20,0xd7,0xf1,0x19,0x9e,0x7d,0x0f,0x43,0x97,0x33,0x56,0xe8,0x12,0x1d,0x7d,0xa0,0x4d,0x21,0x5a,0x60,0x73,0xc8,0x7e,0x10,0x55,0x60,0x56,0xbb,0x65,0x50,0xa4,0x17,0x59,0x00,0x00,
- 0x05,0x20,0xd9,0x9c,0x20,0xfe,0xc2,0xe6,0x6a,0x16,0x30,0x81,0x54,0xc9,0x3f,0x9a,0x89,0x10,0xa9,0x4b,0xf1,0x05,0x56,0xd5,0x04,0x2d,0xb7,0x6a,0x7b,0x67,0x8d,0xf0,0xbe,0x8f,0x00,0x00,
- 0x05,0x20,0xe1,0x44,0x2d,0x6e,0xd3,0xd9,0xf0,0x95,0x6c,0x52,0x2e,0x44,0x3c,0x27,0x3d,0x78,0xac,0x6e,0x8f,0x27,0x1c,0x0c,0xc0,0x78,0x22,0x3e,0xa1,0x84,0x01,0x42,0x08,0x5c,0x00,0x00,
- 0x05,0x20,0xe3,0xa5,0x88,0x11,0x4d,0x3d,0xfb,0x02,0xec,0x1f,0xda,0x48,0x86,0x12,0xf6,0x12,0xd9,0x3e,0x68,0x49,0xa7,0xae,0x37,0xfd,0x02,0x48,0x38,0x8b,0xdc,0xd4,0xa6,0x8f,0x00,0x00,
- 0x05,0x20,0xe5,0x19,0x24,0x71,0xab,0x61,0xb0,0xfe,0x44,0x4a,0x74,0x8d,0xca,0x90,0xc3,0xd6,0x24,0xb4,0xd5,0x03,0xe7,0xf3,0x4f,0xbe,0x12,0x72,0xd6,0xa0,0x4b,0x22,0x0b,0xe1,0x00,0x00,
- 0x05,0x20,0xf2,0x74,0x4c,0x90,0xc3,0xd9,0x34,0x4d,0x5f,0x6e,0xdb,0xdd,0x7d,0xef,0xa5,0xed,0x6e,0x59,0x9e,0x31,0x41,0x94,0x38,0x84,0xc5,0x08,0xd2,0x23,0xb3,0xa7,0xe0,0x2c,0x00,0x00,
- 0x05,0x20,0xf3,0x77,0xe5,0xa7,0x11,0xef,0x65,0x91,0x23,0xb8,0x32,0x06,0xcb,0xc0,0x91,0xf7,0x21,0x1d,0x70,0xbc,0x83,0x1b,0x86,0x34,0x35,0x31,0x0f,0x9f,0xc1,0x0d,0xbb,0x56,0x00,0x00,
- 0x05,0x20,0xfe,0xb0,0x99,0x79,0x95,0x58,0x71,0xb5,0x63,0xcc,0x33,0xeb,0x55,0x91,0x8c,0xb4,0x3a,0xf2,0x8b,0x2d,0x8e,0x47,0xbe,0x25,0x47,0x12,0xcd,0x14,0x48,0xf0,0x1d,0xea,0x00,0x00,
- 0x05,0x20,0x07,0x61,0x26,0xd7,0x6c,0x05,0xbf,0xf6,0x2d,0x8c,0xca,0xc4,0x65,0xd3,0xd3,0xb2,0x49,0xe9,0xcc,0x53,0x1e,0xca,0x77,0x84,0xb6,0x10,0x5e,0xc2,0x5a,0xfe,0x28,0xb3,0x00,0x00,
- 0x05,0x20,0x03,0xaa,0x47,0xe9,0xe2,0x77,0xeb,0xa5,0x72,0x27,0x23,0x8b,0x13,0x62,0x61,0x32,0xb5,0xb2,0x1b,0x5a,0x18,0xb2,0xf9,0x26,0x06,0x84,0xee,0x28,0x42,0xac,0xba,0xbc,0x00,0x00,
- 0x05,0x20,0x0a,0x26,0x27,0x23,0xdd,0xf3,0x56,0xbe,0x9e,0x9e,0xa7,0xc6,0x3c,0xc5,0x99,0xc4,0x87,0x3b,0x4d,0xb9,0x13,0x62,0x91,0xf2,0x25,0x1c,0x02,0x42,0x63,0xe3,0x63,0x7a,0x00,0x00,
- 0x05,0x20,0x0c,0x50,0x55,0x46,0x87,0x5a,0x8d,0x14,0xfb,0xa7,0x29,0x70,0x18,0xa6,0x29,0x80,0x8c,0x33,0x42,0x5a,0x8f,0xe4,0x84,0x64,0x3d,0x0e,0xb5,0xbd,0x36,0x34,0x42,0xb6,0x00,0x00,
- 0x05,0x20,0x17,0x0c,0x56,0xce,0x72,0xa5,0xa0,0xe6,0x23,0x06,0xa3,0xc7,0x08,0x43,0x18,0xee,0x3a,0x46,0x35,0x5d,0x17,0xf6,0x78,0x96,0xa0,0x9c,0x51,0xef,0xbe,0x23,0xfd,0x71,0x00,0x00,
- 0x05,0x20,0x18,0x31,0xb3,0x9a,0xf8,0x8c,0xec,0x99,0x2e,0x7d,0xe4,0x90,0xa2,0x54,0x27,0xbd,0xe5,0xc8,0x65,0xdf,0x1f,0xaa,0x8f,0xe9,0x0f,0x64,0x85,0x09,0xc3,0x70,0x62,0x13,0x00,0x00,
- 0x05,0x20,0x1d,0x3a,0xac,0x0e,0x8c,0x62,0x35,0xb0,0xa4,0xaf,0xf0,0x47,0xf7,0x5a,0x55,0x8a,0x12,0x69,0xff,0x27,0xad,0xd9,0x9e,0x9f,0xa5,0xec,0x9e,0x24,0x38,0x8e,0x24,0xed,0x00,0x00,
- 0x05,0x20,0x27,0x7a,0xaf,0x5a,0x9c,0xf4,0x72,0xfe,0x3c,0xdd,0x7a,0xba,0xd7,0x98,0x31,0xde,0x73,0xce,0x84,0x5b,0x41,0xe7,0x9a,0x6a,0xe2,0xc1,0x3b,0x5b,0x37,0x23,0xc7,0xdf,0x00,0x00,
- 0x05,0x20,0x20,0x90,0xe3,0xd3,0xad,0x87,0xeb,0x2a,0xd9,0x29,0x17,0x74,0x47,0xc9,0x54,0x57,0xfa,0x3d,0x71,0x02,0x11,0xb2,0xc3,0x87,0x31,0xb3,0x9b,0x6f,0x2e,0xfc,0x30,0xea,0x00,0x00,
- 0x05,0x20,0x22,0x56,0xd6,0x98,0x11,0x61,0xe1,0x5a,0x34,0x9f,0xe2,0x9d,0xf5,0x2b,0xbd,0xbc,0xcc,0x1c,0xf5,0x1d,0x68,0xa5,0xca,0xb1,0xb5,0x4b,0xf1,0xb5,0xff,0x1e,0xdd,0xc0,0x00,0x00,
- 0x05,0x20,0x29,0xf2,0xb7,0xee,0xf1,0x70,0x02,0xe3,0xb5,0x89,0x73,0x69,0xd4,0x40,0x19,0xb1,0xd6,0x10,0xd8,0xfd,0x13,0xe8,0x9a,0xdb,0x40,0xc8,0xa9,0xb9,0x46,0x03,0x11,0x12,0x00,0x00,
- 0x05,0x20,0x2d,0xfc,0xd7,0xed,0xc7,0x20,0x05,0x1d,0xcf,0xe6,0x5d,0x0b,0x38,0xc1,0xda,0x85,0xd6,0x30,0x84,0x13,0x35,0xb8,0x72,0x3d,0xff,0xa2,0xc3,0xc4,0xf6,0x38,0xef,0xc4,0x00,0x00,
- 0x05,0x20,0x31,0x0f,0x30,0x0b,0x9d,0x70,0x0c,0x7c,0xf7,0x98,0x7e,0x1c,0xf4,0x33,0xdc,0x64,0x17,0xf7,0x00,0x7a,0x0c,0x04,0xb5,0x83,0xfc,0x5f,0xa6,0x52,0x39,0x79,0x63,0x87,0x00,0x00,
- 0x05,0x20,0x39,0xca,0x8e,0x62,0x0a,0x36,0xa7,0x68,0x22,0xc4,0xcc,0x4a,0xa9,0x16,0x69,0x4b,0x8a,0x1c,0x5f,0x6e,0x4a,0x98,0xb6,0x95,0x82,0xb3,0x66,0x66,0xc5,0x29,0x3a,0xb0,0x00,0x00,
- 0x05,0x20,0x4e,0x77,0x2e,0x12,0x91,0x67,0x6b,0x94,0xc4,0x92,0x2f,0x19,0x67,0x7d,0xcd,0x47,0x02,0xad,0xf8,0x60,0x72,0xed,0x73,0xf1,0x10,0x99,0x2c,0x05,0x61,0x66,0x55,0xd9,0x00,0x00,
+ 0x02,0x10,0x2a,0x02,0xc2,0x07,0x30,0x06,0x31,0x85,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x07,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x10,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x11,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x16,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x1d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x20,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x22,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x23,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x9a,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0xcf,0xc0,0x80,0x00,0x00,0x2a,0x00,0x00,0x00,0x00,0x95,0x32,0x65,0x9d,0x20,0x8d,
+ 0x02,0x10,0x2a,0x03,0x0e,0xc0,0x00,0x00,0x09,0x28,0x00,0x00,0x00,0x00,0x07,0x01,0x07,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x04,0xee,0x41,0x00,0x86,0x50,0xb6,0xfa,0x75,0xa4,0xff,0xfe,0x3c,0x24,0x3f,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xd0,0x12,0x04,0x2a,0x57,0x03,0x4d,0xc5,0x81,0x16,0x78,0x7c,0xe0,0x16,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xd0,0x14,0x0a,0x55,0x40,0x01,0xf6,0xab,0xdd,0x5e,0x40,0x39,0xb4,0x6c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x05,0xd0,0x18,0x0a,0x75,0x6c,0x00,0xc0,0x5b,0x4d,0x0a,0x36,0x58,0x10,0x30,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0x9a,0x07,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x07,0xd8,0x84,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x0e,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0a,0xef,0x40,0x0e,0x44,0x9b,0x01,0x27,0x46,0xca,0x1e,0x67,0x88,0x35,0x1c,0x20,0x8d,
+ 0x02,0x10,0x2a,0x0b,0xf4,0xc0,0x00,0xc1,0x92,0x0e,0xb2,0x5a,0xda,0xff,0xfe,0x87,0x77,0xb4,0x20,0x8d,
+ 0x02,0x10,0x2a,0x10,0xc9,0x41,0x01,0x00,0x00,0x24,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0x8e,0x40,0x56,0x68,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x20,0x8d,
+ 0x02,0x10,0x2a,0x12,0xa3,0x02,0x00,0x01,0xa1,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0xb5,0xca,0x20,0x8d,
+ 0x02,0x10,0x2c,0x0f,0xf4,0xa8,0x00,0x0b,0xb1,0x08,0x80,0x7d,0xb2,0xd6,0x91,0x46,0x38,0xbe,0x20,0x8d,
+ 0x02,0x10,0x2c,0x0f,0xf4,0xa8,0x00,0x0b,0xb1,0x08,0xc4,0x58,0x5c,0x61,0xdc,0xca,0xcb,0x10,0x20,0x8d,
+ 0x05,0x20,0x46,0x3e,0x67,0x73,0x9d,0xe3,0xc3,0xc7,0xeb,0x2c,0x6a,0xad,0x13,0x49,0x1e,0xaf,0x9d,0x0a,0xf7,0x79,0xbb,0x58,0x05,0xe7,0xd1,0x69,0x52,0x46,0x5c,0xb3,0x03,0xca,0x00,0x00,
+ 0x05,0x20,0x4e,0xb5,0xd6,0xc5,0x8d,0x1d,0xaa,0x84,0x1d,0xe4,0xfa,0x03,0xe6,0x33,0xa7,0xfe,0xb6,0x23,0x7b,0x56,0x88,0x7f,0x56,0xd9,0xc5,0x73,0xeb,0xcf,0xea,0x84,0xde,0x6c,0x00,0x00,
+ 0x05,0x20,0x4e,0x99,0xdd,0x79,0x70,0x95,0x13,0x59,0xf8,0x3e,0xba,0xf8,0x87,0xe4,0x29,0x55,0x55,0x42,0x0a,0x38,0x26,0xea,0xa3,0x1a,0xce,0xf2,0x40,0x3a,0xe6,0x14,0xf9,0x7f,0x00,0x00,
+ 0x05,0x20,0x4e,0x9f,0x82,0x37,0x07,0x73,0xdf,0x24,0x92,0xe4,0x6e,0x5b,0x7a,0x9a,0x11,0x14,0xb8,0x1a,0x57,0x8d,0x94,0x85,0x37,0x58,0xcf,0x37,0x85,0x91,0xb9,0xdb,0x6e,0x11,0x00,0x00,
+ 0x05,0x20,0x4e,0xe9,0x2b,0xba,0xb7,0xfd,0x14,0xbf,0x73,0xb4,0xff,0xd3,0x41,0xe9,0x8f,0x64,0x55,0xf8,0xe0,0xfd,0xc0,0x2e,0xd7,0x7a,0x22,0x25,0x3f,0xf3,0xc1,0x77,0x55,0x26,0x00,0x00,
+ 0x05,0x20,0x4f,0x34,0x39,0x35,0x2b,0x37,0x2b,0x5d,0xee,0x72,0x39,0xa5,0xd4,0xe0,0xe0,0x67,0x9e,0xb2,0xee,0x54,0x4e,0xa4,0xdd,0x2b,0xc4,0xb7,0x26,0xc1,0x67,0x65,0x78,0x21,0x00,0x00,
+ 0x05,0x20,0x4f,0x26,0x98,0x96,0xed,0xb0,0x98,0x13,0xa9,0x17,0x64,0x16,0xd7,0x4c,0xc8,0x69,0xcb,0x73,0x14,0x75,0x48,0x0f,0x1f,0x61,0xbf,0x4f,0xe2,0xa0,0x8e,0x0d,0x31,0xf8,0x00,0x00,
+ 0x05,0x20,0x48,0x76,0x8a,0x23,0xe6,0x8b,0x56,0x91,0xa5,0x92,0xcf,0xe0,0x1a,0x4a,0x71,0x5f,0x6a,0xdd,0xa1,0xfb,0xa3,0xda,0xac,0x84,0x04,0x30,0x10,0xa5,0xc5,0x02,0xf8,0x8e,0x00,0x00,
+ 0x05,0x20,0x48,0x59,0x09,0x98,0xe7,0x07,0xcf,0x21,0x58,0x36,0x7a,0x3e,0xf9,0x68,0x6d,0x31,0xe1,0xa0,0xd6,0xe9,0x69,0x48,0x1e,0x99,0x6d,0x33,0x6a,0x64,0xb0,0x80,0x12,0x81,0x00,0x00,
+ 0x05,0x20,0x48,0xf9,0xb7,0x8b,0x4b,0xfe,0xc8,0xaf,0x1d,0x5a,0x9b,0xfc,0x74,0x60,0x03,0x07,0xc8,0x3f,0xd6,0x47,0x83,0xb4,0x5a,0xdc,0x26,0x06,0x86,0x0c,0x2c,0x46,0x39,0x71,0x00,0x00,
+ 0x05,0x20,0x48,0xfd,0xbb,0x1c,0x81,0x1f,0x71,0x45,0xcb,0xf1,0xdf,0x18,0x8d,0xad,0xad,0xa5,0x0f,0x0b,0xde,0x3c,0x5b,0x65,0xef,0xea,0x79,0x5a,0x23,0x4e,0x55,0x5f,0x3d,0xa3,0x00,0x00,
+ 0x05,0x20,0x49,0x3c,0x9a,0x79,0x07,0xc0,0x6e,0xce,0xd9,0x56,0xe8,0xc0,0x48,0x24,0x93,0xff,0x17,0x21,0x55,0x1c,0x5c,0xbb,0x66,0xf6,0xc5,0xfa,0x90,0x01,0x64,0xa6,0x30,0x0b,0x00,0x00,
+ 0x05,0x20,0x49,0x10,0x39,0x4d,0x76,0x1a,0xe7,0xed,0xad,0x34,0xf8,0x9a,0x9d,0x30,0xfc,0x2b,0x8b,0x89,0x25,0xa2,0xd5,0x85,0x54,0x2d,0xe7,0xc3,0x5f,0x11,0xfd,0x36,0xf7,0x18,0x00,0x00,
+ 0x05,0x20,0x49,0x1d,0x7e,0xb6,0x34,0xa3,0x9c,0xf2,0x0e,0x45,0x7d,0x1c,0x8f,0x2a,0xc4,0xb3,0x0e,0x10,0xc9,0xa7,0x2f,0xd4,0x80,0xea,0x1e,0x70,0x0b,0x51,0x1e,0xf5,0x63,0x5b,0x00,0x00,
+ 0x05,0x20,0x49,0x2f,0xbc,0x2a,0xda,0x6b,0x2d,0xf7,0x58,0xe6,0x0c,0xd0,0xee,0x95,0x75,0xfd,0x25,0xed,0x70,0x37,0xb3,0xf9,0xe6,0xc7,0xf1,0x3b,0x26,0x4a,0x26,0x2c,0x9d,0x6b,0x00,0x00,
+ 0x05,0x20,0x49,0x46,0x7f,0x75,0x1c,0x69,0xde,0x6e,0x38,0x2d,0x71,0x38,0x08,0x23,0x75,0xcd,0x42,0x8f,0x17,0x19,0x4a,0x74,0x42,0x7e,0x5b,0x83,0x34,0x60,0x89,0xab,0x5a,0xab,0x00,0x00,
+ 0x05,0x20,0x49,0xf5,0x0b,0xa9,0x30,0x69,0x93,0xa6,0x76,0x6d,0xd1,0x04,0x04,0x0c,0xb0,0x00,0xb8,0x0b,0x19,0xac,0x51,0xa4,0x04,0xb6,0x6e,0x84,0xbb,0x08,0x61,0x33,0x7f,0x71,0x00,0x00,
+ 0x05,0x20,0x49,0xfe,0x4a,0xf0,0x1d,0xc9,0x72,0xc2,0x60,0x8a,0x43,0x4f,0x30,0xc0,0xa8,0xf0,0xbf,0x73,0xd4,0x5c,0x64,0x86,0xfc,0x23,0xdf,0x4e,0xe5,0x75,0xfa,0x3c,0xe5,0x15,0x00,0x00,
+ 0x05,0x20,0x4a,0x02,0x0b,0x7f,0x0d,0x0b,0x6f,0x42,0x42,0x58,0xfa,0xbe,0x9c,0x55,0xc9,0xf2,0xc7,0x90,0xd0,0x4a,0x7b,0xcb,0x7e,0xd9,0xd9,0x9f,0xd8,0x59,0xa0,0xf8,0xed,0x45,0x00,0x00,
+ 0x05,0x20,0x4a,0x04,0x2e,0xaa,0xd8,0xe4,0xeb,0xc4,0xe9,0xad,0xf1,0x8a,0x14,0x4b,0xe4,0xf0,0xef,0x8d,0x28,0x75,0x24,0xf7,0x97,0xdc,0x61,0xc3,0xff,0xc3,0xf4,0xcf,0x6d,0xe9,0x00,0x00,
+ 0x05,0x20,0x4a,0x18,0x3c,0x0c,0x59,0x9f,0x89,0xa5,0x88,0x84,0xcb,0x9e,0xd5,0xf0,0xa6,0xcf,0xe1,0xa4,0x92,0x10,0x3a,0xe0,0x0b,0xc4,0xc4,0x6e,0xf6,0xea,0x5d,0x5d,0xfd,0xd1,0x00,0x00,
+ 0x05,0x20,0x4a,0x40,0xd3,0x2f,0xc7,0xe3,0xf1,0xa7,0x8f,0x46,0xb0,0x18,0x78,0x2e,0x58,0x66,0x28,0xe1,0x31,0xe8,0x73,0x48,0x86,0xe4,0xbd,0x08,0x7b,0x0a,0xd4,0x69,0xce,0x60,0x00,0x00,
+ 0x05,0x20,0x4a,0xbb,0xec,0xec,0xa4,0x0b,0xc4,0xef,0x44,0x2a,0x7e,0x73,0x5d,0xa6,0x59,0x2f,0x1f,0x7e,0xd3,0x33,0x63,0xaf,0x95,0x3e,0x52,0xfb,0x2e,0xdc,0xc1,0x6f,0x90,0xd6,0x00,0x00,
+ 0x05,0x20,0x4a,0x8b,0x40,0x25,0xdc,0x06,0x2a,0xed,0x44,0x35,0xec,0x06,0x9e,0x73,0x70,0xf0,0x07,0x06,0x35,0xd1,0x60,0x4f,0x22,0xe8,0xbf,0x8a,0xdf,0xd9,0xeb,0x97,0x73,0x06,0x00,0x00,
+ 0x05,0x20,0x4a,0xaa,0x4c,0x6a,0xa5,0x1c,0xdd,0xaa,0x0a,0x83,0x47,0x12,0xb3,0x48,0x2f,0x62,0xd7,0x2d,0xd2,0xcc,0x5a,0x92,0xe6,0x94,0xea,0xee,0x18,0x86,0xaa,0xd9,0xb2,0x35,0x00,0x00,
+ 0x05,0x20,0x4a,0xf9,0x58,0xf5,0x40,0x17,0xda,0x9c,0x2e,0x68,0xab,0x7f,0x49,0xf4,0x05,0xc4,0x3a,0x87,0xe4,0x5d,0xb3,0xae,0xbe,0x77,0x5b,0x23,0x1c,0x3b,0xa2,0xe2,0x46,0xf3,0x00,0x00,
+ 0x05,0x20,0x4b,0x08,0x12,0xae,0x87,0x8a,0xfc,0x01,0xf5,0xf3,0xe2,0x1e,0x4a,0x97,0x66,0xd8,0x39,0x38,0x8a,0x9f,0x05,0xc0,0xb7,0xd0,0x2f,0x52,0x23,0xec,0xae,0xce,0xab,0x3b,0x00,0x00,
+ 0x05,0x20,0x4b,0x47,0x1e,0xa3,0x90,0x3d,0xe5,0xe0,0x03,0x41,0x85,0x68,0x58,0x9a,0x73,0x87,0x88,0xd0,0x57,0x06,0x3a,0x3b,0xc1,0xc0,0xb4,0x55,0x35,0x06,0xca,0x63,0x80,0x3a,0x00,0x00,
+ 0x05,0x20,0x4b,0x9e,0x8b,0x6a,0x74,0x7f,0x4f,0xdb,0x9f,0x47,0xb1,0x0b,0xc7,0x15,0x66,0x92,0x81,0x60,0xbc,0xac,0x95,0xa8,0x1d,0x21,0xd2,0x64,0x1c,0x22,0x25,0x09,0x1f,0x0a,0x00,0x00,
+ 0x05,0x20,0x4c,0x49,0x19,0xed,0xda,0x89,0xc2,0xa7,0xc2,0x98,0x0d,0x8d,0xf9,0xc3,0x81,0x1d,0x57,0x72,0x1f,0xcb,0x6a,0xc5,0x1e,0x8c,0x64,0xba,0xa8,0x6a,0x55,0x1a,0x5e,0x9f,0x00,0x00,
+ 0x05,0x20,0x4c,0x5c,0x1a,0x10,0x46,0x65,0x29,0x06,0x3c,0x72,0x0d,0xec,0x18,0x11,0x63,0x9e,0xbf,0xbe,0x88,0xc2,0x23,0x1a,0x67,0x02,0x4d,0x08,0x54,0x3c,0xea,0x85,0x1a,0xd9,0x00,0x00,
+ 0x05,0x20,0x4c,0x6a,0x6d,0x6a,0xf5,0x0b,0x13,0x88,0xaa,0x06,0xfb,0x23,0xed,0x6b,0x27,0x68,0xc1,0xb4,0x26,0x74,0x07,0xba,0x28,0x34,0xd6,0x8d,0x48,0xdf,0xc8,0xbd,0xc8,0xff,0x00,0x00,
+ 0x05,0x20,0x4c,0x8d,0xc1,0xca,0xf5,0x32,0x45,0x0c,0xec,0x5a,0x81,0xa7,0x64,0x71,0x0f,0xda,0xf8,0xde,0x1d,0x77,0x70,0xc3,0x53,0x51,0x56,0x02,0x1f,0x81,0x59,0xda,0xf6,0x68,0x00,0x00,
+ 0x05,0x20,0x4c,0xf7,0xda,0x58,0x2b,0xed,0xaf,0xf7,0xb9,0xb8,0xbb,0x98,0xa9,0x45,0x29,0x97,0xf3,0x8e,0xe3,0x0c,0xac,0xe8,0x3d,0xb5,0x8e,0x34,0xfe,0x24,0x7e,0xf7,0x5b,0x35,0x00,0x00,
+ 0x05,0x20,0x4d,0x40,0xe3,0xef,0x62,0x78,0xb2,0xff,0x6b,0xcb,0x1d,0xa3,0xc0,0x64,0xfc,0x38,0x7a,0x24,0xb2,0xeb,0x0e,0x76,0x38,0x6c,0x57,0x44,0x86,0xbc,0xb7,0xf9,0xd7,0x49,0x00,0x00,
+ 0x05,0x20,0x4d,0x56,0x9f,0xc3,0x17,0x13,0x1c,0xb2,0xff,0xd6,0x69,0x31,0x56,0x0e,0xf1,0x7a,0x09,0x99,0x5d,0x48,0x43,0x00,0xfb,0x5c,0x23,0x0a,0x2d,0xa7,0x9e,0xab,0xc2,0x42,0x00,0x00,
+ 0x05,0x20,0x4d,0xa0,0xba,0xc1,0x85,0xab,0x86,0xd8,0xc9,0x63,0x26,0x90,0x38,0x4f,0x5d,0x85,0xd1,0x8a,0x9a,0x03,0x5c,0x75,0x0e,0x51,0xc3,0xec,0xbc,0xb5,0x31,0x64,0x63,0xf0,0x00,0x00,
+ 0x05,0x20,0x4d,0xd2,0x2f,0xb8,0x9a,0xe5,0x6e,0x32,0x3d,0x45,0xaa,0xf7,0xee,0xc0,0xb6,0x8d,0xc4,0x01,0xe8,0xbb,0x4f,0x36,0x56,0x96,0x82,0x3c,0xeb,0x08,0x2a,0x03,0xd4,0x73,0x00,0x00,
+ 0x05,0x20,0x57,0x18,0x23,0xf7,0x6c,0xfe,0xb3,0x5f,0xa4,0x63,0x06,0xde,0xe0,0x6b,0x2d,0xf8,0x51,0xb4,0x80,0x50,0xb1,0x43,0xce,0xbc,0x84,0x02,0xee,0x13,0xe2,0x43,0x76,0x45,0x00,0x00,
+ 0x05,0x20,0x57,0x1e,0x99,0xf9,0x9a,0xe8,0xc5,0x76,0xbb,0x74,0x19,0x15,0xe8,0x82,0x4e,0x76,0x7b,0x99,0xc1,0xb8,0xb0,0x36,0x5d,0x3a,0xcf,0xa8,0x93,0x9a,0xa2,0x46,0xfb,0x4c,0x00,0x00,
+ 0x05,0x20,0x57,0x41,0x19,0x7c,0xf2,0x89,0x68,0x10,0x0e,0x2e,0x27,0x4f,0xf7,0x61,0xe9,0x6c,0x2c,0x8f,0x57,0x55,0xbd,0xf1,0xe8,0xb1,0xb2,0xfe,0x68,0x12,0xfb,0xc0,0x45,0x43,0x00,0x00,
+ 0x05,0x20,0x57,0x88,0x49,0x1e,0x4a,0xe5,0x4b,0xbe,0x07,0xa6,0x2b,0x62,0x0c,0xf1,0xfd,0x80,0x7d,0x21,0x57,0x8a,0xb7,0x88,0x85,0xcc,0x81,0x22,0xfa,0x4b,0xdb,0xca,0x23,0xdf,0x00,0x00,
+ 0x05,0x20,0x57,0x8d,0x3f,0x72,0xe1,0xc7,0x50,0x66,0x2d,0xbd,0x39,0x45,0x4c,0xc9,0xf3,0xd4,0xda,0x34,0x33,0x31,0x1d,0x53,0xee,0xe1,0xdf,0xf1,0xf5,0xa3,0x77,0x07,0x5d,0x52,0x00,0x00,
+ 0x05,0x20,0x57,0xd4,0x26,0xc6,0x04,0xde,0x03,0x0a,0x6a,0xdb,0x28,0x16,0x8f,0xe4,0x97,0x9f,0x9a,0x0f,0xbb,0xae,0xf7,0x63,0x7f,0x17,0xae,0x86,0x41,0xa5,0xb9,0xb2,0x8e,0x3c,0x00,0x00,
+ 0x05,0x20,0x50,0x41,0x61,0x20,0x98,0x22,0xed,0x64,0x4e,0x29,0x75,0xbb,0xbf,0xe5,0xec,0x1a,0x9a,0x2b,0x22,0x1c,0xd4,0x4e,0x93,0x03,0x16,0xeb,0xbf,0x4e,0xfb,0x4c,0x56,0xb6,0x00,0x00,
+ 0x05,0x20,0x50,0xa0,0xa7,0x4c,0xef,0x59,0x18,0x05,0x21,0xe5,0x79,0x00,0x9b,0xb2,0x9c,0xbc,0xa5,0x97,0x82,0xef,0x7c,0x4d,0x3a,0x57,0xb3,0x31,0x46,0x08,0x11,0x26,0xd4,0xa1,0x00,0x00,
+ 0x05,0x20,0x50,0xe2,0x20,0xc7,0xd6,0x36,0x82,0x9f,0x39,0x0f,0x90,0x49,0x0c,0x78,0x2f,0xdd,0x7e,0x38,0x3e,0x67,0xf0,0x8e,0x4a,0xa3,0x12,0x65,0x5d,0xc0,0x8e,0x60,0xf9,0x46,0x00,0x00,
+ 0x05,0x20,0x51,0x0e,0xe9,0x30,0xca,0xff,0x8b,0x76,0xa7,0x16,0x82,0x53,0xe6,0xc2,0x5c,0x71,0xcd,0xc3,0xca,0x93,0x5a,0x47,0x94,0xbb,0x92,0x95,0x8f,0x75,0xa7,0xab,0xec,0xc4,0x00,0x00,
+ 0x05,0x20,0x51,0xef,0x1a,0x38,0x0e,0x67,0xd3,0x47,0x09,0x4a,0x76,0xa6,0x1b,0xc1,0xdb,0x0b,0x62,0x96,0x3a,0x09,0x38,0xdc,0x01,0xe3,0x78,0xc4,0x79,0x00,0x0b,0x3c,0x93,0x99,0x00,0x00,
+ 0x05,0x20,0x52,0x40,0x0d,0xe5,0x6f,0xe4,0x90,0xf2,0xdd,0x0a,0x51,0x26,0x6a,0xae,0xfc,0x75,0xe1,0xd7,0x2b,0xbf,0x41,0x6e,0x46,0x85,0x04,0xb3,0x25,0x12,0x5b,0xcb,0x15,0xbf,0x00,0x00,
+ 0x05,0x20,0x52,0x6b,0x1c,0x98,0x4a,0x04,0x83,0xdf,0xe2,0x07,0x5d,0x2a,0x90,0xae,0xfa,0x69,0xaf,0x29,0xd1,0x85,0x37,0xa9,0x42,0xe7,0xac,0x17,0xf3,0x82,0x4d,0x49,0x5c,0x7e,0x00,0x00,
+ 0x05,0x20,0x52,0x90,0x79,0x1f,0x45,0x05,0xb4,0x6b,0xa1,0x7e,0x44,0xf8,0x65,0xb9,0x7c,0xa6,0xfe,0x21,0x46,0x94,0xcc,0xa9,0x2c,0x21,0x50,0xa6,0x58,0xa2,0x95,0x3b,0xb3,0x7d,0x00,0x00,
+ 0x05,0x20,0x53,0x36,0x1e,0xa7,0xc2,0x84,0x45,0x02,0x58,0x6f,0xa5,0x48,0x80,0xbe,0x76,0xe9,0x8d,0x4b,0x2a,0x76,0x03,0x77,0xe4,0xad,0xd6,0xe5,0xf0,0xa7,0x9b,0x43,0x34,0x7c,0x00,0x00,
+ 0x05,0x20,0x53,0xde,0x27,0x47,0xbc,0x52,0x8c,0x4f,0x08,0xd0,0xe7,0xdb,0x92,0x55,0x65,0x89,0xc3,0x74,0x34,0xc2,0x49,0x58,0xad,0x11,0x8a,0x88,0xc0,0x44,0xbd,0x17,0x54,0x07,0x00,0x00,
+ 0x05,0x20,0x54,0x94,0x81,0xae,0x6c,0x0a,0x0c,0xfd,0x12,0x6f,0xe3,0xc6,0xbf,0x7d,0x44,0xd4,0x32,0x94,0xdb,0xde,0xb4,0x00,0x88,0xe6,0x3c,0xb3,0x74,0x07,0xc3,0x8e,0xf8,0x54,0x00,0x00,
+ 0x05,0x20,0x54,0xaf,0x74,0x35,0x24,0xdf,0x7f,0x91,0x4d,0x4e,0x0d,0x9b,0x79,0x63,0x9c,0x18,0xd1,0x58,0x7f,0x0f,0xd3,0x76,0xde,0x99,0xcf,0x57,0x1c,0xa4,0x47,0x55,0x31,0xc0,0x00,0x00,
+ 0x05,0x20,0x54,0xe8,0x0d,0xa7,0x9b,0x42,0x6e,0x73,0x9c,0xa4,0x5a,0x64,0xfd,0xe9,0x43,0x45,0x10,0x2e,0xb5,0x6d,0x2b,0x55,0x7d,0x90,0x0b,0xc7,0xdc,0x9a,0x83,0x95,0xb2,0x9d,0x00,0x00,
+ 0x05,0x20,0x55,0x33,0x4f,0xec,0xd9,0xaa,0xda,0xe3,0x70,0x43,0x98,0xd5,0xf2,0x0c,0x34,0x95,0xe3,0xc7,0xa0,0xca,0x6d,0x6c,0x6d,0x05,0x2e,0xf2,0xf9,0xea,0x1a,0x46,0x64,0x67,0x00,0x00,
+ 0x05,0x20,0x55,0xb7,0x5f,0x1a,0x1d,0x91,0x18,0x69,0xf0,0xc6,0xf2,0x27,0x46,0x6e,0x13,0x06,0x16,0x06,0xe1,0xc5,0xfd,0x9b,0xe0,0xb4,0x2d,0x30,0xc8,0x1c,0x72,0xe8,0xbd,0x1c,0x00,0x00,
+ 0x05,0x20,0x5e,0xfd,0xc6,0xd0,0x76,0x72,0x7d,0xb2,0x93,0xad,0x92,0x58,0xd4,0x22,0x8d,0xf6,0xc9,0xbc,0x08,0x70,0x8a,0x70,0xa6,0x84,0xa8,0xbd,0xe7,0x12,0x76,0x4f,0xbf,0xcc,0x00,0x00,
+ 0x05,0x20,0x5e,0xc0,0x23,0xf6,0xc1,0x1d,0xf6,0xde,0xb6,0x1d,0xdc,0xab,0xe9,0x80,0xc8,0x4c,0x43,0x22,0x6d,0xb6,0x06,0x8c,0xa8,0x67,0xae,0x4f,0xc0,0x82,0xe0,0x08,0xcb,0xc5,0x00,0x00,
+ 0x05,0x20,0x5f,0x4a,0x89,0x83,0x91,0xfb,0x50,0x88,0xec,0xf7,0x65,0x3e,0xcc,0x8a,0xd1,0x41,0xae,0x86,0xaa,0x2d,0xe3,0xa0,0x42,0x30,0x23,0x51,0x80,0xef,0xab,0x58,0xcc,0xce,0x00,0x00,
+ 0x05,0x20,0x5f,0x5c,0x15,0x2b,0xf9,0xcb,0x9f,0xb6,0xe6,0x6d,0x9f,0x90,0x9a,0x1b,0x3c,0x72,0xa1,0x2c,0x1c,0xe1,0xeb,0xbc,0x65,0x06,0x0e,0x9c,0xcd,0x0c,0xe7,0x22,0x35,0x56,0x00,0x00,
+ 0x05,0x20,0x58,0x11,0xbe,0xef,0x99,0xf6,0x65,0xa9,0xd1,0x59,0x45,0xc6,0x03,0x44,0x48,0x26,0x68,0xcd,0x05,0x58,0xa0,0x24,0xad,0x4a,0x37,0x4c,0x5b,0xef,0xe2,0x9c,0x17,0x7e,0x00,0x00,
+ 0x05,0x20,0x58,0x50,0x5d,0xb0,0xc6,0xd0,0x74,0x88,0xf4,0x6a,0xcf,0xe9,0xe4,0x02,0x63,0x8d,0x11,0xa3,0xe8,0x1e,0xe5,0x56,0xc2,0x94,0x45,0x34,0x1a,0xf4,0xd2,0xb6,0xc8,0x2e,0x00,0x00,
+ 0x05,0x20,0x59,0x29,0xbf,0x85,0xf3,0xa5,0x29,0xdd,0xff,0xec,0x47,0xc4,0x1e,0xcf,0x55,0x95,0x38,0x72,0x48,0x2b,0xc5,0xd7,0xdc,0xbe,0x6d,0x6a,0xb9,0x57,0x0c,0xee,0xad,0x88,0x00,0x00,
+ 0x05,0x20,0x59,0x69,0x5c,0xe7,0x22,0x25,0x10,0xae,0xd3,0xaf,0x68,0xf4,0x8f,0x7c,0x0c,0x21,0x88,0xbe,0xd0,0x1a,0x8c,0x5a,0xd1,0x5d,0x58,0xc0,0xbe,0x13,0xcc,0x90,0xfe,0xc0,0x00,0x00,
+ 0x05,0x20,0x59,0x9e,0xe4,0xbd,0xc8,0xbf,0xf2,0x3f,0x0c,0xef,0x77,0x4e,0x38,0xb6,0xcc,0xe5,0x09,0x84,0xd5,0x1f,0x98,0x5d,0x3e,0x42,0x50,0xc0,0x55,0xba,0x3e,0x8e,0x13,0x5e,0x00,0x00,
+ 0x05,0x20,0x59,0xff,0x04,0xb9,0x81,0x13,0x10,0x45,0x56,0xbe,0x6a,0x33,0xd2,0x15,0x71,0xef,0x44,0xd1,0xed,0xd7,0xbf,0xdb,0x4a,0x4b,0xd5,0x61,0x0f,0x02,0xb8,0x71,0xf7,0xf2,0x00,0x00,
+ 0x05,0x20,0x59,0xe8,0xfa,0x6d,0xd6,0x3d,0x05,0xf8,0x5a,0xb8,0x28,0x32,0x65,0x04,0x4c,0x8f,0xe4,0x97,0xf6,0x10,0xbb,0xe5,0xfd,0xea,0xb8,0xee,0xab,0xef,0x96,0x4d,0xe9,0xa9,0x00,0x00,
+ 0x05,0x20,0x5a,0x39,0x5a,0x3a,0xa0,0x2d,0xd3,0x12,0xf7,0x8a,0xa9,0x4d,0xb6,0x26,0x26,0xd3,0x08,0x19,0x78,0x83,0x7a,0xfb,0x88,0xc7,0x43,0x71,0xc6,0x3a,0x99,0x97,0x4e,0x2b,0x00,0x00,
0x05,0x20,0x5a,0x29,0xfe,0x8a,0xaa,0x9d,0x78,0x81,0x04,0x53,0x37,0xf5,0x6f,0xb6,0xe1,0x57,0x08,0x80,0xcf,0xf6,0x03,0x11,0x92,0x8d,0x08,0xe3,0x99,0x9f,0x98,0x4a,0x27,0x6b,0x00,0x00,
+ 0x05,0x20,0x5b,0x16,0x5d,0xe1,0x38,0x37,0x06,0x98,0x87,0xf6,0x9e,0x59,0x10,0xf0,0xa1,0x53,0xa3,0x00,0x83,0xea,0xe2,0xea,0xaf,0x82,0xfc,0x73,0x01,0x8e,0x30,0x38,0x9d,0x1e,0x00,0x00,
+ 0x05,0x20,0x5b,0xc0,0xbf,0x7e,0xc7,0x8b,0x90,0xfd,0x8b,0x58,0x4f,0x0b,0x70,0x83,0x09,0xe7,0x87,0xb9,0xc7,0xae,0x96,0x20,0xe3,0x78,0x8b,0xeb,0x7c,0x29,0xaa,0x63,0x68,0x15,0x00,0x00,
+ 0x05,0x20,0x5b,0xc8,0xa9,0xb9,0xb1,0xd5,0x30,0x87,0x1e,0x99,0x46,0xfb,0x23,0xcd,0x3b,0x70,0x01,0xff,0xc5,0x4b,0x64,0x24,0x8a,0xd3,0x03,0xba,0x85,0x75,0x10,0x1a,0x1d,0xa9,0x00,0x00,
+ 0x05,0x20,0x5b,0xca,0x5c,0x11,0x32,0x55,0xac,0x07,0xe8,0xce,0xfb,0x98,0xc6,0x47,0x04,0xbe,0x81,0x49,0xad,0x4c,0x13,0x5a,0xf5,0x6a,0x6c,0xf0,0x11,0x3b,0x88,0x0b,0xb4,0x4e,0x00,0x00,
+ 0x05,0x20,0x5b,0xe0,0xa3,0x04,0x8a,0xd8,0x91,0xbb,0x72,0x0e,0x0b,0xc9,0x02,0x3d,0x2e,0x8e,0xc3,0x45,0x67,0xbd,0xec,0x72,0xb6,0x18,0xe2,0x57,0x1d,0xfb,0x58,0x3f,0x02,0x72,0x00,0x00,
+ 0x05,0x20,0x5b,0xe2,0x66,0x28,0x5c,0xec,0xc9,0xf9,0x2a,0xff,0x89,0x4a,0xfc,0xff,0x42,0x07,0x45,0xbc,0x8c,0xdb,0x98,0x02,0x85,0x48,0x61,0x70,0x1d,0xdb,0x72,0xc2,0x25,0x3a,0x00,0x00,
+ 0x05,0x20,0x5c,0x1b,0xbd,0x28,0xc8,0x17,0x04,0x86,0x8b,0x10,0x5e,0x02,0xfb,0x07,0x16,0x14,0x5d,0x61,0x5d,0x92,0x11,0x44,0xce,0x32,0x13,0xe1,0x4c,0xfd,0x72,0x12,0xde,0x37,0x00,0x00,
0x05,0x20,0x5c,0x40,0x7f,0x80,0x43,0x91,0x9c,0xfc,0x04,0xdc,0xdc,0x8e,0x01,0xda,0xc8,0xaf,0x90,0x62,0x64,0x16,0xf7,0x11,0xe4,0x87,0xac,0xa4,0x06,0x6f,0x8d,0x87,0x4e,0xd6,0x00,0x00,
+ 0x05,0x20,0x5c,0xbb,0xa4,0xff,0x86,0xb4,0xe5,0x18,0x1d,0x66,0x80,0x80,0x8d,0x09,0x2b,0xd4,0x44,0x8a,0x95,0x01,0xfa,0x72,0xea,0x8b,0x9c,0xef,0x0f,0xe9,0xc3,0x68,0xf2,0xbf,0x00,0x00,
+ 0x05,0x20,0x5c,0xba,0xe9,0xbf,0xac,0xc0,0x59,0x78,0x48,0x04,0x02,0x07,0xfb,0x2d,0xd1,0x46,0xa8,0xa4,0x10,0x87,0x8f,0xb9,0xc0,0x0d,0x25,0xb0,0xef,0x4b,0xfd,0x37,0x5d,0x4c,0x00,0x00,
+ 0x05,0x20,0x5c,0xe6,0x36,0x85,0x74,0xae,0x03,0x90,0xa6,0x1d,0xd4,0xfb,0x50,0x8d,0x4a,0xdb,0xeb,0x91,0x7b,0x38,0x46,0x9c,0x94,0x7f,0x09,0x1b,0xc4,0x69,0x9b,0x3f,0xde,0x83,0x00,0x00,
+ 0x05,0x20,0x5d,0x1a,0xab,0x05,0x64,0xb2,0xe7,0x58,0x72,0x4f,0x9f,0xd3,0xda,0x69,0xa5,0x7c,0x30,0xd1,0xd4,0xc4,0x7a,0xfe,0x41,0xa9,0x11,0xa6,0xf5,0xa6,0x32,0x6f,0xc6,0x97,0x00,0x00,
+ 0x05,0x20,0x5d,0x46,0x18,0x02,0xa6,0x1b,0x99,0xd3,0xf4,0x64,0x6d,0x94,0xc1,0xda,0x4b,0x2e,0x6e,0x25,0x17,0xc4,0x18,0xec,0x55,0x91,0x61,0x71,0xbf,0x33,0x3b,0x4c,0xfd,0x24,0x00,0x00,
+ 0x05,0x20,0x5d,0x93,0x10,0x3d,0x45,0x25,0xd3,0x84,0xc0,0xba,0x8c,0x47,0x1e,0x18,0xe7,0xbb,0x17,0x1d,0xa4,0x78,0x34,0x9c,0xd2,0x4c,0xd3,0x39,0x0c,0xba,0xb2,0x34,0xed,0xfd,0x00,0x00,
+ 0x05,0x20,0x5e,0x0d,0xaf,0x49,0x2a,0x15,0xfa,0x82,0x0f,0xa0,0xe0,0x3e,0x91,0xdd,0x85,0x23,0xd6,0x51,0x36,0x97,0xd9,0x69,0x7e,0xc6,0x57,0xca,0x99,0xd6,0x18,0x21,0x92,0xd7,0x00,0x00,
+ 0x05,0x20,0x5e,0x20,0xcc,0x1a,0x22,0xf1,0xa8,0x9b,0x83,0x97,0x5b,0x6d,0x05,0x53,0x75,0x99,0x54,0x18,0xcb,0x23,0x42,0x23,0x20,0x19,0xbe,0xb8,0xf5,0x8b,0x71,0x55,0x70,0xe3,0x00,0x00,
0x05,0x20,0x5e,0x69,0x4f,0x31,0x33,0xa7,0xea,0x3e,0xf4,0x7a,0x0a,0x1e,0x74,0x09,0x07,0xa1,0x50,0xf7,0x03,0xf5,0xc6,0x19,0xeb,0x95,0xaa,0x63,0x17,0x10,0x6e,0x68,0xca,0x10,0x00,0x00,
+ 0x05,0x20,0x66,0x95,0xf0,0x25,0x09,0xd5,0xaa,0x62,0xbe,0x41,0x36,0xf5,0x9a,0x3a,0x21,0x92,0x67,0xfd,0x23,0x04,0xdb,0xb3,0x9f,0x0c,0x38,0xbc,0xd3,0xdf,0x96,0xff,0xbc,0xa1,0x00,0x00,
+ 0x05,0x20,0x66,0xce,0xb6,0x27,0x46,0xce,0x84,0xee,0x9a,0x9c,0x94,0xb7,0x64,0xf0,0x3f,0x20,0x48,0x6d,0x5c,0x2a,0x8c,0x7d,0xd7,0x1a,0xf5,0x3b,0x7f,0xea,0x5d,0xa0,0xec,0x18,0x00,0x00,
+ 0x05,0x20,0x67,0x1d,0xa5,0x34,0x71,0xff,0x44,0xbb,0x91,0x96,0x0c,0x3a,0xcf,0x55,0xae,0x57,0xc8,0x88,0x48,0xe5,0xe6,0xac,0x94,0xd4,0x06,0xf8,0xe7,0x6b,0xcc,0x05,0xb9,0xe2,0x00,0x00,
0x05,0x20,0x67,0x82,0xfc,0x36,0xea,0xae,0x95,0x3b,0x5d,0x46,0xf3,0xf4,0x6c,0x50,0x69,0x29,0xc7,0x47,0x87,0xca,0xa6,0x40,0x12,0x40,0x6d,0x12,0x94,0x35,0x17,0x8a,0xba,0x56,0x00,0x00,
- 0x05,0x20,0x67,0xab,0xce,0xf2,0xe3,0xf3,0xf6,0x19,0xf6,0x56,0xa2,0x4c,0xca,0x91,0x4b,0x93,0xfe,0xbc,0x85,0x50,0x5c,0x20,0x51,0x69,0xfb,0xf0,0x92,0xbb,0x57,0xa3,0x0d,0x05,0x00,0x00,
- 0x05,0x20,0x62,0xcc,0x44,0x66,0x31,0x76,0x1b,0x43,0xbe,0xe1,0xc9,0x1d,0x20,0x26,0x7d,0xa7,0x06,0x31,0x57,0x0d,0xb9,0x58,0x20,0xb3,0xca,0xb2,0x5e,0x0a,0x15,0x0b,0xba,0x0d,0x00,0x00,
+ 0x05,0x20,0x61,0x3d,0x7d,0x3f,0x8c,0xf2,0x6d,0xb1,0x5d,0x1a,0xba,0xf8,0x0d,0xfe,0x9c,0x74,0x72,0xca,0xee,0xe3,0x73,0xe3,0xd9,0xea,0xa6,0xb2,0x58,0x0a,0x22,0x90,0x8b,0x33,0x00,0x00,
+ 0x05,0x20,0x61,0x7d,0x36,0x2c,0x86,0x7f,0xe8,0x60,0x7b,0xc2,0x18,0x08,0xbe,0xef,0xfe,0xa0,0x33,0xc8,0x0f,0x76,0x00,0xa8,0x7e,0x73,0x15,0x23,0xc1,0xb5,0x06,0x9c,0x2a,0xb6,0x00,0x00,
+ 0x05,0x20,0x61,0xcd,0x72,0x0b,0xbf,0x97,0x8f,0xf2,0x22,0xe6,0x23,0x24,0x63,0xac,0x54,0x3b,0x0c,0x7f,0xb3,0xef,0xfb,0xcf,0x01,0xf5,0x59,0x63,0x39,0x67,0x56,0x2f,0xd3,0xe1,0x00,0x00,
+ 0x05,0x20,0x62,0x5f,0x45,0x80,0x05,0x1e,0x28,0x06,0xba,0x92,0x59,0x5e,0x91,0x4a,0xb4,0x62,0x38,0x41,0xcc,0x4a,0x2d,0x36,0x52,0xb7,0x68,0x78,0x02,0xab,0xa7,0x92,0x6e,0xfb,0x00,0x00,
+ 0x05,0x20,0x62,0xc0,0xa3,0xcb,0x88,0xb8,0xa1,0x6a,0xab,0x95,0x77,0x04,0x4d,0xad,0xc0,0xef,0x2c,0xc1,0xac,0xa8,0x69,0x95,0xfd,0xa5,0xce,0x54,0x54,0x18,0x83,0xcf,0x7c,0x39,0x00,0x00,
+ 0x05,0x20,0x63,0x55,0x06,0xee,0x3c,0x4b,0x0d,0xea,0xc5,0x8b,0x7c,0x40,0x12,0x35,0xa3,0xc1,0x67,0xac,0xe9,0x36,0xf1,0xb8,0xd9,0x35,0xcb,0x9f,0x37,0xc1,0x39,0x0a,0x5b,0x31,0x00,0x00,
+ 0x05,0x20,0x63,0x62,0x11,0x6e,0x08,0xe6,0x68,0xad,0x4f,0x26,0x3b,0x31,0xde,0xa9,0xeb,0x05,0x9a,0x24,0x1f,0xc9,0x53,0x27,0xfe,0xc0,0x59,0x2d,0x35,0xf2,0x36,0x9b,0x30,0x88,0x00,0x00,
+ 0x05,0x20,0x63,0x63,0x12,0x14,0x81,0x86,0xf1,0x78,0xe8,0x15,0x7c,0x5f,0xb0,0x63,0xf6,0xe6,0xa5,0x7d,0x7d,0x09,0xaf,0xa5,0x34,0xad,0x39,0x7d,0x9c,0x76,0x95,0xaa,0x36,0xbc,0x00,0x00,
+ 0x05,0x20,0x63,0xb5,0xf9,0xfa,0xd8,0x67,0xbd,0xe0,0xee,0xc5,0x05,0x0e,0xd1,0xc1,0xc2,0x09,0x26,0x39,0x4a,0x57,0x54,0x88,0xff,0x5f,0x83,0x13,0xe8,0x7e,0x8e,0xe4,0xff,0x9c,0x00,0x00,
+ 0x05,0x20,0x63,0xbc,0xc7,0xea,0x78,0x63,0x01,0xd5,0xea,0x56,0x70,0x7c,0xa8,0x67,0x21,0xd7,0x44,0x26,0x18,0x42,0x2a,0x7a,0xf4,0x0b,0xce,0x62,0x54,0xa9,0xd7,0x96,0xa9,0x35,0x00,0x00,
+ 0x05,0x20,0x63,0xd1,0xf0,0xa2,0xa1,0x8e,0x9f,0x8b,0x48,0xc0,0x94,0x97,0x6e,0xd8,0x9f,0xf7,0x99,0xfe,0xfd,0xd2,0xd7,0xbd,0xf3,0xec,0xf0,0x69,0xc4,0x59,0x82,0x59,0x1d,0x76,0x00,0x00,
+ 0x05,0x20,0x63,0xe0,0x1d,0xa4,0x6c,0x1a,0x02,0x08,0xc4,0xab,0xc2,0x10,0xae,0xd9,0x3b,0x22,0x91,0x3b,0xbc,0x9a,0x74,0x10,0x4c,0xcd,0x60,0xbe,0xe8,0xe6,0x5e,0x4f,0x34,0xab,0x00,0x00,
+ 0x05,0x20,0x64,0x1c,0x2a,0x1e,0xfb,0x85,0x85,0x62,0xd2,0x88,0x6f,0x35,0x8a,0x1e,0x70,0x33,0x3f,0xe1,0xc5,0x6c,0x2d,0x72,0x85,0x17,0xf4,0x8b,0xa7,0xfe,0xc2,0xdb,0xc2,0x9e,0x00,0x00,
+ 0x05,0x20,0x64,0x42,0x7b,0x79,0xd6,0xff,0xc2,0x98,0x30,0x3e,0xfc,0x69,0x10,0xa8,0x4b,0xe5,0xe5,0xa7,0x09,0x3c,0x7c,0xd1,0xe3,0xb7,0x3c,0xb0,0xa4,0x6f,0x04,0x74,0xb4,0xf0,0x00,0x00,
+ 0x05,0x20,0x64,0x70,0xf4,0xc7,0x45,0x01,0x92,0x73,0x7b,0x3c,0x45,0xe3,0xfd,0x97,0xad,0x7a,0x89,0x87,0x5e,0x49,0x03,0x04,0x3a,0xf6,0x82,0xf3,0x93,0xd7,0x23,0x58,0x5c,0xab,0x00,0x00,
+ 0x05,0x20,0x64,0x92,0xbe,0x03,0xec,0x1b,0xff,0x7d,0x04,0x4b,0x5b,0x03,0x7a,0x44,0xe5,0x64,0xef,0x57,0x2f,0x0a,0x73,0x73,0xce,0xbe,0x4c,0x3f,0xd3,0xe7,0xbe,0x65,0xc6,0x3a,0x00,0x00,
+ 0x05,0x20,0x64,0xd7,0x96,0xde,0x18,0x07,0x5a,0x1a,0x61,0xd1,0xc0,0x73,0x45,0xf0,0x4f,0x1a,0xe2,0xda,0xae,0x27,0x02,0xef,0xa2,0x38,0xd6,0x48,0x89,0xd4,0xef,0x49,0x97,0x6c,0x00,0x00,
+ 0x05,0x20,0x65,0x7e,0x1e,0x70,0x74,0x05,0xe0,0xfc,0x84,0x79,0x9b,0x62,0x3a,0xb5,0x3e,0xc3,0xe4,0xff,0xe0,0xf2,0xe6,0x76,0x31,0x6a,0x1e,0xe2,0x5d,0x5f,0x3e,0x28,0x9b,0x12,0x00,0x00,
+ 0x05,0x20,0x65,0x65,0xd0,0x6e,0x5e,0x89,0x8a,0x1a,0xd4,0xd0,0xe7,0x2d,0x9c,0x0f,0xbf,0xa9,0x7a,0xf8,0xed,0x22,0x99,0xc5,0xd8,0x0d,0xdf,0xed,0xcc,0x9e,0x49,0x72,0x67,0xe7,0x00,0x00,
+ 0x05,0x20,0x65,0x85,0x07,0x13,0x4b,0xa7,0xe9,0xe7,0x1a,0xce,0xff,0xd5,0x1e,0xca,0x3c,0xb5,0xfc,0xfb,0xb5,0xd3,0x50,0xc8,0x25,0x6f,0x18,0x49,0x4f,0xca,0x29,0x78,0x9a,0x74,0x00,0x00,
+ 0x05,0x20,0x65,0x89,0x53,0xf6,0x3d,0x1a,0xb2,0x31,0xad,0xda,0x72,0xfc,0x17,0x25,0xe3,0x1c,0xb6,0xa6,0xbb,0x97,0x83,0xb1,0xe7,0xfa,0x8b,0x40,0xf6,0xf0,0x01,0x86,0x8c,0xd6,0x00,0x00,
+ 0x05,0x20,0x65,0xb0,0x9c,0x8e,0x26,0x9e,0x1e,0x1b,0x27,0x14,0x5d,0xb8,0x82,0x92,0x64,0x4e,0x7d,0x7a,0x4a,0x12,0x9d,0x73,0x85,0xe6,0x72,0x79,0xde,0x6d,0x47,0x59,0x2f,0xe8,0x00,0x00,
+ 0x05,0x20,0x66,0x3d,0xe9,0xd2,0xb9,0x2e,0x31,0xe5,0x28,0x23,0x24,0x2a,0x62,0xbd,0x5b,0xbd,0x1d,0x72,0x46,0x82,0xbc,0xff,0xb9,0xdb,0xd6,0xbd,0x76,0x80,0x37,0x4f,0xd4,0x9b,0x00,0x00,
+ 0x05,0x20,0x6e,0xcb,0xc6,0x98,0x32,0xd2,0x0d,0x57,0xed,0x3a,0xfd,0x64,0x8f,0xcc,0xe6,0xa4,0x2e,0xec,0x54,0x25,0x23,0x41,0x03,0x9b,0x0f,0xa4,0x07,0x9e,0xa1,0xd5,0x22,0xb4,0x00,0x00,
+ 0x05,0x20,0x6e,0xca,0x0d,0x62,0x85,0xda,0x36,0xe7,0x8d,0x53,0x45,0xb1,0x7c,0x9c,0x2f,0xa0,0xc5,0x49,0xff,0x75,0x02,0xee,0x38,0xae,0x24,0xd5,0xe5,0xa7,0x38,0x8f,0x18,0xc0,0x00,0x00,
+ 0x05,0x20,0x6f,0x3e,0x4e,0x19,0x45,0xed,0xe8,0x91,0x01,0x8d,0x90,0x22,0x5a,0x63,0xfc,0xdf,0x4e,0x59,0x1a,0x5c,0xc9,0xda,0x31,0x5c,0x16,0xd1,0x2a,0x02,0xb7,0xd1,0xd4,0x58,0x00,0x00,
+ 0x05,0x20,0x6f,0x1b,0xf0,0xa2,0xa9,0x0e,0x98,0x52,0x99,0x6b,0xd5,0x16,0xfb,0x60,0x3c,0x66,0x9c,0xe6,0x57,0xb1,0x75,0xe6,0x34,0xf8,0x2c,0x58,0x78,0x23,0x3c,0xbb,0xb0,0xd2,0x00,0x00,
+ 0x05,0x20,0x6f,0x33,0x6a,0x48,0x96,0xe8,0x9c,0x80,0xd2,0x3c,0x7e,0x8d,0xcd,0xf9,0x53,0x16,0xc5,0x87,0x1b,0x3b,0x92,0x97,0x99,0xd3,0xd1,0xa5,0x16,0x03,0x6d,0x24,0xf2,0x26,0x00,0x00,
+ 0x05,0x20,0x6f,0xf0,0xa5,0x6c,0x57,0x14,0x32,0x27,0x11,0x0f,0x77,0xcc,0x7c,0x87,0xda,0x53,0xb8,0x3f,0x06,0xf9,0x29,0x88,0xdc,0xdd,0x12,0x9d,0x4d,0xe2,0xd0,0x4b,0x20,0x6a,0x00,0x00,
+ 0x05,0x20,0x68,0x32,0x09,0x45,0x10,0x70,0x3d,0x07,0x5c,0x6b,0x36,0x53,0x69,0x18,0xd4,0x0d,0xd7,0xe4,0x71,0xa6,0x27,0x61,0xf7,0x33,0xed,0x42,0x41,0x04,0x6b,0x94,0x59,0xa8,0x00,0x00,
+ 0x05,0x20,0x68,0x86,0x94,0xcc,0xe2,0x57,0xab,0xe7,0x9f,0x3c,0x58,0x06,0x3c,0x0b,0xe0,0xf8,0xb2,0xea,0x27,0x12,0xef,0x58,0x45,0x94,0x4e,0x7c,0xea,0xbd,0x1f,0x88,0xcc,0x17,0x00,0x00,
+ 0x05,0x20,0x68,0xe6,0xe4,0x77,0x65,0xcf,0xc9,0xe6,0x2f,0xd5,0xf2,0x5b,0xbd,0xfb,0xfd,0x6d,0x84,0x8b,0x7d,0x94,0xeb,0x24,0xdf,0x80,0xb9,0x09,0xc8,0x17,0xc6,0x92,0x81,0xbe,0x00,0x00,
+ 0x05,0x20,0x68,0xe8,0xd6,0xc9,0x38,0x7f,0x97,0xcb,0x6d,0x24,0x0b,0xad,0xcc,0x9a,0x45,0x88,0xe5,0x8d,0x2e,0x20,0x7a,0x4d,0x25,0x87,0x73,0xaf,0xc6,0x6f,0x3b,0x0f,0x28,0x6d,0x00,0x00,
+ 0x05,0x20,0x68,0xef,0xad,0xde,0x15,0x9f,0x20,0x4c,0x93,0x28,0x3f,0x2c,0xb4,0xfd,0x90,0x9d,0x85,0xc6,0xe4,0x35,0x61,0xa4,0x48,0x78,0xa2,0xf1,0x34,0x31,0xe2,0xd1,0x62,0xad,0x00,0x00,
+ 0x05,0x20,0x69,0x12,0xc4,0x3d,0xe4,0x73,0xf0,0xef,0xf6,0xc3,0xd9,0x93,0x13,0x88,0x1b,0x2c,0x7a,0xc7,0x68,0xdb,0xfb,0xad,0x9b,0x0c,0x99,0xbb,0x0d,0xfa,0x1e,0xfe,0xc1,0xae,0x00,0x00,
+ 0x05,0x20,0x69,0x64,0x8d,0x94,0x8d,0xcc,0x72,0xe1,0x09,0x3f,0x0b,0xf3,0x4a,0xa4,0x37,0x6a,0x13,0xf1,0xb3,0x34,0x7c,0x4d,0xf4,0x03,0x86,0x25,0x1d,0x19,0xba,0x14,0x48,0x3f,0x00,0x00,
+ 0x05,0x20,0x69,0x9b,0xd2,0x2d,0xb5,0x0b,0x35,0xbe,0x63,0x14,0x6f,0x54,0x14,0xe2,0x3f,0xf3,0xb1,0xd6,0x9e,0x35,0xc0,0x94,0xdd,0xec,0x50,0x10,0x6f,0xae,0x9e,0xdc,0x59,0x5d,0x00,0x00,
+ 0x05,0x20,0x69,0xde,0x1a,0xea,0x20,0xac,0xfd,0x3e,0x94,0xf7,0xc5,0x68,0x78,0xdf,0x0c,0x06,0xff,0x67,0x9f,0xc3,0xcd,0x32,0xf1,0x8d,0x76,0xdd,0x1c,0x8a,0xe5,0x7e,0x9d,0xf8,0x00,0x00,
+ 0x05,0x20,0x6a,0x38,0xd9,0x6d,0xd4,0xfd,0x7d,0x93,0xf6,0x11,0x05,0xaa,0xab,0x35,0x92,0x3b,0x63,0x91,0x60,0x5d,0xcb,0x92,0xab,0x7b,0x9f,0x8c,0x5a,0x87,0xad,0x94,0x8c,0x42,0x00,0x00,
+ 0x05,0x20,0x6a,0x0d,0x12,0x85,0xd4,0xde,0x67,0xeb,0x5c,0x86,0x6f,0x50,0xce,0x0b,0x0c,0x43,0x52,0x24,0xb0,0x32,0x84,0x5d,0x1f,0xb6,0x62,0x8f,0x51,0xfc,0x57,0xc2,0x3d,0xab,0x00,0x00,
+ 0x05,0x20,0x6a,0x13,0xf7,0xe4,0x3e,0x61,0xe3,0x10,0x74,0xcb,0x0e,0xc7,0x83,0x1d,0x33,0xef,0x64,0xd3,0x5a,0x28,0x56,0x46,0xb0,0x19,0x8f,0x91,0x7e,0x96,0xe9,0xcd,0xab,0x80,0x00,0x00,
+ 0x05,0x20,0x6a,0x24,0x3e,0x58,0x12,0xe1,0x99,0xb7,0xaa,0xb4,0xb2,0x4f,0xb9,0x04,0x0e,0x76,0xfa,0x99,0xdd,0xcf,0xf6,0x34,0x3f,0xd0,0xdc,0x43,0x97,0xc1,0x14,0xaa,0x8a,0xbb,0x00,0x00,
+ 0x05,0x20,0x6a,0x31,0x9f,0xd7,0xa5,0x19,0xe1,0x09,0xae,0x3c,0xc6,0xe6,0x23,0x0d,0xc4,0xa6,0xd9,0x86,0xce,0x81,0xe4,0xe3,0x9a,0x99,0x17,0x59,0x92,0x16,0x3a,0xc2,0x11,0x92,0x00,0x00,
+ 0x05,0x20,0x6a,0xdd,0x0e,0xe9,0xae,0xad,0x1f,0xb1,0x02,0xc2,0x15,0x40,0x05,0x30,0x34,0x1b,0x9c,0x09,0xd9,0x56,0xf8,0xe0,0xb9,0xb6,0x3e,0x86,0xd3,0xc8,0x63,0xf1,0xf3,0x90,0x00,0x00,
+ 0x05,0x20,0x6b,0x7e,0xfe,0x63,0xef,0xa3,0x76,0xcd,0xce,0xe0,0x80,0x54,0x47,0xcd,0x57,0xc2,0xb3,0x68,0x97,0xfd,0x8d,0x35,0x94,0x30,0x03,0x69,0x2c,0x9f,0x9b,0x71,0xe5,0x1a,0x00,0x00,
+ 0x05,0x20,0x6b,0x93,0xf5,0x93,0xea,0x52,0x7b,0xca,0x31,0xde,0x60,0xcb,0x30,0x1a,0xb5,0x56,0xf5,0xf1,0x51,0x11,0xfc,0x3f,0xd0,0xb6,0xb4,0x79,0xe3,0x70,0x7d,0x49,0xa2,0x5a,0x00,0x00,
+ 0x05,0x20,0x6b,0xc4,0xc2,0x1d,0x47,0x3f,0x33,0xab,0x4d,0x5b,0x2f,0x79,0xaf,0x23,0x31,0xc4,0xeb,0x0a,0xe0,0xbe,0x00,0x3e,0x7c,0x5f,0xc7,0x2f,0x92,0x30,0xde,0xa4,0x82,0x18,0x00,0x00,
+ 0x05,0x20,0x6c,0x62,0x6e,0x3f,0xf3,0xcc,0xd6,0xbc,0xcc,0xeb,0x54,0x32,0xe6,0x41,0x1b,0x19,0x12,0x51,0x01,0x5f,0x9f,0xb6,0xdf,0xe7,0x34,0x73,0x27,0xd0,0x4f,0x39,0xeb,0x38,0x00,0x00,
+ 0x05,0x20,0x6c,0xf7,0x89,0x02,0x5c,0xb3,0xd2,0x65,0x16,0x7d,0x7b,0x8f,0x12,0xca,0x6c,0xd5,0x4c,0x9f,0xcf,0x55,0xbe,0xf9,0x4d,0xea,0xae,0xc7,0xe3,0x07,0x37,0xe3,0x58,0x4c,0x00,0x00,
+ 0x05,0x20,0x6d,0x34,0x07,0x7f,0x59,0xb0,0x31,0xa7,0xb9,0xaa,0x3c,0x4b,0xbd,0x6a,0xd8,0x2c,0x62,0xde,0x30,0x6c,0xc3,0xfe,0xde,0xc3,0xb7,0xcb,0x12,0x71,0x18,0x9d,0x70,0xd8,0x00,0x00,
+ 0x05,0x20,0x6d,0x0a,0xb4,0x22,0xdb,0xa0,0x2b,0xb9,0xe4,0x60,0x5a,0x27,0xad,0x73,0x07,0x09,0x5e,0x24,0xcc,0xc5,0x8b,0x3a,0x81,0x7d,0xc1,0xf2,0xf6,0xc6,0x48,0x18,0xf0,0x9e,0x00,0x00,
+ 0x05,0x20,0x6d,0x18,0x85,0x9f,0xe7,0x39,0xcb,0xe4,0x37,0x2a,0xcd,0x81,0x8d,0x9f,0x28,0x2f,0x14,0x88,0xba,0x12,0x9d,0xe0,0x1c,0xfc,0xf9,0xab,0xb1,0xa1,0x4c,0xcf,0x04,0x06,0x00,0x00,
+ 0x05,0x20,0x6d,0x2c,0xf3,0xce,0x94,0x19,0x63,0x2b,0x20,0x72,0xd6,0xa0,0x98,0x7b,0x79,0x35,0xcf,0xdb,0x53,0xe4,0x88,0x0a,0xbd,0xf9,0x38,0x6a,0x29,0x73,0xe7,0xfd,0x42,0xb1,0x00,0x00,
+ 0x05,0x20,0x6d,0x59,0x4a,0x01,0x27,0x05,0xbf,0xc3,0x77,0xdd,0x5e,0xc1,0xf1,0xbc,0x99,0x97,0x22,0xac,0xb3,0x5a,0xa0,0x7a,0x93,0x9f,0xcc,0x1d,0x73,0x4e,0x6d,0x3c,0x07,0x87,0x00,0x00,
+ 0x05,0x20,0x6e,0x78,0xb8,0x7d,0xec,0x95,0x9a,0x60,0x12,0xb5,0xd5,0x21,0x80,0x21,0xb0,0xcd,0x26,0x5b,0xad,0x40,0xad,0xcc,0x32,0x6a,0xda,0x92,0xdd,0xa7,0xf8,0x9a,0x50,0x8b,0x00,0x00,
+ 0x05,0x20,0x77,0x50,0x97,0xe5,0xd1,0xd9,0x1b,0xdb,0xb5,0xa3,0x66,0xdb,0x39,0xa3,0xee,0xe1,0x6f,0x5a,0xeb,0x93,0xdd,0x48,0x7e,0x1b,0xec,0x01,0xd5,0xf7,0x18,0x92,0x0f,0xbe,0x00,0x00,
+ 0x05,0x20,0x77,0x83,0xfe,0x7e,0x0a,0x79,0xa9,0xe3,0x56,0x44,0x67,0xd6,0x4c,0x2e,0xac,0xbc,0x80,0x08,0x07,0x1e,0xfb,0xe9,0xde,0x95,0x90,0x6f,0x74,0x33,0x03,0x34,0xa8,0x6e,0x00,0x00,
0x05,0x20,0x77,0xa7,0xc2,0xc7,0xa0,0xc1,0x40,0x3c,0xa0,0x94,0x9c,0xa6,0x6b,0x09,0x6b,0xad,0xae,0x4a,0x65,0x2b,0xbb,0x33,0x26,0x3d,0x3b,0x3b,0xd5,0x52,0x14,0xf9,0x28,0x08,0x00,0x00,
- 0x05,0x20,0x71,0x68,0x1b,0xc7,0x48,0x8f,0xe9,0xa3,0x53,0x29,0xb6,0x23,0x5a,0x25,0x02,0x45,0x72,0xca,0xa1,0xb6,0x06,0xfc,0xda,0x65,0x71,0x37,0xe6,0xd9,0x30,0x81,0x02,0xfe,0x00,0x00,
+ 0x05,0x20,0x77,0xaa,0x1a,0x3c,0x6d,0x78,0xfa,0x1b,0x54,0x57,0xfa,0x2a,0x02,0x08,0xd8,0x77,0xef,0xda,0x8e,0x9d,0x23,0x39,0x50,0x78,0x4c,0xbf,0x51,0x61,0x17,0xb3,0xc0,0x04,0x00,0x00,
+ 0x05,0x20,0x70,0x09,0x00,0xa8,0xcf,0x22,0xb9,0x06,0xb3,0x6d,0x5e,0x3f,0xeb,0xea,0x65,0x88,0x07,0xa9,0xd1,0xba,0xb9,0x0a,0xb4,0x13,0x3f,0x06,0xe9,0x71,0x8c,0x90,0xe2,0x38,0x00,0x00,
+ 0x05,0x20,0x70,0x4b,0xd5,0x15,0x5d,0x6f,0x1a,0xd9,0x5b,0xe4,0xcf,0x97,0x2f,0x08,0xf0,0xa7,0x17,0x9e,0x59,0x62,0x57,0xe9,0x3b,0x55,0x89,0x6a,0xd0,0xde,0x37,0x25,0x6c,0x9f,0x00,0x00,
+ 0x05,0x20,0x71,0x30,0x3a,0xa9,0x2e,0x24,0x31,0xbe,0x7f,0x76,0xba,0x94,0x16,0x38,0x5e,0xce,0x7a,0xcf,0x64,0x4c,0x2f,0x9d,0x5d,0x1c,0xaa,0x12,0x3b,0xc2,0x16,0x48,0x9e,0x28,0x00,0x00,
+ 0x05,0x20,0x71,0x74,0x6c,0x6a,0xa1,0x59,0xe7,0xdf,0xcd,0xbe,0xc1,0x45,0x99,0x2d,0xac,0x7e,0xaf,0x80,0x8d,0x00,0xce,0x66,0x0e,0x6f,0x1a,0xe5,0xbf,0xe9,0xaf,0xd3,0xa6,0xae,0x00,0x00,
+ 0x05,0x20,0x71,0x8c,0xdf,0x40,0x2f,0x60,0x40,0x6d,0x6b,0x86,0xa3,0x00,0x6c,0x99,0xae,0xee,0xd8,0x67,0x64,0x3e,0xec,0xdf,0x99,0xf5,0x64,0xca,0x42,0x50,0x85,0x10,0x56,0x39,0x00,0x00,
+ 0x05,0x20,0x71,0x9a,0xde,0x32,0xd6,0x9b,0x26,0x90,0xc5,0xb0,0xd2,0xa9,0x1f,0xc9,0xe2,0x2b,0x8e,0x8a,0xdd,0x71,0xae,0x77,0x22,0x81,0x93,0xdc,0xf9,0xe7,0xab,0x44,0xd2,0x03,0x00,0x00,
+ 0x05,0x20,0x71,0xa0,0x31,0x43,0x48,0x34,0x96,0x7d,0xb7,0xa9,0x6e,0xe9,0x3c,0xea,0xaf,0x25,0x67,0x3a,0x2f,0x7e,0xf0,0x67,0xad,0x73,0xd5,0x42,0xca,0xd7,0x5a,0x98,0xab,0xaa,0x00,0x00,
+ 0x05,0x20,0x72,0x92,0x06,0x4b,0x03,0xe5,0xa9,0x3a,0x9c,0xa7,0x91,0x4a,0x44,0xd9,0x5e,0x43,0xa3,0x4e,0x31,0x95,0xb0,0x0c,0x59,0x49,0xd8,0xe9,0xc4,0xe1,0x1b,0x46,0x4f,0xfc,0x00,0x00,
+ 0x05,0x20,0x73,0x37,0xab,0x1c,0xf6,0xa8,0xa4,0x18,0x97,0x86,0xf5,0x0f,0xd3,0xd1,0xf2,0x5f,0xbe,0xe0,0x3c,0x42,0x75,0x22,0xab,0xe2,0x3f,0xa1,0x7b,0x9b,0x02,0x17,0x9d,0xc3,0x00,0x00,
+ 0x05,0x20,0x73,0x18,0xac,0x7e,0x04,0x9d,0x0f,0xce,0x9f,0x8b,0x56,0xe2,0x04,0x2d,0x1a,0xf9,0x5a,0x13,0xc8,0xd7,0xae,0xf3,0x41,0x21,0xae,0x06,0x18,0xdc,0x31,0xdd,0xfe,0xfb,0x00,0x00,
+ 0x05,0x20,0x73,0x1a,0x61,0x24,0xb6,0x9a,0x31,0x0b,0x04,0xb0,0x81,0x8d,0x90,0xaa,0x73,0x81,0x99,0xb0,0xaf,0x16,0xa7,0x36,0xa7,0xcd,0xda,0x7e,0x34,0x4e,0x19,0xff,0x29,0xe2,0x00,0x00,
+ 0x05,0x20,0x73,0xda,0xfa,0xe7,0xec,0xc9,0x6d,0xe6,0xe1,0xe6,0x63,0x5b,0xdc,0x9a,0x6b,0xcd,0xff,0x7a,0x0b,0x96,0xfd,0x41,0x3e,0x86,0x51,0xe3,0x07,0x37,0xff,0xea,0xcf,0xc9,0x00,0x00,
+ 0x05,0x20,0x74,0x22,0xbe,0xff,0x6d,0xb7,0x99,0x8d,0x3b,0xac,0xa3,0xfd,0x48,0x79,0xec,0xea,0x18,0xcb,0x6c,0xcd,0xaa,0x00,0x74,0x1b,0xa2,0x11,0x0c,0x49,0x72,0xc5,0x6e,0x0f,0x00,0x00,
+ 0x05,0x20,0x74,0x6b,0x23,0xc7,0x10,0x86,0xb8,0xbd,0x70,0x9c,0x1d,0x5c,0x25,0x5f,0x44,0x52,0x78,0x7a,0x73,0x4e,0x9c,0x2f,0x2a,0xe2,0xb8,0xfc,0xd9,0xf3,0x9c,0x69,0x96,0x7e,0x00,0x00,
+ 0x05,0x20,0x75,0x14,0x45,0x8e,0x06,0x75,0x41,0x53,0xed,0xaf,0x30,0x74,0x1c,0x7e,0xde,0x3d,0x0d,0xdf,0xf6,0x80,0x26,0xb9,0x9f,0x52,0x05,0x1a,0xfc,0x55,0x9f,0xec,0x07,0xa3,0x00,0x00,
+ 0x05,0x20,0x75,0x5a,0xad,0xd8,0xa1,0x8a,0xab,0x5a,0x4c,0x9e,0xaa,0x9b,0xd3,0x2c,0xe3,0x9a,0xef,0x1f,0x37,0x15,0x20,0x50,0x55,0xd6,0x3d,0x5f,0xad,0x2f,0x49,0xd1,0x78,0x35,0x00,0x00,
+ 0x05,0x20,0x75,0x89,0x75,0xd0,0x89,0x0e,0xc9,0x2c,0xdf,0x8f,0xd8,0x7d,0x9a,0x5f,0x06,0x34,0xaf,0x79,0xaa,0xe5,0x35,0xdd,0x85,0xa8,0x06,0x29,0x05,0x2d,0x84,0xc5,0x6b,0xd2,0x00,0x00,
0x05,0x20,0x76,0x74,0x80,0x6c,0xab,0x7b,0x36,0x3a,0x6a,0x78,0xa4,0xa8,0xb8,0xb7,0xe7,0xf9,0x34,0x47,0x6d,0x34,0xca,0xa2,0xc6,0xef,0x81,0xab,0x62,0xb1,0x46,0x86,0xaf,0xd0,0x00,0x00,
- 0x05,0x20,0x7b,0x8e,0x51,0x44,0xa2,0xfb,0xe2,0xde,0x06,0xad,0xe5,0xe5,0x3b,0x79,0xb3,0xd9,0x3e,0x74,0xb0,0x3f,0x55,0x13,0xc1,0xa6,0x72,0x2c,0x25,0x25,0x58,0xec,0x3b,0x5a,0x00,0x00,
- 0x05,0x20,0x80,0xfc,0x95,0xc8,0x95,0x91,0x2f,0x6b,0x6e,0xc4,0x2b,0xe1,0x2f,0xa0,0xcb,0xb8,0x76,0x5f,0x6f,0x1c,0x27,0xb0,0x3a,0x2c,0xb9,0x8d,0x6c,0x55,0xbd,0x02,0x60,0xe0,0x00,0x00,
- 0x05,0x20,0x89,0x52,0xac,0x8f,0x35,0xe0,0xac,0xfb,0xbb,0xc7,0xcd,0x1a,0x24,0x0a,0xb4,0xc5,0x11,0xff,0x5a,0xf0,0xbe,0xc1,0xad,0xaf,0x0d,0x87,0xf4,0xa9,0xda,0x12,0xf8,0x12,0x00,0x00,
- 0x05,0x20,0x8a,0x32,0x54,0x37,0x12,0x24,0xb5,0x1d,0xba,0x3c,0x45,0x03,0x2e,0xda,0xfe,0xf1,0x87,0x8f,0x31,0xe5,0xfe,0xed,0xfa,0x38,0x25,0x00,0x99,0xa5,0xf4,0x51,0x02,0xf7,0x00,0x00,
- 0x05,0x20,0x91,0x06,0xd1,0x9e,0xbd,0xab,0xc4,0x61,0xb3,0x0a,0xc2,0x3b,0x29,0xf3,0x10,0x38,0xee,0xbd,0x9d,0xe3,0x99,0x97,0x30,0x70,0x6e,0xe6,0xfb,0x6a,0x3c,0x07,0x3d,0xfd,0x00,0x00,
- 0x05,0x20,0x9d,0x0d,0x0f,0x58,0x1a,0x5c,0xb4,0x1a,0xeb,0xef,0x8e,0x91,0x8d,0x8c,0x1b,0x57,0x5d,0x6d,0x97,0x24,0x28,0x45,0x54,0x8a,0x3a,0xd5,0x05,0xfb,0x76,0xac,0x25,0x52,0x00,0x00,
- 0x05,0x20,0xa4,0xb3,0x30,0x54,0x28,0x0f,0xfb,0xe5,0x76,0xb0,0x31,0xb2,0x65,0x62,0x56,0x72,0x7c,0xc9,0xcd,0x07,0x4d,0x5f,0xb1,0x69,0xe0,0xf7,0x35,0x3d,0x30,0x3c,0x7d,0x64,0x00,0x00,
+ 0x05,0x20,0x76,0x5a,0xf7,0x9c,0x68,0x91,0x6a,0xb1,0x24,0xca,0xab,0x71,0xe6,0x03,0xda,0xb6,0x3d,0xbf,0xb4,0xfc,0xac,0xdf,0x7b,0x5b,0x9f,0x41,0x5e,0xc5,0xc1,0x49,0xae,0xc2,0x00,0x00,
+ 0x05,0x20,0x7e,0xc1,0x4d,0x5b,0xa9,0x6a,0xa1,0x43,0x5d,0xaa,0xa2,0x93,0xc8,0xd2,0x55,0xc3,0x6b,0x9d,0xba,0xe0,0xb0,0xcb,0xc0,0x27,0x24,0xc5,0xea,0x5a,0xe3,0x27,0x61,0x27,0x00,0x00,
+ 0x05,0x20,0x7f,0x27,0x28,0x5a,0xa3,0x78,0x11,0x3a,0xac,0xc0,0xa2,0x4b,0x1d,0x33,0x50,0x0c,0x77,0xe8,0x22,0xd4,0x90,0x25,0xdc,0xa9,0x14,0x9f,0xed,0xab,0x24,0x4f,0xdc,0xa0,0x00,0x00,
+ 0x05,0x20,0x7f,0x9d,0xb9,0xe5,0x6b,0x95,0x99,0xa4,0xf2,0xc0,0x3e,0xfa,0xd4,0x47,0x1c,0x98,0x87,0x4f,0x2e,0x1d,0x0f,0xbe,0x43,0x92,0xa2,0xbf,0x3b,0x20,0x13,0xef,0x0f,0x86,0x00,0x00,
+ 0x05,0x20,0x7f,0xd0,0x52,0x21,0x3b,0xa9,0xc7,0x2d,0x8d,0x08,0x3d,0xfb,0x04,0x32,0x82,0xc6,0x4c,0x25,0x75,0xcc,0x2a,0xa1,0x71,0x71,0xea,0x08,0x53,0x32,0xd3,0x87,0x7f,0xad,0x00,0x00,
+ 0x05,0x20,0x78,0x40,0x6f,0xfa,0xfd,0xc6,0x1d,0xd1,0xee,0xd8,0x7d,0x66,0xe3,0xdd,0x86,0x0c,0xc7,0x14,0xa4,0x3b,0xea,0xd2,0xd8,0x72,0xdd,0x2b,0xdc,0x6a,0x62,0x7d,0x62,0x7d,0x00,0x00,
+ 0x05,0x20,0x78,0x4b,0x38,0xcc,0x73,0x38,0x53,0xd8,0x08,0x82,0x88,0x06,0x46,0xec,0xe3,0xad,0x9c,0xc8,0x44,0xd2,0x21,0x05,0xe4,0x07,0xa7,0xd7,0x1b,0xac,0x89,0x15,0x1c,0x00,0x00,0x00,
+ 0x05,0x20,0x78,0xb8,0x3e,0xd7,0xfc,0x9c,0x79,0x5c,0xf7,0x8f,0x0c,0x7b,0xf2,0x24,0xc0,0xff,0xba,0x47,0xfa,0xb6,0x57,0x54,0xeb,0xf7,0xa6,0x2b,0x82,0x8e,0xf7,0xfa,0x03,0xe6,0x00,0x00,
+ 0x05,0x20,0x78,0x85,0xe1,0x36,0x38,0xe3,0x01,0x45,0xff,0x2b,0x08,0xf7,0xa5,0x1c,0x0b,0x00,0x2a,0xa1,0x06,0xdd,0x38,0xd3,0x45,0x73,0x29,0xb3,0xdd,0x20,0x3a,0x29,0x40,0x84,0x00,0x00,
+ 0x05,0x20,0x78,0x86,0xb8,0x5b,0x40,0xb3,0xde,0xe3,0x85,0x14,0x20,0xf9,0x12,0x94,0xd2,0xf3,0x76,0xba,0xee,0x67,0x3b,0x9b,0xb8,0xfb,0xe9,0x65,0xf5,0xee,0xea,0x17,0xd2,0x8f,0x00,0x00,
+ 0x05,0x20,0x79,0x26,0x45,0x49,0xc5,0x35,0x8c,0xd1,0xc8,0x67,0xf3,0xaa,0x7d,0x60,0x6a,0x89,0x9f,0x88,0x1a,0x73,0x44,0xf9,0x49,0x52,0x52,0xe0,0x72,0xa9,0x54,0x70,0x50,0x48,0x00,0x00,
+ 0x05,0x20,0x79,0xc8,0xd1,0xe3,0x13,0x8c,0x07,0x1d,0x54,0xb2,0xb6,0xd4,0x85,0xfb,0x14,0x47,0x6a,0x1d,0x3f,0x95,0xed,0xe8,0x31,0x93,0x26,0xef,0xed,0x21,0xdb,0xb4,0xc4,0x29,0x00,0x00,
+ 0x05,0x20,0x7a,0xce,0xec,0xf7,0x77,0x3b,0xd6,0xcc,0x50,0x89,0x6c,0x8d,0xd0,0xa8,0xa4,0xd7,0x1d,0x6d,0xbc,0x2b,0x1e,0x24,0xe7,0x56,0x94,0x7d,0x3d,0x0b,0x07,0x6d,0x9c,0xc4,0x00,0x00,
+ 0x05,0x20,0x7b,0x38,0xda,0x2a,0x39,0x68,0xc7,0xa5,0xd4,0x7b,0x91,0xd1,0x57,0xa6,0x22,0x0a,0x56,0xe6,0xcd,0x97,0x38,0x0d,0xab,0xe4,0x65,0xef,0xf5,0x26,0xd8,0x31,0xdb,0xfc,0x00,0x00,
+ 0x05,0x20,0x7b,0x7a,0x2b,0xef,0x4b,0x4c,0x6b,0x94,0xfa,0xff,0x3b,0xcd,0x82,0x97,0x71,0x59,0x66,0x4b,0xce,0x0f,0x7f,0x32,0xdd,0xb5,0x45,0xa1,0x63,0x17,0xb5,0xf4,0x43,0x33,0x00,0x00,
+ 0x05,0x20,0x7b,0x4f,0x27,0xd3,0x71,0x5b,0x85,0x91,0x87,0x32,0xc4,0x81,0xa4,0x16,0x72,0x33,0x91,0x8d,0xe4,0xc2,0x1e,0xb4,0x97,0x0d,0x8a,0xfe,0x46,0x90,0x34,0xe8,0x23,0x16,0x00,0x00,
+ 0x05,0x20,0x7b,0xc9,0xa4,0x96,0x41,0xd5,0xe2,0xc3,0x5a,0x86,0x0c,0x3e,0x03,0x63,0x9c,0xa0,0x83,0xec,0x43,0x90,0x0d,0x0a,0x02,0xea,0x47,0xff,0x83,0xc5,0x59,0xe0,0xe2,0x45,0x00,0x00,
+ 0x05,0x20,0x7b,0xc9,0x9e,0xef,0x11,0x97,0x96,0x06,0xe2,0xb8,0xbd,0x2e,0x15,0xc2,0xe8,0xa5,0x4e,0xd8,0x56,0xb3,0x01,0x59,0x60,0x20,0x7a,0x51,0x9f,0xa1,0xdf,0x55,0xea,0x01,0x00,0x00,
+ 0x05,0x20,0x7c,0x1b,0x0b,0x5d,0x7f,0x4c,0xa2,0xe5,0x7e,0xa6,0x79,0x85,0x55,0xde,0xcb,0x51,0xbd,0x81,0x2a,0xfb,0xdb,0x76,0x6e,0x5c,0xbd,0x5d,0x68,0xd9,0xd9,0xbe,0xd8,0x7c,0x00,0x00,
+ 0x05,0x20,0x7c,0x51,0xbf,0xfa,0x3e,0xa5,0x2c,0x66,0x85,0xa4,0xaa,0x91,0xf1,0x6f,0xdb,0x3f,0x23,0x82,0xd9,0x39,0x07,0xde,0x20,0x96,0x56,0x84,0x2e,0xaf,0x1d,0xb1,0x51,0xd2,0x00,0x00,
+ 0x05,0x20,0x7c,0x85,0x6e,0xe3,0x20,0x4f,0x53,0x2d,0x15,0xbf,0x36,0x63,0x97,0x27,0xd3,0x23,0x9a,0xb9,0x38,0xeb,0x0b,0x6a,0x31,0x3b,0xdd,0xa0,0x46,0x42,0xbd,0xaf,0xb1,0xde,0x00,0x00,
+ 0x05,0x20,0x7c,0xf6,0xc8,0x32,0xaa,0xaf,0xc0,0xb2,0x24,0x1f,0xa8,0x27,0x35,0xe2,0x54,0xf5,0xfe,0x64,0xb4,0x36,0x85,0x6d,0x3a,0x72,0x4a,0xc8,0x03,0x55,0x27,0x33,0x2a,0x35,0x00,0x00,
+ 0x05,0x20,0x7d,0x3c,0x4d,0x07,0xa1,0xcf,0xfb,0x06,0xb1,0xfa,0x8b,0xaf,0xae,0xe8,0x0a,0x92,0xd6,0xd4,0x4e,0xba,0x34,0x5a,0xdf,0xc0,0xb8,0xca,0x54,0x54,0x3b,0xf6,0xe9,0xfc,0x00,0x00,
+ 0x05,0x20,0x7d,0x1b,0x25,0xbc,0xf3,0xf3,0xf1,0x26,0xae,0x64,0x3c,0xf5,0xc8,0x9a,0xb1,0x53,0x32,0x31,0xf3,0x7f,0x5b,0x5e,0x55,0xb9,0x36,0x02,0x97,0xd1,0xe3,0xcc,0x09,0x18,0x00,0x00,
+ 0x05,0x20,0x7d,0x7c,0x6f,0xd1,0x0d,0xf7,0x77,0x12,0x44,0x68,0x45,0x46,0x69,0xb9,0x11,0x4d,0x5c,0xa4,0xba,0xc8,0xe0,0x76,0x5b,0x02,0x72,0xc8,0xd7,0x32,0x61,0xd2,0xda,0x34,0x00,0x00,
+ 0x05,0x20,0x7d,0x61,0x8a,0xb7,0x4b,0x7d,0x5c,0x4c,0x1c,0xc2,0x35,0x1a,0xe8,0x4c,0x93,0x54,0x54,0xff,0xf9,0x04,0x36,0x1c,0x84,0x68,0x05,0xe0,0xa2,0xd5,0xcd,0xde,0x30,0x75,0x00,0x00,
+ 0x05,0x20,0x7d,0xb9,0xaf,0x77,0xca,0xd5,0x43,0x6b,0xb2,0xb1,0x16,0xa0,0x19,0x67,0x69,0x92,0xea,0x2b,0x80,0xeb,0x6f,0xe2,0x43,0xc8,0x28,0x07,0x52,0x34,0x3b,0x4a,0x69,0xf7,0x00,0x00,
+ 0x05,0x20,0x7d,0xc3,0x83,0xd7,0xda,0x98,0x87,0x08,0x3d,0x7e,0x78,0x5f,0xb7,0x1b,0xe0,0x4e,0x72,0x26,0x86,0xe8,0x65,0x7a,0xac,0x4f,0x67,0x40,0xf6,0x34,0x8f,0x74,0xb2,0x87,0x00,0x00,
+ 0x05,0x20,0x7e,0x0b,0xa1,0x49,0x17,0x4d,0x0d,0x67,0xf8,0x03,0xd8,0x55,0x1c,0x6a,0x8b,0x56,0x53,0xf4,0x34,0x5f,0xe7,0xc7,0x26,0x3d,0x5f,0x41,0x03,0x44,0x0d,0x5c,0x5e,0xe2,0x00,0x00,
+ 0x05,0x20,0x7e,0x1c,0xb2,0x70,0xd2,0x5c,0x58,0x46,0x94,0x4c,0x1f,0x10,0xb8,0x63,0x35,0x95,0x31,0x14,0xe0,0xa5,0x48,0x6d,0xf0,0x34,0xc4,0x6c,0xe0,0x95,0x29,0x69,0x44,0xe1,0x00,0x00,
+ 0x05,0x20,0x86,0xe8,0x4a,0x24,0x7b,0xde,0x95,0xd8,0x26,0xe3,0x82,0x93,0x34,0xac,0xca,0x66,0xd5,0x3a,0x8f,0x1f,0x04,0xe5,0xc1,0x69,0xc6,0x15,0x5c,0xa7,0x1b,0x96,0x66,0xeb,0x00,0x00,
+ 0x05,0x20,0x87,0x1d,0xf0,0x97,0x7f,0x27,0x80,0x5b,0xfc,0x95,0xb0,0xf0,0xea,0xca,0x0f,0x9a,0x6c,0xef,0x4c,0x7b,0x17,0xa1,0x34,0x9f,0x91,0x98,0xda,0x67,0xee,0x71,0xb2,0x36,0x00,0x00,
+ 0x05,0x20,0x87,0x7a,0x6e,0x9b,0xd2,0xe7,0xce,0x8f,0xbc,0x54,0x73,0x28,0x6d,0xd6,0x22,0x1f,0xbf,0x54,0xa3,0xf4,0x96,0x8d,0x06,0x14,0x9f,0x83,0x74,0xd5,0x43,0xb5,0xcf,0x74,0x00,0x00,
+ 0x05,0x20,0x87,0x97,0x99,0x13,0x34,0xe2,0x07,0x77,0x8e,0xd1,0x77,0x2f,0xe9,0x56,0xd9,0xfa,0x7c,0x7f,0x1a,0x4e,0xf1,0x1a,0x81,0x8a,0xf5,0xfa,0x4e,0x2d,0x18,0x24,0x7d,0x33,0x00,0x00,
+ 0x05,0x20,0x87,0x9d,0xb2,0x41,0xb8,0x37,0x39,0x4c,0xa7,0x30,0x25,0x07,0x20,0x35,0x46,0x1b,0xa9,0x85,0xc8,0xea,0x38,0xce,0xbf,0x87,0x81,0x85,0xd4,0x16,0x0d,0xac,0xe2,0x01,0x00,0x00,
+ 0x05,0x20,0x87,0xfc,0x6e,0x2d,0x4e,0x90,0x75,0x2b,0x91,0xa7,0xe7,0xc9,0x49,0xc0,0xd6,0xb6,0x53,0x87,0x9f,0xba,0x8a,0x22,0x2f,0x6f,0xb6,0x55,0x9b,0x79,0x11,0x31,0xc8,0xc6,0x00,0x00,
+ 0x05,0x20,0x87,0xdb,0x31,0xdb,0x1e,0xbd,0x09,0x8a,0x98,0xe1,0x48,0x18,0x58,0x9f,0xda,0x04,0x27,0x4a,0x6d,0x0a,0xb1,0xbd,0xad,0x11,0x9c,0xe3,0xc1,0xb1,0x65,0xcc,0x88,0xd3,0x00,0x00,
+ 0x05,0x20,0x80,0x3f,0xf5,0xe7,0xe3,0x5f,0xb9,0x0b,0x4d,0x3c,0x2d,0xee,0xbc,0xf9,0xd3,0x55,0x2b,0x5e,0x68,0x62,0x41,0x8c,0xd6,0x5f,0xda,0x23,0x83,0x2d,0x5e,0x08,0xdd,0x57,0x00,0x00,
+ 0x05,0x20,0x80,0x21,0x5b,0xb3,0x15,0x86,0x99,0xcb,0x39,0x81,0x64,0xc1,0x9d,0xba,0x91,0xdc,0x18,0xff,0x90,0x93,0xdc,0x16,0x4e,0x95,0x6d,0x8c,0xb6,0x0e,0xd8,0xc5,0x3d,0xc2,0x00,0x00,
+ 0x05,0x20,0x80,0x2c,0x41,0xf5,0xd4,0xed,0x43,0xcd,0x50,0xc8,0xe6,0x8c,0xeb,0xc7,0x52,0xf0,0xa1,0x97,0xe0,0xfb,0x97,0x41,0x35,0x1e,0xa5,0xae,0x0f,0x81,0x78,0x0d,0xbe,0x00,0x00,0x00,
+ 0x05,0x20,0x80,0xc6,0x6f,0xb3,0x18,0x5a,0x1a,0xde,0x4e,0xde,0x50,0xd2,0xc6,0x3f,0xc5,0x96,0x09,0x35,0x3a,0x4d,0x88,0x5f,0xa3,0x49,0x37,0xff,0xe6,0xc5,0x43,0x10,0xaf,0xa8,0x00,0x00,
+ 0x05,0x20,0x81,0x17,0x20,0x48,0x84,0xab,0x59,0x9d,0x51,0xaf,0x75,0x4f,0xc6,0x85,0xe9,0x7c,0x8e,0x93,0x73,0xa8,0xa0,0xd0,0x02,0xf7,0x21,0x69,0x88,0x05,0xda,0xd4,0xb9,0x34,0x00,0x00,
+ 0x05,0x20,0x81,0x43,0x43,0x1c,0xb1,0xe9,0xce,0x67,0x39,0x80,0x96,0x2a,0x8b,0x2b,0x79,0x43,0x75,0xca,0x12,0x2f,0x5f,0xa9,0x1c,0xf6,0x4c,0xcd,0xc5,0xa1,0xa2,0xbd,0x45,0xee,0x00,0x00,
+ 0x05,0x20,0x81,0x57,0xb4,0x73,0xa8,0x79,0xa8,0x67,0x7e,0x84,0x95,0xb1,0xbc,0x35,0xa1,0x01,0x27,0xff,0xdc,0x16,0x43,0xd7,0x56,0x33,0x6a,0x7f,0x0a,0x9f,0xea,0x15,0xc8,0xbc,0x00,0x00,
+ 0x05,0x20,0x81,0xe8,0xae,0xe6,0x1d,0xaf,0xcf,0xd7,0xfd,0xde,0xd1,0xa5,0x73,0x4e,0x10,0x77,0xea,0x0e,0x23,0xff,0x77,0x6a,0x44,0x7a,0xd3,0x9d,0xe0,0x23,0x02,0xdc,0xf9,0xfe,0x00,0x00,
+ 0x05,0x20,0x82,0x2b,0x48,0x2a,0x31,0xdb,0xeb,0xb8,0xd1,0x7c,0xb1,0xaf,0xc7,0x73,0x2e,0x6f,0x6c,0x43,0x20,0x73,0xe8,0x29,0x85,0xd7,0x61,0x39,0x02,0x5a,0x27,0xce,0x80,0x29,0x00,0x00,
+ 0x05,0x20,0x82,0x46,0x59,0x84,0xe2,0x01,0x8e,0x39,0x2f,0x37,0x4c,0x2f,0xb6,0xb0,0x8c,0xe6,0x7a,0xfe,0xa6,0x7f,0x27,0xdd,0x4e,0x84,0x79,0xea,0xd6,0xd8,0x2e,0xf2,0x39,0x3a,0x00,0x00,
+ 0x05,0x20,0x82,0xb6,0x88,0x6e,0xd1,0xf1,0x19,0x39,0x8d,0x0b,0xa8,0xe0,0x1a,0xfa,0xad,0x82,0x64,0x7a,0x67,0x3e,0x66,0x17,0x6c,0x15,0xdb,0xcf,0xaa,0xf4,0xe2,0xd5,0x69,0x44,0x00,0x00,
+ 0x05,0x20,0x82,0x9c,0x7c,0xba,0xe8,0x31,0x0b,0xcd,0xc5,0xdf,0x61,0x74,0x11,0xff,0xc4,0xc3,0x49,0x4a,0x27,0x55,0x2e,0x22,0x46,0x50,0xb5,0xa1,0x65,0x25,0x48,0x35,0x4e,0xd3,0x00,0x00,
+ 0x05,0x20,0x82,0xa5,0x33,0xa3,0x30,0x99,0x46,0x94,0xdc,0x51,0x01,0xe1,0x75,0x2f,0x61,0x25,0x7f,0xd5,0x6b,0x81,0x58,0x0d,0x15,0x3a,0x59,0xb9,0x1b,0xce,0xe4,0x8b,0x42,0x5e,0x00,0x00,
+ 0x05,0x20,0x82,0xce,0xa5,0xd7,0x70,0xdc,0x63,0x2c,0x86,0x2a,0xbd,0xbf,0xde,0xad,0xe3,0x0d,0x23,0x7b,0x09,0x3d,0x1a,0xaf,0x64,0x08,0x12,0xe7,0x8a,0xbc,0xcd,0x6a,0x18,0x92,0x00,0x00,
+ 0x05,0x20,0x83,0x26,0x6e,0xd1,0x59,0xb9,0x19,0x25,0x4e,0x57,0xb6,0x83,0x1b,0x31,0xc7,0x21,0xf0,0x43,0xd9,0x6b,0x22,0xb1,0xb5,0x53,0x24,0x86,0x71,0xc5,0x90,0x62,0x75,0x36,0x00,0x00,
+ 0x05,0x20,0x83,0x46,0x68,0x1d,0x3b,0x13,0xc3,0x78,0xaa,0x74,0xf4,0x7f,0x89,0x01,0xce,0x10,0xa1,0x9a,0xc8,0x8b,0xab,0x75,0x37,0x9e,0x9b,0x7a,0xef,0xac,0xf5,0xd4,0x70,0x8d,0x00,0x00,
+ 0x05,0x20,0x83,0x60,0xe4,0xae,0x67,0xc3,0x3f,0x9e,0x1a,0xc8,0xc8,0x82,0xb3,0xbc,0x7a,0x99,0xf1,0xfa,0xf0,0x1e,0x41,0x58,0x4e,0xfc,0x39,0xc2,0xf6,0xdb,0xe5,0x49,0xf2,0x04,0x00,0x00,
+ 0x05,0x20,0x83,0xa3,0x91,0xa4,0x44,0x96,0x4b,0xcd,0xe9,0xc1,0xb8,0x3f,0xb9,0xb6,0xc7,0x80,0x7e,0xb9,0xde,0x37,0x59,0x54,0xa8,0x32,0xda,0x2a,0xd8,0x54,0x9d,0xd8,0xae,0xfc,0x00,0x00,
+ 0x05,0x20,0x83,0xfa,0xf7,0x99,0xd9,0xc8,0x55,0x44,0x34,0xc6,0xd6,0xb2,0x60,0x30,0xbc,0x76,0x5e,0x4d,0x37,0xa7,0x4a,0xe9,0xc4,0x6b,0xb1,0xf3,0xd3,0x0b,0x69,0xa6,0x89,0xdd,0x00,0x00,
+ 0x05,0x20,0x83,0xc6,0x30,0x55,0xa5,0x5c,0x7b,0x31,0xb0,0x98,0x79,0x29,0xd5,0xc5,0x29,0xb4,0x8d,0x31,0x9f,0x3f,0x3d,0xba,0x46,0x5d,0x18,0x4a,0x84,0xff,0xb3,0xf7,0xc4,0x84,0x00,0x00,
+ 0x05,0x20,0x83,0xdd,0xba,0x77,0xdd,0x8b,0x0c,0x44,0x3a,0x34,0x96,0x40,0x30,0x8b,0x95,0x63,0xcc,0x9c,0x38,0xff,0x83,0xa3,0x5e,0x2f,0x04,0x2a,0xfe,0x62,0x12,0xd8,0xc6,0x7e,0x00,0x00,
+ 0x05,0x20,0x84,0x10,0x05,0x5b,0x5c,0x70,0x4b,0x6c,0xef,0xfd,0x31,0x43,0xe6,0x53,0x20,0xcf,0xe7,0x1f,0x01,0xa8,0xdb,0x87,0xe5,0x91,0xce,0xbf,0xd3,0x6c,0xc5,0x19,0xc5,0xd5,0x00,0x00,
+ 0x05,0x20,0x84,0x19,0x7a,0xd1,0x36,0x47,0x15,0x33,0x27,0x42,0xa4,0x19,0x6e,0x29,0x14,0x4a,0x8b,0xfa,0x2a,0x2a,0x71,0x3b,0x1c,0x63,0x81,0x48,0x7f,0x3c,0x2c,0x8f,0x5c,0x92,0x00,0x00,
+ 0x05,0x20,0x84,0x5f,0x9f,0x7e,0x22,0xb4,0x42,0xf1,0x38,0x4a,0x40,0xfa,0xc5,0xeb,0x83,0x98,0xce,0x73,0x91,0x53,0xc6,0xee,0x3f,0x78,0x8a,0x56,0x01,0x37,0x95,0x23,0xd5,0x94,0x00,0x00,
+ 0x05,0x20,0x85,0x32,0xa8,0x9b,0x21,0xeb,0xd8,0xde,0x73,0xdd,0xf7,0x3e,0xa2,0x75,0x72,0x28,0x64,0x48,0x35,0xd1,0x8f,0x96,0x9a,0x96,0x57,0x10,0x0c,0x9f,0xc7,0x2b,0xf9,0xc5,0x00,0x00,
+ 0x05,0x20,0x85,0x7a,0x4e,0x25,0x62,0x63,0x14,0x35,0xb0,0xfd,0x93,0xd5,0x5a,0xea,0xc6,0x4e,0xf9,0xba,0xb3,0x98,0x74,0xf1,0xa3,0xb8,0xb4,0xca,0x38,0xb7,0x45,0xad,0xd9,0xf3,0x00,0x00,
+ 0x05,0x20,0x85,0x8f,0x55,0xbe,0x27,0x56,0xdb,0x39,0x5a,0x3d,0xbb,0x66,0xd1,0x68,0xe7,0x33,0x2a,0x3d,0x84,0x26,0xc9,0x94,0x17,0x30,0x28,0x40,0x4f,0x19,0x27,0xea,0xf1,0xb1,0x00,0x00,
+ 0x05,0x20,0x86,0x14,0x0a,0xbd,0x21,0x20,0xa5,0x20,0x3c,0x9f,0xfb,0x23,0x74,0xde,0xd7,0x11,0x25,0xa3,0x05,0x23,0xf1,0xb2,0x4b,0x0f,0xd9,0xc4,0xb7,0xaa,0x1d,0x8d,0x6d,0xb6,0x00,0x00,
+ 0x05,0x20,0x86,0x21,0x66,0xf6,0xf2,0xd7,0x0f,0xee,0xc5,0x63,0x8a,0xc9,0xd6,0x4b,0x00,0x8b,0x20,0xe2,0xed,0x61,0xde,0xe9,0x9f,0xca,0x93,0x05,0x2c,0x33,0x76,0x08,0xa1,0xdd,0x00,0x00,
+ 0x05,0x20,0x8e,0x9f,0xd5,0x42,0x3f,0xba,0x5d,0xc6,0x8b,0x3f,0x5f,0x88,0xa1,0xdf,0x46,0x27,0xa5,0x4d,0x27,0x5a,0x4e,0xa6,0x39,0x3a,0xf4,0xe2,0x6d,0xba,0x7b,0xf9,0xfb,0xdc,0x00,0x00,
+ 0x05,0x20,0x8f,0x28,0xa1,0xa7,0xe2,0xd2,0xbb,0xdf,0xab,0xf0,0x1f,0xa4,0x80,0x50,0xe7,0x85,0x05,0x23,0xdb,0x1a,0x8c,0x54,0xcf,0x7a,0x76,0xce,0x0f,0xc4,0xa2,0x82,0x43,0x01,0x00,0x00,
+ 0x05,0x20,0x8f,0x47,0xd4,0x9a,0x42,0xac,0xbc,0x8b,0xf6,0xbe,0xe7,0x9c,0x7b,0x03,0xdc,0xad,0x27,0x4f,0xd1,0x85,0x22,0x9b,0x11,0x68,0xf1,0x26,0x46,0x99,0xae,0x3c,0x5b,0x3c,0x00,0x00,
+ 0x05,0x20,0x8f,0x87,0xc6,0x38,0x11,0x7e,0xb5,0x66,0xb6,0x4d,0x64,0xaf,0x09,0xee,0x5b,0xd1,0xb3,0x89,0x08,0x02,0x10,0x04,0xa1,0x03,0x35,0x43,0x22,0x47,0xfe,0x40,0xd7,0x98,0x00,0x00,
+ 0x05,0x20,0x8f,0x8e,0x3d,0xa9,0xb0,0x46,0x9f,0xe5,0x02,0xdf,0x3e,0x03,0x11,0x17,0x50,0xea,0xc4,0x08,0xd1,0x62,0x16,0x65,0xb9,0x18,0x54,0xcf,0x30,0x2d,0x48,0x09,0xd9,0xb0,0x00,0x00,
+ 0x05,0x20,0x8f,0xc3,0x43,0x7a,0xc1,0x39,0x2b,0x08,0x2c,0x20,0xab,0xa8,0x9d,0x98,0xcf,0x07,0xc9,0xdf,0xc8,0x23,0xdb,0x91,0x55,0x66,0x04,0xc0,0x0d,0x19,0xde,0x47,0x62,0x5e,0x00,0x00,
+ 0x05,0x20,0x88,0x3f,0x99,0xc3,0xee,0x87,0xd2,0x27,0x65,0xf4,0x47,0xc5,0xcc,0xd7,0xfe,0x31,0xff,0x14,0xd8,0xf0,0xe9,0x54,0xfb,0xbf,0xe3,0xad,0xbf,0x14,0x4d,0x02,0x57,0xbd,0x00,0x00,
+ 0x05,0x20,0x88,0x7f,0x3c,0x24,0x7e,0x32,0x3e,0x4a,0xb2,0x7d,0x66,0x6b,0x30,0xba,0x20,0x64,0x10,0xfe,0x6e,0x47,0xfe,0xb2,0x9b,0xb6,0xc7,0x4f,0x55,0xfd,0x64,0xa8,0xd9,0xbc,0x00,0x00,
+ 0x05,0x20,0x88,0x7f,0x7d,0x79,0x6c,0x23,0xca,0x11,0x0f,0xf6,0x9d,0xe9,0xcd,0x3c,0xbc,0x98,0xee,0x12,0x75,0xfd,0xcc,0x8b,0xb1,0x5a,0x94,0x50,0xf8,0x59,0x73,0x27,0xbc,0xc2,0x00,0x00,
+ 0x05,0x20,0x88,0xf4,0x2b,0x6d,0x14,0x55,0x26,0x7d,0x2e,0xc4,0xe7,0x21,0xf2,0xa1,0xe0,0xb4,0x5a,0x4d,0x21,0xde,0xc6,0xcb,0x8c,0x57,0xb7,0x25,0xbd,0x51,0xec,0xee,0x96,0xa0,0x00,0x00,
+ 0x05,0x20,0x89,0x0a,0xee,0x57,0xfa,0xfa,0x58,0x52,0xfb,0x0b,0x8b,0xc2,0xaa,0x8f,0xa4,0x62,0xcb,0x1d,0x1c,0x0c,0x01,0x0f,0xfc,0x9d,0xde,0x75,0x40,0xbe,0x8d,0x8d,0xb2,0xe6,0x00,0x00,
+ 0x05,0x20,0x89,0x0b,0x19,0xe0,0x61,0x1c,0x97,0x91,0x18,0x52,0x63,0x1e,0x7d,0xf3,0x7d,0x82,0x0d,0x80,0x24,0xfc,0x86,0x9b,0x55,0xff,0xbe,0x2f,0x70,0xe4,0xba,0x8b,0x6f,0x31,0x00,0x00,
+ 0x05,0x20,0x89,0x4d,0x24,0x9f,0x15,0x80,0x68,0xd2,0x17,0xa1,0xec,0x74,0x46,0x26,0x8e,0xbd,0xf4,0x8f,0xc4,0x52,0x5f,0xcc,0x09,0x9f,0x1a,0x6f,0x0d,0x64,0xe3,0x00,0x9f,0x83,0x00,0x00,
+ 0x05,0x20,0x89,0xbd,0xff,0xd5,0xe5,0xce,0x0f,0x21,0x2b,0x39,0x15,0x5d,0x8a,0xc0,0x61,0xb4,0xc6,0xa8,0x20,0xdf,0x5d,0xeb,0xca,0x35,0x97,0x16,0x7d,0xba,0xce,0x3e,0x99,0xb2,0x00,0x00,
+ 0x05,0x20,0x89,0x83,0x0d,0xfa,0x58,0x48,0x06,0xcd,0x12,0xfa,0x31,0x66,0x2f,0x5f,0x33,0x45,0x44,0xa8,0xc3,0x22,0x4c,0xb2,0xb0,0x6d,0x20,0x15,0x8a,0xee,0x9e,0x14,0x9e,0x60,0x00,0x00,
+ 0x05,0x20,0x8a,0x33,0x44,0x61,0xe9,0x29,0xe8,0xa9,0xec,0x30,0x69,0x26,0xf7,0xb8,0x14,0x75,0x68,0x08,0x43,0xa4,0xf2,0x72,0x61,0xfe,0x66,0xc6,0xb9,0x98,0xd8,0x1a,0xc0,0xef,0x00,0x00,
+ 0x05,0x20,0x8a,0x8e,0x1d,0xf3,0xdb,0x0c,0xea,0x57,0x66,0xd3,0x06,0xfe,0x89,0xad,0x53,0xdf,0xd1,0x86,0x89,0xea,0xc8,0x15,0xab,0x9d,0xc4,0xe2,0x8d,0xf9,0xc0,0x05,0x84,0x50,0x00,0x00,
+ 0x05,0x20,0x8a,0xf8,0x1d,0xc7,0xa7,0xed,0xdc,0x37,0x7d,0x48,0xb7,0x1b,0x85,0x0f,0x91,0x3b,0x85,0xc4,0xef,0xea,0xba,0x33,0x9c,0x07,0xd4,0x51,0x84,0xe6,0x60,0x5a,0x84,0x70,0x00,0x00,
+ 0x05,0x20,0x8b,0x64,0x93,0x22,0x20,0x7f,0x56,0x53,0xdd,0xe1,0xd5,0xc5,0x9a,0x02,0xc6,0x76,0x66,0x1e,0x3e,0x66,0x1d,0xa7,0xd8,0x88,0x3a,0x0e,0x7f,0xaa,0x9e,0x60,0x46,0x93,0x00,0x00,
+ 0x05,0x20,0x8c,0x59,0xa7,0x91,0x92,0xe6,0xba,0x1a,0x1d,0xcd,0x7c,0xdf,0xf5,0x86,0x61,0x7c,0x59,0x6b,0x24,0xe1,0x2c,0xc9,0x8e,0x51,0x35,0x56,0xba,0xd1,0x2e,0xff,0x89,0x23,0x00,0x00,
+ 0x05,0x20,0x8d,0x53,0x9b,0x81,0x5b,0x4d,0x6d,0x69,0xa3,0xea,0x59,0x43,0xee,0x5a,0x32,0x62,0xca,0x29,0x78,0x44,0x44,0x0f,0x90,0x85,0x89,0xc3,0x5c,0xa6,0xf6,0x79,0xd9,0x0d,0x00,0x00,
+ 0x05,0x20,0x8d,0x8c,0x5d,0x59,0x3a,0xbf,0xbd,0x79,0xb5,0x37,0xd8,0xcc,0x6b,0x9d,0x54,0xc7,0x8d,0x54,0x1e,0xb4,0x8f,0x35,0x30,0xa9,0xc4,0x4f,0x82,0x3f,0xa2,0x8a,0x74,0x11,0x00,0x00,
+ 0x05,0x20,0x8d,0xc1,0x31,0x70,0x3f,0x70,0x4c,0xe9,0x57,0x2d,0x7c,0x22,0xcc,0x45,0x7e,0x9e,0x35,0x84,0x5c,0xe8,0xfc,0x5e,0x13,0xf3,0xb2,0x73,0xe1,0x6c,0x99,0x78,0x43,0x0c,0x00,0x00,
+ 0x05,0x20,0x8e,0x36,0x8a,0x00,0x01,0x2f,0x48,0xaf,0xed,0xd3,0x2d,0x44,0x7b,0x46,0x11,0xc1,0x33,0xb6,0xc8,0xd0,0xef,0xc2,0xf6,0x65,0x58,0xcd,0x19,0x03,0x94,0x27,0x34,0xc1,0x00,0x00,
+ 0x05,0x20,0x8e,0x1f,0x2c,0x41,0xc3,0xd6,0x21,0xbc,0x80,0xc2,0xad,0x45,0xaf,0x73,0x75,0xc0,0xe7,0x5e,0x65,0x9a,0x25,0xbb,0x1d,0xdb,0xaa,0x4e,0x71,0x0d,0x49,0xb5,0xcd,0x74,0x00,0x00,
+ 0x05,0x20,0x96,0xfa,0x75,0xb5,0x94,0x62,0x8c,0x39,0x55,0x3a,0x31,0x1e,0xdb,0x45,0xdc,0xb3,0xb4,0x7f,0xce,0x5f,0x18,0xd2,0x73,0xa0,0xf0,0x31,0xb1,0x66,0xfe,0x02,0xc3,0x34,0x00,0x00,
+ 0x05,0x20,0x96,0xe2,0x12,0x75,0xbf,0x5e,0x31,0xe9,0x30,0x91,0x7a,0x8d,0x1e,0x20,0x53,0xc8,0x6a,0xa1,0x22,0x9f,0x35,0xf0,0x9f,0x66,0x16,0xdd,0xf1,0x6f,0x6a,0x2c,0x45,0x4e,0x00,0x00,
+ 0x05,0x20,0x97,0x37,0x6e,0x4e,0x4c,0xcb,0x06,0x3a,0xd3,0x42,0xbd,0x0c,0x7d,0x2e,0xfc,0x77,0x59,0x47,0xee,0x2a,0xaa,0x4e,0xce,0x77,0xb4,0xd4,0x20,0xf3,0x70,0x30,0x59,0xf1,0x00,0x00,
+ 0x05,0x20,0x97,0x20,0xb5,0xe3,0x88,0xb6,0x49,0x52,0x25,0x5c,0x25,0xfb,0x92,0xc0,0xe1,0xe4,0xfd,0xef,0x3b,0xfb,0x65,0x46,0xcc,0x70,0xcf,0xa7,0x3f,0x37,0x87,0xff,0xeb,0x52,0x00,0x00,
+ 0x05,0x20,0x97,0x57,0x2e,0x6a,0xb9,0x28,0x21,0x93,0x45,0x31,0xf0,0xaa,0x65,0x30,0xc8,0x29,0x11,0xa8,0xce,0xa9,0xfd,0x32,0x05,0xa5,0x4f,0x93,0x27,0xed,0x26,0xd3,0x65,0x6f,0x00,0x00,
+ 0x05,0x20,0x97,0xa8,0xc2,0xe6,0xc4,0xd7,0xef,0xf0,0x67,0x58,0x4c,0x8d,0x02,0xcd,0x39,0x05,0x9c,0x9e,0xae,0x22,0x89,0xae,0xb1,0xa8,0xb6,0x2c,0x35,0x0b,0x38,0x2c,0x5e,0x98,0x00,0x00,
+ 0x05,0x20,0x97,0xab,0x21,0x87,0x1a,0x5a,0x00,0x03,0xb7,0x45,0x3f,0xe1,0x58,0x90,0xf0,0x2d,0x25,0xf3,0x03,0x3b,0x7e,0xe9,0xb8,0xbd,0x33,0x2a,0x4e,0xce,0x00,0xf5,0xcf,0x3d,0x00,0x00,
+ 0x05,0x20,0x90,0x36,0xad,0x5d,0x0f,0x0d,0x2c,0xcf,0x68,0x21,0xeb,0x74,0xcb,0x02,0x18,0xc2,0x45,0x5b,0xe4,0x3d,0xda,0x99,0x94,0x35,0xce,0x49,0x9a,0x97,0xb6,0x14,0x8e,0x49,0x00,0x00,
+ 0x05,0x20,0x90,0x06,0xd5,0xe4,0xd4,0x00,0x38,0xaf,0x2a,0xaf,0x42,0xb1,0xaf,0xa3,0x2f,0xdf,0x89,0x1d,0xa3,0xa7,0xff,0x17,0xce,0xe9,0xee,0xa8,0x5a,0x04,0xc2,0x8b,0x5b,0xc4,0x00,0x00,
+ 0x05,0x20,0x90,0x13,0xda,0x08,0xe9,0xf8,0xf2,0xcb,0xa6,0xbb,0x50,0xf2,0x05,0x9a,0x61,0x86,0x6d,0xeb,0x53,0x96,0xcd,0xee,0x34,0x38,0x22,0xd6,0xd9,0xce,0xe8,0x87,0x56,0xf3,0x00,0x00,
+ 0x05,0x20,0x90,0x40,0xb7,0xe8,0x6e,0xbe,0x08,0x39,0xc7,0xba,0x52,0x7b,0xfa,0x83,0x51,0x60,0x51,0xd6,0xbe,0x4f,0xaf,0x07,0x15,0x72,0xb7,0x6d,0x12,0x03,0x7f,0x46,0x9b,0xd1,0x00,0x00,
+ 0x05,0x20,0x90,0xee,0x5c,0x84,0xd6,0xbb,0xcb,0xe3,0x85,0x0a,0xfa,0xb8,0x18,0x33,0xdb,0xb3,0x39,0x75,0x8f,0xf0,0x33,0xb6,0x74,0xac,0xea,0x6b,0x48,0x7c,0xdf,0x18,0x25,0x3a,0x00,0x00,
+ 0x05,0x20,0x91,0xfa,0x7b,0x5b,0x9a,0xad,0x97,0x25,0xf7,0xe2,0x1c,0x5c,0xf0,0x12,0x0c,0x65,0x9d,0x94,0x35,0xb1,0xd4,0xcd,0xeb,0x43,0x8f,0x89,0xbb,0x68,0xaa,0x92,0xad,0xd2,0x00,0x00,
+ 0x05,0x20,0x91,0xde,0x3d,0x89,0x05,0x12,0x5c,0x40,0xdb,0xcf,0x92,0x93,0xc7,0x95,0x91,0x67,0xd7,0x62,0x0a,0x38,0x32,0x5a,0x92,0x77,0xa7,0x23,0xa2,0x79,0x5d,0x9a,0x5b,0x63,0x00,0x00,
+ 0x05,0x20,0x92,0x3b,0x7d,0x95,0xcd,0xd9,0x2d,0xee,0x70,0xb1,0x42,0x06,0x2e,0xbb,0x72,0xc4,0x4b,0xda,0xf9,0x4a,0xe3,0xef,0x74,0xd4,0xe8,0x09,0x2b,0xb7,0x0e,0xea,0xfb,0x71,0x00,0x00,
+ 0x05,0x20,0x92,0x14,0xa6,0x46,0xf5,0xf5,0x81,0x3d,0x7b,0xb1,0x78,0x31,0xa9,0xab,0xe9,0xc5,0xb1,0x55,0xe5,0x44,0x53,0xdc,0xb6,0x5b,0x0f,0xd1,0x17,0xd3,0x7d,0x08,0x3c,0xab,0x00,0x00,
+ 0x05,0x20,0x92,0x5f,0x0c,0x17,0x71,0x87,0xdc,0x91,0x01,0x6b,0x1a,0xf0,0x1a,0xe3,0x07,0xea,0xe0,0x88,0x75,0x3b,0x00,0xc9,0xdb,0x7a,0x77,0x26,0xf9,0xfd,0xe0,0x27,0x56,0xe4,0x00,0x00,
+ 0x05,0x20,0x92,0xbe,0x04,0x55,0x44,0x1f,0x7d,0xb3,0x78,0xda,0x8a,0x35,0x20,0x18,0xcd,0x47,0xd3,0x0c,0xdd,0x94,0x15,0x20,0x0f,0x5d,0x54,0x18,0x8c,0x9a,0xbc,0x29,0x96,0x06,0x00,0x00,
+ 0x05,0x20,0x92,0xc2,0x19,0x22,0x1a,0x7b,0x1d,0x48,0x1e,0x7b,0x3e,0x5a,0x02,0xb5,0xd6,0x87,0xe5,0x7c,0xad,0x03,0x65,0x8c,0x72,0x88,0xff,0x42,0x21,0xee,0x47,0x23,0x3d,0xa2,0x00,0x00,
+ 0x05,0x20,0x92,0xc9,0xb1,0x04,0x23,0x73,0x3d,0x15,0x34,0x5b,0x1c,0x61,0x30,0x58,0x53,0x7e,0x3d,0xbe,0xa0,0x40,0xe8,0xfa,0x62,0x45,0x29,0x18,0x0e,0x5c,0x31,0x4e,0x57,0x18,0x00,0x00,
+ 0x05,0x20,0x92,0xda,0xca,0x4c,0x9d,0x77,0x8f,0xad,0xac,0x68,0x66,0xf9,0x68,0xbb,0x99,0x3f,0x20,0x0d,0x3c,0x47,0x6c,0x94,0xc1,0xbc,0x8a,0xd3,0x72,0x2f,0xd3,0xae,0xcf,0xd3,0x00,0x00,
+ 0x05,0x20,0x93,0x4a,0x86,0xc8,0x2b,0x3f,0x13,0xcb,0x4a,0xba,0x6f,0x54,0xc5,0x16,0xe1,0xac,0x32,0x22,0x23,0x51,0xc1,0x71,0x4e,0x1c,0x90,0xc7,0xa9,0xfd,0xb1,0xd2,0x23,0xfd,0x00,0x00,
+ 0x05,0x20,0x93,0x65,0x6d,0x92,0xc5,0xfd,0x93,0x3b,0x49,0xe8,0xa2,0x77,0xb3,0xee,0xb3,0xbb,0x70,0x15,0xae,0x91,0xc8,0xac,0xcf,0xd3,0xda,0x45,0x26,0x5e,0xbc,0xee,0x44,0xd5,0x00,0x00,
+ 0x05,0x20,0x93,0x9c,0xef,0x81,0x2e,0xff,0x00,0x97,0x79,0x9a,0xc3,0x98,0x21,0x79,0x22,0x71,0x46,0x65,0x0d,0xd8,0x48,0x83,0x17,0xaf,0x6d,0xc5,0x6b,0x49,0x47,0xc5,0xb7,0xe6,0x00,0x00,
+ 0x05,0x20,0x93,0xa2,0xe0,0xdb,0x5a,0x89,0x23,0x13,0xbe,0xfd,0x9f,0xbe,0x97,0x62,0x00,0x46,0xdd,0x4f,0x5e,0x55,0x85,0xc3,0xfb,0x0d,0xcc,0x9b,0x6c,0xd8,0x66,0x6c,0xe4,0x8c,0x00,0x00,
+ 0x05,0x20,0x93,0xa6,0xfa,0x8a,0x10,0xce,0x59,0x3c,0x79,0x6b,0x43,0x2c,0xba,0xa9,0xb0,0x90,0xc5,0x87,0xb7,0x96,0x93,0x6c,0xaf,0x7f,0xea,0x23,0xf2,0xcc,0x7f,0xd6,0xd1,0xa0,0x00,0x00,
+ 0x05,0x20,0x93,0xc2,0x1d,0xf1,0x72,0x5a,0xb5,0x35,0x8e,0xd9,0x8f,0x30,0x34,0x68,0x54,0x5a,0xbf,0x2b,0x99,0x7b,0x43,0x03,0xa3,0x1b,0xfc,0xf5,0xc3,0x78,0x40,0x49,0xfd,0x73,0x00,0x00,
+ 0x05,0x20,0x93,0xe8,0x00,0x6b,0x1e,0x84,0x81,0x8b,0x61,0xea,0x5e,0x7e,0x89,0x88,0x3d,0x52,0xc9,0x27,0x18,0x85,0xd5,0xfd,0xe6,0x70,0xab,0xb4,0xb5,0x1e,0xff,0x90,0x48,0xba,0x00,0x00,
+ 0x05,0x20,0x94,0x12,0x98,0x62,0x27,0x3f,0x3a,0x97,0x98,0xaf,0xf7,0x90,0x34,0x22,0x26,0x3f,0x44,0xaf,0x97,0x92,0xff,0x88,0x4d,0x2f,0xa1,0x5a,0x38,0xe0,0xc9,0xd3,0xa7,0xf3,0x00,0x00,
+ 0x05,0x20,0x94,0x12,0xe8,0xca,0x00,0x60,0x70,0x82,0x36,0x8c,0x37,0x60,0xfb,0x6c,0xae,0x2c,0xd4,0xfe,0x72,0xaf,0x90,0xf8,0xbb,0x29,0x66,0x0a,0xf8,0xb0,0x1b,0x8c,0x67,0x8d,0x00,0x00,
+ 0x05,0x20,0x94,0x23,0xef,0x14,0x87,0xd1,0xb6,0x5f,0x05,0x4d,0x9e,0xa6,0xd5,0xcd,0x8d,0x3c,0x06,0xac,0xba,0x1b,0x49,0xc6,0x00,0x4c,0xb4,0x94,0x8f,0x1a,0xfa,0xba,0xc9,0xd8,0x00,0x00,
+ 0x05,0x20,0x94,0xd7,0x30,0x49,0x85,0xe0,0x7b,0xc9,0x46,0x29,0x0e,0xd8,0x5f,0x9d,0x33,0x4d,0x59,0x5a,0xb2,0x5a,0xf0,0x67,0x70,0x28,0x42,0x1c,0xd6,0xb3,0x45,0x9a,0x86,0x4d,0x00,0x00,
+ 0x05,0x20,0x95,0x3e,0x3e,0x05,0x14,0x8a,0x0e,0xac,0x47,0x70,0x21,0x01,0xf6,0x01,0x4a,0xbe,0x50,0xab,0xc7,0xb9,0x47,0x32,0xda,0xc7,0x07,0xd8,0x52,0x49,0x3d,0xef,0x29,0xef,0x00,0x00,
+ 0x05,0x20,0x95,0x99,0x30,0x3a,0x4f,0xa8,0x28,0xff,0xb0,0x9b,0x1d,0x72,0xbb,0x76,0xee,0x23,0x8e,0x74,0xf3,0x2d,0xec,0x3c,0x03,0x22,0xa8,0x2f,0xd5,0x79,0xc8,0x96,0x24,0x51,0x00,0x00,
+ 0x05,0x20,0x96,0x0f,0x72,0x1e,0xab,0xf4,0x68,0x15,0xdb,0xca,0xee,0x24,0xcc,0x8a,0x50,0x8e,0x47,0x26,0x8f,0xe4,0x84,0x43,0x60,0x2c,0xaa,0xa9,0xcc,0x51,0x09,0xf4,0xd3,0xa5,0x00,0x00,
+ 0x05,0x20,0x96,0x14,0x9b,0x6d,0x2d,0x0f,0xdb,0xe0,0xbb,0xbf,0xe5,0x9a,0xf4,0x02,0xe7,0x7e,0x9a,0xce,0x18,0x5e,0x38,0xb8,0x93,0xf2,0xbe,0x9c,0x64,0x17,0x85,0xd8,0x93,0x9c,0x00,0x00,
+ 0x05,0x20,0x96,0x21,0x7c,0x2f,0xdf,0x0f,0x0e,0x37,0x76,0x9b,0x4c,0xd4,0xac,0xc8,0x01,0x10,0xab,0x34,0x80,0x91,0x7d,0x24,0x77,0x57,0xed,0x88,0xb4,0x5e,0x6a,0xfe,0xf9,0x52,0x00,0x00,
+ 0x05,0x20,0x9e,0x89,0xce,0xa6,0x5c,0x1b,0x78,0x22,0xcb,0x18,0x25,0x59,0xaf,0x67,0xab,0x9d,0x59,0x4f,0x2c,0xb3,0xbe,0x50,0x94,0x70,0xac,0xdd,0x79,0x5d,0x4f,0x78,0x50,0x1c,0x00,0x00,
+ 0x05,0x20,0x9e,0xf5,0x01,0x0b,0x53,0x0a,0x4d,0x0b,0xc7,0x03,0x8e,0xa7,0x73,0x33,0x80,0x39,0xce,0x02,0x6f,0x2a,0x53,0x92,0xc3,0x50,0x87,0xb7,0x4d,0x20,0xce,0x23,0xad,0xe4,0x00,0x00,
+ 0x05,0x20,0x9f,0x37,0x08,0x66,0x97,0xfa,0x15,0xf5,0x29,0x1a,0x8d,0xe6,0x85,0xac,0x46,0x0d,0xe3,0x96,0xd0,0xe9,0x00,0xbf,0x69,0xc0,0xfd,0xd4,0xa0,0xea,0xab,0xa0,0xc6,0xef,0x00,0x00,
+ 0x05,0x20,0x9f,0x1a,0xe9,0xad,0x03,0xe0,0x48,0x9b,0x67,0x53,0xcd,0x04,0xfa,0x90,0x6d,0x51,0x29,0x25,0x11,0xaf,0x6d,0x3b,0x28,0x08,0x23,0x39,0xf6,0xb8,0x3a,0x88,0x34,0x2e,0x00,0x00,
+ 0x05,0x20,0x9f,0x44,0x3f,0xc3,0x7e,0x6b,0xbc,0x37,0x5c,0x74,0xa5,0x55,0xd7,0xc8,0x77,0xe7,0xf2,0xbf,0xba,0x92,0x68,0x94,0x93,0x5b,0xe2,0xf6,0x63,0xb7,0x6d,0x44,0xf9,0x4a,0x00,0x00,
+ 0x05,0x20,0x9f,0xcc,0x16,0x10,0xb2,0x7b,0x70,0xd0,0x13,0x2c,0xad,0xf9,0xce,0x95,0x20,0x7b,0xf5,0xc7,0xa5,0x25,0xfd,0xaf,0xb2,0x55,0xf6,0x5b,0x1c,0xbc,0xe2,0x9b,0xb2,0x3b,0x00,0x00,
+ 0x05,0x20,0x98,0x1a,0xc3,0xd5,0x4e,0xc0,0xf7,0xd5,0x17,0xc0,0xd3,0x4e,0x9e,0xc5,0x81,0xb3,0xe7,0xb9,0x1c,0x5e,0x99,0xf0,0xf9,0x2c,0x9c,0xeb,0x31,0xdf,0x76,0xce,0x62,0x70,0x00,0x00,
+ 0x05,0x20,0x98,0x60,0x43,0xb1,0x9b,0x6d,0x28,0x5d,0x49,0xf6,0x92,0x5c,0x18,0x8b,0x87,0x37,0xa9,0x74,0xa3,0x8c,0x19,0x16,0x8a,0x9f,0x16,0xcf,0x03,0xf2,0xf5,0x75,0xf4,0x54,0x00,0x00,
+ 0x05,0x20,0x98,0x62,0x91,0x66,0xcb,0xff,0xab,0xf7,0x07,0xc7,0x73,0x77,0xec,0xf8,0xbb,0xeb,0xa6,0xfa,0xf4,0xdc,0xf7,0xe1,0xbd,0xbc,0xd9,0xc6,0x00,0xa7,0xf7,0x5d,0xb5,0x8b,0x00,0x00,
+ 0x05,0x20,0x98,0xaf,0xb2,0xce,0x43,0x5e,0xfd,0x45,0x62,0x54,0xa1,0x2d,0x81,0x81,0xe3,0xcd,0x29,0xc0,0x2c,0x96,0xc1,0xb5,0xa9,0x42,0x84,0x46,0xac,0x30,0x70,0x1f,0xe4,0xc2,0x00,0x00,
+ 0x05,0x20,0x99,0x26,0xe8,0x24,0x06,0x91,0x7e,0x57,0x91,0x20,0x4a,0x2c,0xce,0x45,0xd2,0x84,0x85,0x8e,0x9e,0x90,0x0e,0x7a,0x71,0x40,0xc5,0xa1,0xc1,0xd9,0x8c,0xad,0x5c,0x5b,0x00,0x00,
+ 0x05,0x20,0x99,0x79,0x37,0x64,0xfd,0xa3,0x64,0x6c,0x65,0xe3,0x93,0x22,0x31,0x3c,0x26,0x22,0xad,0xa0,0x1a,0x9f,0x9b,0xfa,0x9a,0xe0,0x4b,0xc8,0xa5,0xd5,0x26,0x83,0xb5,0x9e,0x00,0x00,
+ 0x05,0x20,0x99,0x69,0x59,0xa3,0xf8,0x73,0x5b,0xd7,0xa5,0xf3,0xce,0x6a,0xf9,0x1c,0xfa,0xdd,0xf9,0x18,0x26,0xac,0xd5,0x24,0xe5,0xc4,0x2d,0x5d,0x39,0xa5,0x81,0x3c,0x61,0xf1,0x00,0x00,
+ 0x05,0x20,0x99,0xbc,0x67,0x1f,0x65,0x5e,0x58,0x22,0x47,0xb5,0x71,0x67,0xa6,0x97,0x73,0xa0,0xd9,0xf4,0x2b,0x04,0xce,0xf7,0xcc,0xc7,0x1e,0xf5,0x61,0x76,0x0b,0x88,0x22,0x2e,0x00,0x00,
+ 0x05,0x20,0x99,0xa7,0xf8,0x8c,0xf8,0xb4,0xd7,0x67,0x07,0x9f,0x2a,0xdf,0xe1,0x0a,0x1f,0x7c,0x62,0x13,0xf1,0x0f,0x6d,0x99,0xbb,0xcb,0x34,0xc2,0xa1,0xf0,0x93,0x4f,0x54,0xb1,0x00,0x00,
+ 0x05,0x20,0x99,0xf6,0x34,0xf6,0x50,0xb7,0xfa,0xb3,0x03,0x73,0x69,0x4a,0x19,0x62,0xc0,0x4d,0xc0,0x5a,0xfc,0x55,0x58,0x7f,0x22,0x0f,0xd6,0xfc,0x37,0x6d,0xca,0xf4,0x83,0xbc,0x00,0x00,
+ 0x05,0x20,0x9a,0x75,0x47,0xb0,0x4a,0xe7,0xd0,0xa9,0x94,0xfc,0xab,0x44,0xcc,0x01,0x2d,0x50,0x41,0x38,0x19,0x70,0xce,0x38,0x27,0x40,0x85,0xfd,0x90,0xe7,0x47,0x87,0x0c,0x93,0x00,0x00,
+ 0x05,0x20,0x9a,0xbd,0xbb,0x87,0x34,0x37,0xc6,0x42,0xf8,0x92,0x45,0x5c,0x5b,0x43,0x47,0xd0,0xbb,0xb0,0x47,0x6e,0x9f,0xcf,0x22,0x64,0x70,0xd8,0x19,0x78,0x40,0x0e,0xc4,0x7a,0x00,0x00,
+ 0x05,0x20,0x9a,0xb3,0x4c,0x48,0x1c,0x5a,0x80,0x3e,0xec,0x58,0xb0,0x67,0xe9,0x19,0xe2,0x68,0xeb,0x5a,0x8d,0x49,0x20,0x26,0xf5,0x5b,0x05,0xb1,0x1d,0x1b,0xfe,0x25,0x26,0xc2,0x00,0x00,
+ 0x05,0x20,0x9a,0xf7,0x75,0x29,0xb4,0xa2,0xab,0x84,0x37,0x07,0xac,0xff,0x20,0x67,0x73,0xae,0x75,0xc7,0xcc,0xd8,0x84,0xf3,0x8d,0xa0,0xd8,0x36,0x0a,0x07,0x88,0xba,0x76,0xd7,0x00,0x00,
+ 0x05,0x20,0x9a,0xfd,0xe0,0xa8,0xae,0x85,0x3c,0x40,0x30,0x80,0x84,0xd7,0x68,0xd4,0xb3,0x9e,0x05,0xeb,0xa7,0x72,0xef,0xf2,0x0d,0x9c,0x7f,0x73,0x1a,0x56,0xa4,0xdb,0x47,0x38,0x00,0x00,
+ 0x05,0x20,0x9a,0xcb,0x39,0xa8,0x32,0x3c,0x44,0x8b,0xd3,0xc8,0xf4,0xb0,0xd9,0xaf,0xb7,0x4c,0x9c,0x7f,0x32,0x66,0x2b,0xd1,0x7e,0xf1,0x4d,0x01,0xf0,0x4a,0x1d,0x69,0xa7,0x0c,0x00,0x00,
+ 0x05,0x20,0x9b,0x18,0x96,0x0a,0x36,0x21,0x92,0xa2,0x74,0xb9,0xae,0x8e,0x70,0x6a,0xca,0x44,0xbe,0xbf,0x5c,0x60,0x07,0xca,0xa8,0x6b,0x86,0x27,0x62,0x1a,0xc1,0xf6,0xbe,0x5e,0x00,0x00,
+ 0x05,0x20,0x9b,0x82,0x32,0x5b,0xdd,0xef,0x05,0xff,0x24,0xf1,0xa2,0xc4,0x3d,0x4a,0x46,0xa9,0x0b,0xf1,0xc7,0x08,0x6a,0x35,0x74,0xdc,0x8c,0xd6,0x69,0x23,0x93,0x7f,0xc0,0xa8,0x00,0x00,
+ 0x05,0x20,0x9c,0x68,0x2a,0xac,0x16,0x7d,0x0b,0x19,0x65,0x58,0xe6,0x72,0x73,0xde,0x63,0x1b,0x4e,0x87,0x71,0x8d,0x80,0x2d,0x91,0x73,0xed,0xfa,0x90,0xaf,0x23,0x9c,0xe3,0x35,0x00,0x00,
+ 0x05,0x20,0x9c,0x8b,0x1f,0x66,0xa2,0x34,0x99,0x6d,0x11,0x40,0xbc,0x21,0x35,0x0e,0x2d,0x0a,0x03,0xda,0x21,0xdf,0x59,0x99,0x19,0xb2,0x42,0x8d,0x6c,0x4d,0x0f,0x9e,0x37,0xd3,0x00,0x00,
+ 0x05,0x20,0x9c,0xa2,0xb0,0xdc,0x18,0x3a,0x0f,0x43,0x47,0xfa,0xde,0x7d,0x15,0x60,0x05,0x32,0xda,0x71,0x63,0x28,0xd6,0x4e,0xe4,0xe6,0x58,0x28,0xd3,0x28,0x29,0x43,0xee,0xc3,0x00,0x00,
+ 0x05,0x20,0x9d,0x77,0x7e,0x28,0x63,0x0d,0x3f,0xdd,0xcd,0xab,0x31,0xcc,0x7d,0xce,0xee,0x33,0xf5,0xe9,0xaf,0x03,0x9f,0x3f,0x15,0xf6,0x42,0xbf,0xc8,0xeb,0x99,0xae,0x11,0x78,0x00,0x00,
+ 0x05,0x20,0x9d,0x43,0x49,0xc6,0xbf,0xdd,0xcf,0x68,0x06,0x6e,0x93,0x02,0xfd,0x88,0x92,0x1e,0x05,0xd0,0x86,0x72,0x58,0x31,0xc3,0x26,0x45,0xfc,0x72,0x3b,0xf3,0x33,0x36,0x41,0x00,0x00,
+ 0x05,0x20,0x9d,0x5d,0x3a,0xf5,0xfb,0x23,0x2f,0x76,0xcd,0x1a,0x0b,0x6b,0x41,0x04,0xb8,0xe4,0xdd,0xf3,0x5d,0xf3,0xb5,0x4f,0xc8,0x65,0xb4,0x3e,0x3d,0xa3,0x98,0xed,0x4d,0x38,0x00,0x00,
+ 0x05,0x20,0x9d,0xdf,0x1e,0xf9,0x35,0x09,0x76,0xb6,0x40,0xc0,0x76,0x60,0x38,0x64,0xc2,0x51,0x5f,0x43,0x67,0x03,0xe0,0xac,0xf5,0xa9,0x2e,0x74,0xea,0x5d,0x9d,0x5c,0xd2,0x03,0x00,0x00,
+ 0x05,0x20,0x9e,0x0a,0xa3,0xe7,0xc6,0x33,0xd1,0xa8,0xe1,0x44,0xce,0xeb,0xb4,0xf4,0xbb,0x25,0x5a,0x9b,0x95,0xc0,0xa7,0xea,0x4f,0xb3,0x47,0x20,0x28,0xa8,0x8a,0x08,0xa2,0x38,0x00,0x00,
+ 0x05,0x20,0x9e,0x2b,0x2a,0x43,0x1b,0xf0,0xaf,0xac,0x54,0xbf,0x49,0xda,0xa1,0xf5,0xc9,0x17,0x74,0x6f,0x56,0xeb,0xd4,0x6d,0xd8,0x48,0xf0,0xb3,0xd5,0xed,0xbe,0x6e,0xa8,0xc6,0x00,0x00,
+ 0x05,0x20,0x9e,0x7b,0x3b,0x8d,0x0f,0x55,0xc4,0xdc,0x0f,0x22,0x95,0x21,0x6e,0x7e,0x17,0x1d,0x5e,0xe0,0xfb,0x9c,0xa6,0xc5,0x39,0xac,0x31,0x09,0x4d,0xbc,0xbf,0xfd,0xaa,0xff,0x00,0x00,
+ 0x05,0x20,0x9e,0x68,0x30,0x84,0x53,0xb1,0x03,0xf8,0xbd,0xa5,0xd5,0x65,0x6a,0x5b,0x5e,0x4f,0xb7,0x89,0x43,0x33,0x90,0x67,0xf5,0x95,0xe5,0x4f,0xae,0x0a,0x4e,0x84,0x42,0x97,0x00,0x00,
+ 0x05,0x20,0xa6,0xa6,0xd8,0xe2,0x41,0x74,0x21,0x64,0xb7,0xfb,0x05,0x8d,0xc3,0x96,0xf3,0x2a,0x4c,0x18,0x00,0x3e,0xac,0x46,0x6c,0x53,0x9b,0x97,0xbf,0xa4,0x8c,0x40,0x69,0xc4,0x00,0x00,
+ 0x05,0x20,0xa7,0x51,0x7b,0x88,0x7e,0x92,0xeb,0x9b,0xba,0x89,0xee,0xf4,0xd4,0xd2,0x57,0xf9,0x05,0xcb,0x11,0x91,0x2d,0x98,0x6f,0x1a,0xcb,0x9a,0xda,0xa8,0xd2,0x81,0x47,0xb7,0x00,0x00,
+ 0x05,0x20,0xa7,0xb7,0xde,0x7f,0xf4,0xbc,0x25,0xfc,0xf2,0x95,0xb5,0xf5,0xae,0x53,0xce,0x4b,0x76,0x2d,0x92,0xc2,0x0f,0xbc,0x5d,0xa7,0xf0,0x58,0x73,0x0c,0x46,0x24,0xad,0xd2,0x00,0x00,
+ 0x05,0x20,0xa7,0xad,0x1b,0x73,0xf8,0x2a,0x47,0x95,0x78,0x1f,0x68,0xbc,0x2f,0x48,0x55,0x2b,0x95,0x6a,0x41,0x95,0xa1,0xee,0x43,0xc2,0xb8,0x64,0x6b,0xf7,0x59,0x00,0x4d,0xd0,0x00,0x00,
+ 0x05,0x20,0xa7,0xe8,0xa5,0xb6,0xd3,0x38,0x63,0x86,0xc7,0x79,0xd1,0x85,0xbc,0x5c,0xac,0x47,0x70,0xe2,0x32,0x54,0x32,0x42,0x1e,0x35,0x9c,0xe5,0xf5,0xe2,0xeb,0xb5,0xbb,0xfb,0x00,0x00,
+ 0x05,0x20,0xa7,0xf0,0x66,0xec,0xe4,0x74,0xaf,0x4f,0x2f,0x43,0x41,0x37,0xcc,0x7e,0xd3,0x21,0x2e,0x57,0xf8,0xfa,0xb7,0x53,0xb6,0x9e,0x3c,0xd7,0x30,0xe0,0xaf,0x12,0x41,0xb1,0x00,0x00,
+ 0x05,0x20,0xa0,0x0d,0x2f,0x1d,0x9e,0xe7,0x8b,0xa8,0x4b,0x10,0x29,0xf2,0x99,0xea,0xeb,0x6a,0x60,0x14,0x39,0xe8,0x70,0xcc,0x7c,0x59,0xd2,0x19,0xb3,0xf0,0xda,0x61,0x31,0xa6,0x00,0x00,
+ 0x05,0x20,0xa0,0xbb,0xa8,0xe7,0x3c,0xbd,0x3a,0x85,0x5f,0xc7,0x5f,0xa3,0xe9,0x42,0xe5,0x62,0x31,0x8b,0xc8,0xa5,0x78,0xa9,0xd2,0xc6,0x33,0x23,0xc5,0x94,0x0e,0xc9,0xb5,0x0e,0x00,0x00,
+ 0x05,0x20,0xa0,0xcb,0x73,0xea,0x3d,0xc1,0x69,0xdc,0xff,0x0d,0xc8,0x05,0x48,0xfd,0xfb,0x37,0xe8,0x6d,0xf5,0x45,0x06,0xf6,0x63,0x92,0x5a,0x08,0x32,0xf1,0xa2,0xb7,0x59,0xe5,0x00,0x00,
+ 0x05,0x20,0xa0,0xd5,0x68,0x0d,0xdd,0x70,0xcd,0xd6,0xbd,0xbd,0xd4,0x68,0x44,0x3c,0xc7,0x6f,0x5c,0xc3,0xd5,0xc9,0x99,0xf2,0x36,0x54,0x55,0xa3,0x98,0x6c,0x99,0x74,0x67,0xca,0x00,0x00,
+ 0x05,0x20,0xa0,0xf2,0x1b,0xf5,0x38,0xac,0x5f,0xc3,0x6d,0x14,0x4a,0xc4,0x0f,0xa5,0xab,0x00,0x00,0x0e,0xb3,0x64,0xe2,0x6b,0xc9,0x06,0x3f,0x9d,0x5f,0xe5,0x78,0x43,0x48,0xbb,0x00,0x00,
+ 0x05,0x20,0xa1,0x4c,0xe0,0x03,0xc6,0xff,0x3d,0x9c,0xbd,0xe7,0xa5,0x6f,0x47,0x32,0x88,0xca,0xb0,0x57,0xe7,0x9d,0x11,0xe1,0x30,0x7e,0x4a,0x8e,0x2d,0x08,0x78,0x49,0x0c,0x1a,0x00,0x00,
+ 0x05,0x20,0xa1,0x51,0x39,0xc5,0x71,0xe1,0x01,0x49,0xbc,0xf4,0x86,0x68,0xe9,0x8b,0xe1,0xdd,0xef,0xaf,0xb7,0x97,0x36,0x3a,0x02,0xb3,0x85,0x70,0xbc,0xd9,0x57,0xbe,0x87,0xd4,0x00,0x00,
+ 0x05,0x20,0xa1,0xad,0xdc,0x84,0xf2,0xd3,0xeb,0x23,0x5d,0x04,0x52,0xd8,0x2f,0x67,0x99,0xf0,0xfa,0x2a,0xe2,0x97,0xe3,0xc5,0x37,0x97,0x54,0x19,0xd2,0x6b,0xd4,0x09,0x74,0xf4,0x00,0x00,
+ 0x05,0x20,0xa2,0x4d,0xe0,0xf0,0x58,0xb9,0xd1,0xd7,0x97,0x8f,0xa5,0xab,0x6a,0x3e,0x91,0xda,0x06,0x36,0x6b,0x74,0x40,0x40,0xf4,0x19,0xf6,0x5f,0x03,0x29,0xd5,0x73,0xe0,0xaa,0x00,0x00,
+ 0x05,0x20,0xa3,0x47,0x9a,0x16,0x49,0x20,0x79,0x05,0x97,0xf8,0xea,0xd6,0x7e,0xfa,0x69,0x47,0xb2,0xb3,0xce,0x47,0x5c,0xb0,0x79,0xf3,0x09,0x1c,0x81,0xa5,0x70,0x18,0xbf,0xeb,0x00,0x00,
+ 0x05,0x20,0xa3,0x83,0x67,0x3c,0xed,0xcc,0x21,0xcc,0x1d,0xef,0xef,0x00,0x89,0x50,0x7d,0x72,0x4d,0x1b,0xc3,0xcf,0x04,0x99,0x0e,0x02,0x1e,0x85,0xbe,0x33,0x99,0x22,0x74,0x1e,0x00,0x00,
+ 0x05,0x20,0xa3,0x87,0x81,0x24,0x72,0x13,0xe9,0x15,0x90,0xce,0xd3,0x63,0x2f,0xbe,0x6e,0xc9,0x35,0xe7,0xfb,0x5b,0xf4,0xf5,0x1d,0x4c,0x17,0xed,0x02,0x33,0x23,0xc3,0xa4,0x00,0x00,0x00,
+ 0x05,0x20,0xa3,0x8f,0x4b,0xb5,0x23,0xd7,0xc4,0x59,0x82,0x21,0x2f,0x94,0x7e,0x0b,0x2c,0x74,0xed,0x59,0x4d,0xee,0x6e,0xa4,0x69,0x6a,0xaf,0x29,0x60,0xa3,0x30,0xdf,0x35,0x2e,0x00,0x00,
+ 0x05,0x20,0xa3,0xf4,0xaa,0x0e,0xd0,0x73,0x21,0x1b,0x54,0xae,0x33,0x5a,0x7c,0xe9,0x89,0xb4,0x2a,0xa3,0x3d,0x4d,0x2e,0x24,0x27,0xf2,0x84,0xea,0x1c,0x4a,0xee,0x1c,0x48,0xfb,0x00,0x00,
+ 0x05,0x20,0xa3,0xd8,0x4f,0x8b,0xdc,0x1d,0x92,0x60,0xcf,0xf6,0xfe,0xb0,0x5e,0xe0,0x6b,0xd8,0xf0,0xfd,0x74,0x73,0x23,0x62,0xa8,0x7b,0x3b,0x05,0xbc,0x70,0xa2,0x22,0x86,0x64,0x00,0x00,
+ 0x05,0x20,0xa3,0xdf,0x77,0x0c,0xbe,0x0e,0x77,0x04,0x06,0xaf,0xce,0x6b,0x32,0x0d,0x7d,0x5a,0xb6,0x7f,0x96,0x4b,0x8d,0x98,0x41,0xe8,0x4c,0x85,0x46,0xf3,0x4e,0xb0,0x55,0x75,0x00,0x00,
+ 0x05,0x20,0xa4,0x60,0xb8,0xec,0x44,0x47,0xde,0xfd,0x0a,0x34,0x30,0x39,0x3b,0xdd,0x8c,0xa9,0x17,0xb0,0x9f,0xed,0x90,0x61,0x98,0x65,0xe4,0xfb,0x99,0x56,0x05,0x9c,0xaf,0xfa,0x00,0x00,
+ 0x05,0x20,0xa4,0x8d,0x04,0x26,0x36,0x3c,0xec,0x67,0x11,0x49,0x14,0x75,0xec,0x40,0x46,0x7b,0x45,0x67,0xc8,0x92,0x14,0x63,0xb2,0x11,0x5b,0xe9,0x37,0x13,0xaa,0x33,0x7c,0xdc,0x00,0x00,
+ 0x05,0x20,0xa5,0x39,0xfa,0x5c,0x70,0x84,0xeb,0xa7,0xc1,0xd1,0x08,0x2e,0xd3,0x9c,0xac,0x14,0xae,0xc5,0x36,0xaf,0x89,0x00,0xc0,0xc2,0x0a,0x74,0xa3,0xce,0x87,0x9c,0x3f,0x50,0x00,0x00,
+ 0x05,0x20,0xa5,0x79,0xc6,0x25,0xd0,0x8a,0x76,0xcd,0x9b,0x39,0xed,0xae,0xb6,0xcb,0x33,0xeb,0xea,0x65,0x6d,0x10,0x58,0xb6,0xf6,0x40,0xa4,0xf5,0x1b,0xe3,0x5c,0x18,0x96,0x85,0x00,0x00,
+ 0x05,0x20,0xa6,0x24,0x76,0x79,0xae,0x50,0xd3,0x88,0x6d,0x7c,0xde,0xb5,0xc0,0x4f,0x51,0x41,0x9e,0x0e,0x65,0x88,0xc6,0x03,0x4a,0x17,0x10,0xd6,0xa7,0xc5,0xfb,0xa8,0x02,0xd9,0x00,0x00,
+ 0x05,0x20,0xa6,0x25,0x51,0xc8,0xfa,0x0e,0x50,0x26,0x0e,0x10,0x1a,0xfe,0x4c,0xd0,0xb3,0xb8,0xb1,0x6c,0x81,0xee,0x38,0x72,0xbe,0x81,0xfd,0x3e,0x10,0x86,0xa9,0x1b,0xef,0x19,0x00,0x00,
+ 0x05,0x20,0xa6,0x31,0xc1,0x84,0xb8,0xbe,0x91,0xab,0xec,0xce,0x70,0x45,0xea,0x5d,0x3c,0x68,0x7e,0xa9,0xe6,0x54,0xfe,0xb2,0xb5,0x4b,0x0f,0x49,0x51,0x23,0x28,0x1b,0xbb,0x66,0x00,0x00,
+ 0x05,0x20,0xa6,0x4c,0x56,0x49,0x22,0x0a,0x6e,0x89,0xcf,0xc1,0x20,0xf6,0xfd,0x99,0xe3,0xcd,0x51,0x87,0x3f,0x51,0xce,0xc5,0x78,0x62,0x9e,0xe1,0x05,0xbc,0xea,0x3d,0x43,0x20,0x00,0x00,
+ 0x05,0x20,0xa8,0x72,0xfe,0x49,0x2a,0x34,0x2d,0x86,0x37,0x59,0xe2,0x14,0x10,0x13,0xf1,0xae,0xc4,0xb0,0xbb,0xf5,0xaf,0x19,0x6a,0xf0,0xb3,0xfc,0xe9,0xfa,0x06,0x2c,0x09,0x0e,0x00,0x00,
+ 0x05,0x20,0xa8,0x95,0x26,0xe2,0x98,0xb6,0xd1,0xe3,0x96,0xa8,0x70,0x7b,0x8c,0xbb,0x0d,0x87,0xdc,0xab,0xa3,0xdf,0xf8,0x6d,0xfd,0x6b,0x9a,0xfe,0xca,0x93,0xc9,0x5a,0x51,0xa2,0x00,0x00,
+ 0x05,0x20,0xa8,0xde,0x57,0x00,0xf7,0x91,0x3e,0x24,0x89,0x16,0xea,0xfe,0x52,0x86,0xd9,0x17,0x89,0xcb,0x8d,0x65,0xed,0x17,0x58,0xab,0x7c,0x66,0x59,0xa3,0x63,0x8c,0x3a,0xed,0x00,0x00,
+ 0x05,0x20,0xa8,0xeb,0xa0,0x22,0x66,0x82,0x04,0x0e,0x4c,0x10,0x13,0x12,0x4b,0xdb,0xb7,0x28,0x62,0x50,0x9e,0xa5,0xea,0xa9,0x7b,0x54,0xa9,0x2e,0xf0,0x85,0x23,0xa0,0xe8,0x93,0x00,0x00,
+ 0x05,0x20,0xa9,0x27,0xe8,0x5a,0xc0,0xff,0x13,0x18,0x45,0x39,0x13,0x3f,0x85,0x95,0xf1,0xcd,0x9e,0xd9,0xec,0xeb,0xca,0x6a,0xa0,0xb4,0x0e,0x45,0x78,0xed,0x67,0x2a,0x8e,0xe5,0x00,0x00,
+ 0x05,0x20,0xa9,0x28,0x24,0x1d,0x83,0xff,0x1a,0xda,0x31,0x14,0x6d,0x63,0x4c,0x26,0x5e,0x53,0xd3,0x2e,0xca,0x16,0xe8,0xdf,0x15,0x8d,0x79,0x11,0x7e,0x8d,0x9f,0x88,0x32,0x86,0x00,0x00,
+ 0x05,0x20,0xa9,0x2c,0x38,0xa2,0x4c,0xcd,0x9a,0xbb,0xae,0xad,0x47,0xe4,0xb7,0xc3,0xfa,0xd5,0x97,0x62,0x81,0x88,0xd1,0x16,0x63,0xd0,0x6c,0xd3,0x8a,0x24,0x9d,0xe9,0x14,0xbc,0x00,0x00,
+ 0x05,0x20,0xa9,0x76,0xbd,0x97,0xb4,0x6a,0xed,0x12,0xb2,0x3b,0x2a,0x1e,0x77,0xb9,0x86,0x92,0xee,0x66,0x79,0x9c,0x11,0xcd,0xfd,0x22,0x65,0xe7,0x70,0x5a,0x6c,0x31,0x66,0x35,0x00,0x00,
+ 0x05,0x20,0xa9,0x5f,0x90,0x4a,0x32,0x8c,0x0f,0xb5,0xad,0x54,0x1b,0x01,0x2e,0x97,0x0c,0xb3,0x74,0xe3,0xca,0xd0,0x46,0xea,0x05,0x09,0x66,0x67,0x8a,0xde,0x34,0x3e,0x97,0x6f,0x00,0x00,
+ 0x05,0x20,0xa9,0x94,0xea,0x73,0x12,0xa5,0xea,0x75,0xde,0x36,0x2f,0x5b,0xa4,0x1d,0xbc,0x29,0x71,0x5a,0x90,0x6b,0xa5,0x1b,0xcf,0xaf,0xc3,0x70,0x51,0xdc,0x0b,0x28,0xc6,0xdb,0x00,0x00,
0x05,0x20,0xa9,0xa9,0xe5,0xae,0x01,0xc2,0x5e,0x76,0x2f,0x5d,0xa3,0x07,0xdc,0xce,0xb8,0xbc,0x6f,0x47,0xaf,0x3a,0x37,0xf8,0x5c,0x86,0xff,0xe9,0xb6,0xa5,0x00,0x93,0x76,0x11,0x00,0x00,
- 0x05,0x20,0xb2,0x63,0x45,0xf5,0x36,0xb0,0x79,0x58,0x0d,0x8a,0x54,0x52,0x16,0x2f,0x1f,0x74,0x93,0xe0,0x30,0x82,0x1b,0xe4,0x01,0x76,0xf5,0x03,0xa1,0x19,0xa3,0x8d,0x0e,0xce,0x00,0x00,
+ 0x05,0x20,0xaa,0x7b,0xc1,0xe9,0xea,0x19,0x21,0x51,0x51,0x3d,0xc2,0x88,0x63,0x47,0xc9,0x69,0xce,0xd6,0x43,0xb0,0xf4,0x09,0xf6,0xce,0x75,0x0f,0xb0,0x92,0x4e,0xc4,0x00,0xd8,0x00,0x00,
+ 0x05,0x20,0xaa,0xec,0xea,0xa7,0xc5,0xbe,0x6b,0x39,0x61,0xed,0x64,0x96,0xe1,0x39,0xd3,0x63,0xce,0x4c,0xc7,0xb3,0xb8,0x1b,0x82,0xe7,0x46,0x49,0xdb,0xd5,0x81,0xb1,0x6e,0x8a,0x00,0x00,
+ 0x05,0x20,0xab,0x01,0x37,0x86,0x9a,0xa9,0x7a,0xff,0xf9,0x5a,0x23,0x32,0x6d,0x4d,0x38,0x82,0x3c,0xff,0x61,0x3b,0x12,0xf9,0x9d,0xe9,0xa2,0x19,0xf3,0xbf,0xd0,0x2f,0x8a,0x8e,0x00,0x00,
+ 0x05,0x20,0xab,0x03,0x89,0xce,0xe5,0xf4,0xad,0xe4,0x54,0x60,0x61,0x67,0x7a,0x34,0xdc,0xe3,0x15,0x38,0x07,0x95,0x79,0xd8,0xce,0x2e,0x19,0x1c,0x20,0xf1,0x31,0x52,0x99,0x23,0x00,0x00,
+ 0x05,0x20,0xab,0x1c,0xe3,0x0c,0x7d,0x5e,0x67,0x3e,0xd9,0xf9,0x55,0x8e,0x3f,0x7e,0x96,0x6d,0x5f,0x47,0xe0,0x9f,0xc0,0xa4,0x1c,0xf7,0xa9,0x5e,0xbb,0x2a,0x11,0xd6,0x15,0xef,0x00,0x00,
+ 0x05,0x20,0xab,0x7b,0x19,0x47,0x5e,0x8b,0xff,0x8b,0xc6,0x0b,0x44,0x3f,0x57,0x73,0x21,0xf0,0x1c,0x81,0x1c,0x18,0x08,0xf7,0x48,0xd4,0x5d,0x21,0x06,0x09,0x3e,0xe9,0x7e,0xd6,0x00,0x00,
+ 0x05,0x20,0xab,0x6e,0x96,0x65,0xc6,0x02,0x85,0xa0,0x72,0xed,0xed,0xb9,0x07,0x45,0x88,0x84,0xfa,0xa3,0xb5,0x2f,0x9b,0x5c,0x08,0xbb,0xfc,0x21,0xd0,0xd8,0xd7,0x90,0xde,0x0c,0x00,0x00,
+ 0x05,0x20,0xab,0x91,0xda,0x6c,0x19,0x38,0x12,0xd9,0xff,0x9f,0xf4,0xc4,0x85,0x2f,0xac,0x00,0xa7,0x71,0x56,0x72,0x0b,0x63,0x94,0x5e,0xca,0x4f,0xb5,0x03,0xbc,0x16,0xed,0x13,0x00,0x00,
+ 0x05,0x20,0xab,0xc9,0x5b,0xfa,0x6b,0xf3,0x01,0xe6,0x35,0x69,0xe6,0x87,0xc2,0xa8,0x9d,0xf9,0x1b,0xca,0xf6,0x3f,0xf6,0x2f,0xe8,0x89,0x87,0x9d,0x6d,0xcf,0x9a,0x8e,0xdf,0x29,0x00,0x00,
+ 0x05,0x20,0xab,0xd8,0xa1,0x4e,0x07,0x50,0xe0,0x65,0x11,0x53,0xfe,0xa5,0x18,0x33,0x92,0x80,0x16,0x8a,0x1b,0x7f,0xa4,0x35,0x67,0xeb,0x16,0x00,0xf1,0xb7,0xeb,0x7d,0x13,0xc1,0x00,0x00,
+ 0x05,0x20,0xab,0xe7,0x97,0xdc,0x20,0xfb,0xb1,0x2d,0xdb,0x47,0x9a,0x4c,0x7e,0x52,0xee,0x30,0x08,0x3a,0x46,0x43,0x3e,0xb1,0x9e,0xab,0xc4,0xfe,0x0f,0xc0,0xed,0xee,0x55,0x1a,0x00,0x00,
+ 0x05,0x20,0xac,0xbd,0xf9,0x27,0xa2,0x8a,0x84,0x97,0x7d,0x9f,0xe4,0xc7,0x46,0xe4,0x85,0x4f,0x80,0x73,0x44,0xce,0x3c,0xbc,0x43,0x27,0xa9,0xbb,0x1a,0x49,0x66,0xc0,0x73,0xbe,0x00,0x00,
+ 0x05,0x20,0xad,0x20,0xaf,0xf9,0x35,0xb9,0x55,0xde,0x85,0x4e,0xac,0x04,0xc6,0x2a,0xb8,0x13,0x1a,0x32,0x13,0xe9,0xdc,0xe9,0x5f,0x93,0x23,0x0e,0xa4,0xb8,0x95,0xe9,0xc5,0x5c,0x00,0x00,
+ 0x05,0x20,0xad,0xdc,0xa3,0xa9,0x03,0x24,0xd2,0xfe,0x4d,0x31,0x4f,0xd0,0x37,0x26,0xfc,0xe9,0xcd,0x43,0xb5,0x7a,0x06,0x6b,0x06,0x86,0x8b,0x75,0x0d,0x51,0xaa,0x53,0x2e,0xd8,0x00,0x00,
+ 0x05,0x20,0xad,0xe5,0xa2,0x4b,0xc5,0xfd,0x2d,0xaa,0x51,0xa4,0x92,0xc3,0xf4,0x3e,0xac,0x37,0x95,0x03,0xfb,0x13,0x7a,0x49,0x97,0x27,0x4f,0x9d,0xaf,0xf7,0x0f,0x89,0x83,0x2e,0x00,0x00,
+ 0x05,0x20,0xae,0x51,0x8d,0x08,0x31,0x0d,0x56,0x88,0x3d,0x1a,0xf9,0x48,0x05,0x68,0xe8,0x25,0x9d,0x5b,0xcd,0x6a,0x83,0xdf,0x20,0x1a,0x60,0xb9,0x10,0x1f,0x35,0x4e,0x6a,0x9b,0x00,0x00,
+ 0x05,0x20,0xae,0x60,0xeb,0x28,0x7c,0x03,0xb0,0x45,0x01,0xe2,0x92,0xb0,0xb5,0xa3,0xff,0x02,0x76,0x4e,0x95,0xcc,0x45,0xe4,0x9c,0x20,0x16,0x6a,0xc7,0x94,0xf8,0x5d,0x6d,0xe7,0x00,0x00,
+ 0x05,0x20,0xb6,0x81,0xfd,0xb1,0xdc,0x34,0x46,0x6b,0x55,0x59,0x1c,0x8f,0xe6,0xe2,0x93,0x01,0x87,0xc0,0xb3,0x16,0xc5,0x80,0x2b,0xd5,0x0e,0x1d,0xbf,0x76,0xb8,0xbf,0xd0,0x1c,0x00,0x00,
+ 0x05,0x20,0xb6,0x98,0x60,0x64,0x1f,0xe8,0x19,0x1a,0x95,0xc2,0x5f,0xed,0x3f,0x57,0xe4,0x43,0x1f,0x15,0x82,0x54,0x4e,0xc2,0x8e,0x5c,0x99,0x1c,0x75,0x6c,0x40,0xea,0xbe,0x6d,0x00,0x00,
+ 0x05,0x20,0xb6,0xb2,0x8d,0xdd,0xd2,0xe2,0x41,0x9d,0x96,0x7d,0xc0,0x81,0xab,0xf7,0x25,0xdf,0x09,0x21,0x4d,0xec,0xcc,0x17,0x07,0x8e,0x30,0x6c,0xd2,0xc4,0x69,0xdb,0x31,0x42,0x00,0x00,
+ 0x05,0x20,0xb6,0xcf,0x88,0x35,0x74,0x20,0x79,0x8a,0xf5,0x6a,0xca,0x77,0x65,0xb6,0x29,0x7f,0xcb,0x97,0xdd,0xa8,0x37,0xaf,0xe6,0x6e,0xdd,0x1d,0x34,0xf9,0x95,0x22,0x66,0x93,0x00,0x00,
+ 0x05,0x20,0xb7,0x01,0x1c,0x28,0x55,0x17,0xc8,0x25,0x66,0x90,0x8f,0xd5,0x59,0x69,0xa9,0x92,0x5e,0xa6,0xe4,0x3e,0xad,0x64,0xe1,0xbf,0x19,0x7f,0xa7,0x5a,0x6b,0xe1,0xcb,0x94,0x00,0x00,
+ 0x05,0x20,0xb7,0x15,0xc3,0x33,0x62,0x3a,0x31,0x25,0x17,0x32,0x3a,0x17,0x74,0x88,0xef,0x34,0xdf,0x7d,0x5d,0x82,0xf1,0x29,0x55,0x63,0x2a,0xc2,0x6b,0x9a,0x8c,0x30,0x8b,0x98,0x00,0x00,
+ 0x05,0x20,0xb7,0x7b,0x1e,0x61,0x59,0xa7,0xa1,0x3f,0x50,0xef,0xde,0xc9,0x78,0x06,0x0c,0x5c,0xf7,0xdf,0x8a,0x72,0xd5,0x35,0x97,0x23,0xe7,0x55,0x1e,0x78,0x32,0xbd,0x45,0x1e,0x00,0x00,
+ 0x05,0x20,0xb7,0x92,0xbd,0x1a,0x81,0xc4,0x84,0x37,0xd0,0x28,0xc9,0x25,0xd0,0xbf,0xd2,0xe6,0x84,0x89,0xbb,0x8a,0xd7,0xef,0x61,0x26,0xc7,0xff,0xa3,0x5a,0x21,0x5a,0x7c,0x4e,0x00,0x00,
+ 0x05,0x20,0xb0,0x04,0x52,0x59,0x1e,0x21,0xd8,0x5b,0xd4,0xb3,0xbc,0x19,0x10,0x08,0xa7,0xfc,0x89,0xa9,0xfd,0xd9,0x5f,0xb5,0x4e,0x1e,0x54,0xc0,0xf8,0x2e,0xdc,0xb9,0xa0,0x13,0x00,0x00,
+ 0x05,0x20,0xb1,0x10,0x37,0xd6,0x47,0x43,0x47,0xb1,0xb4,0x2b,0xb4,0xc3,0xcc,0xbe,0x52,0x06,0x48,0x46,0xa8,0xbf,0x07,0xb6,0x50,0x54,0x15,0x50,0xb8,0x28,0x9e,0x03,0x57,0xfc,0x00,0x00,
+ 0x05,0x20,0xb1,0xa2,0x13,0xc0,0x8c,0x99,0x7f,0x0a,0x70,0x5e,0x00,0x92,0x81,0x07,0xf4,0xc1,0x09,0xe8,0xad,0x0d,0x01,0x71,0x89,0x56,0xe2,0xd6,0x1c,0x28,0x72,0x7a,0x42,0xc4,0x00,0x00,
+ 0x05,0x20,0xb2,0x4b,0x45,0x5b,0x0e,0x3a,0xd2,0x0b,0x9a,0xbc,0xb3,0x89,0x61,0xcd,0xee,0xba,0x37,0x0f,0x1d,0xb6,0x13,0x48,0x57,0x9a,0x33,0x41,0x74,0xa8,0x16,0x37,0x92,0xdb,0x00,0x00,
+ 0x05,0x20,0xb2,0xc8,0xf4,0x97,0x8b,0xbc,0xb8,0x4e,0xf7,0x71,0x9b,0xdd,0x89,0x79,0x50,0x7e,0x9d,0x91,0x57,0x8f,0x82,0x6d,0x97,0x60,0x20,0xb0,0x97,0xbc,0x9e,0x23,0xae,0x74,0x00,0x00,
+ 0x05,0x20,0xb3,0x17,0x8f,0x0b,0x3d,0x4f,0x79,0x6d,0x1b,0x46,0x40,0x5a,0x75,0xbe,0xb4,0x39,0xf6,0x15,0x63,0x5e,0x14,0x36,0x0e,0xa7,0x1e,0x1b,0xf4,0x73,0x6c,0xe2,0xdf,0x1d,0x00,0x00,
+ 0x05,0x20,0xb3,0x5f,0xaf,0x37,0x0f,0x3c,0x0a,0xc8,0x6e,0x83,0x70,0x8c,0x2b,0x11,0xaf,0x91,0x8b,0x65,0x72,0x52,0xb7,0x77,0x29,0xf2,0xd5,0xb4,0xfc,0xcb,0x17,0xf6,0x66,0xfb,0x00,0x00,
+ 0x05,0x20,0xb3,0x80,0xd0,0x49,0x0b,0xad,0xa9,0xbc,0x16,0x91,0xa9,0xeb,0x04,0xed,0x77,0x1e,0xba,0x1c,0xa7,0x85,0xbd,0xb1,0xb2,0x17,0x70,0x48,0x64,0xed,0x89,0xd9,0xae,0x04,0x00,0x00,
+ 0x05,0x20,0xb3,0xda,0x4b,0x39,0x64,0xf9,0x5c,0x5a,0xda,0xb1,0xaa,0x94,0x62,0xf3,0xb2,0x30,0xaa,0x48,0xad,0xc3,0x70,0xa9,0xf2,0xca,0x6c,0xd0,0x2e,0xfe,0xa4,0xb8,0x54,0x41,0x00,0x00,
+ 0x05,0x20,0xb4,0x61,0x4e,0xf3,0x72,0x95,0x03,0xf5,0x22,0xd9,0x2d,0x0d,0xc7,0x7d,0x9e,0x58,0xba,0x80,0xb0,0x00,0x60,0xc5,0xb7,0x72,0x8e,0xf0,0x3e,0xd9,0xdd,0x10,0xc8,0xf9,0x00,0x00,
+ 0x05,0x20,0xb4,0x82,0x5e,0xcd,0xee,0xf9,0x05,0x20,0x16,0x92,0x2a,0xf1,0x86,0x7f,0x4a,0xf4,0xc3,0x81,0x2c,0xd5,0x80,0x2b,0xdf,0x40,0x05,0xae,0x05,0xc4,0xee,0x4f,0xc8,0xdd,0x00,0x00,
+ 0x05,0x20,0xb4,0xca,0x40,0x86,0xcc,0x95,0xdd,0x8b,0x53,0xcd,0xb7,0x44,0xeb,0x2e,0xf0,0x3c,0xdc,0xab,0xc6,0xe5,0x9d,0x49,0xac,0x90,0x9e,0x2a,0xeb,0x17,0xc0,0xdc,0x4f,0x98,0x00,0x00,
+ 0x05,0x20,0xb4,0xdc,0x7e,0xd7,0xf7,0x66,0xed,0x7e,0x46,0x14,0x98,0x71,0x58,0x01,0x17,0xc0,0x6c,0xb7,0xc6,0xfd,0xa0,0x35,0x84,0x57,0x46,0x00,0xb6,0xf8,0xc5,0x00,0xe9,0x19,0x00,0x00,
+ 0x05,0x20,0xb5,0x10,0xa2,0xd9,0x44,0xbc,0xfc,0xb0,0xaf,0xd4,0x89,0xdd,0x89,0x47,0x40,0x08,0xb0,0x52,0xf5,0x6a,0x66,0x9c,0x98,0xf9,0x85,0x23,0x61,0x0d,0x75,0xb9,0x5a,0xe9,0x00,0x00,
+ 0x05,0x20,0xb5,0x18,0x9b,0x3e,0x3c,0xed,0x0f,0x59,0x98,0xd0,0xf2,0x55,0x92,0x8c,0x1c,0xf9,0x38,0x88,0x2b,0x4e,0x6a,0x33,0x6f,0x55,0xbd,0x7b,0xb6,0x11,0xee,0x90,0x10,0xe9,0x00,0x00,
+ 0x05,0x20,0xb5,0x77,0xbe,0xd5,0x51,0xfe,0xcd,0x20,0x64,0x1c,0x9f,0x8a,0xe8,0x61,0xed,0x75,0x44,0x2a,0x06,0xb6,0x2c,0x81,0x15,0x32,0xdb,0xbc,0xc5,0xb9,0xee,0x4d,0x13,0x30,0x00,0x00,
+ 0x05,0x20,0xb5,0x55,0x31,0x3f,0xe7,0xc7,0x17,0xe4,0x31,0x87,0x47,0x45,0x7c,0x67,0x43,0x5c,0x82,0x73,0xd6,0x62,0x64,0x94,0x92,0x32,0x2d,0x81,0x0e,0x01,0x35,0xc0,0x7e,0xb7,0x00,0x00,
+ 0x05,0x20,0xb5,0x82,0xe4,0xe2,0xcd,0x88,0x8b,0xa6,0x09,0x1f,0x2e,0xf2,0x60,0xb9,0x91,0xa2,0x84,0xce,0x0f,0x6d,0xaf,0x9f,0x39,0x87,0x63,0x71,0xd2,0xf3,0x13,0x52,0xce,0xbe,0x00,0x00,
0x05,0x20,0xb5,0x83,0x6f,0xb6,0x11,0xd8,0x0e,0xa8,0x57,0xda,0x15,0x20,0x5b,0x1a,0x6d,0x21,0x15,0x5a,0xbd,0xb4,0x17,0x11,0xc2,0xfb,0x0e,0xfc,0xde,0xe8,0x26,0x56,0xa8,0xac,0x00,0x00,
- 0x05,0x20,0xb9,0x54,0x08,0xb2,0xaa,0xe6,0xea,0x55,0x16,0xa7,0x51,0x0f,0x8f,0xa1,0xc9,0xd0,0x7d,0x69,0x94,0x6b,0x26,0x6a,0xc5,0x81,0x41,0x5e,0x77,0x0e,0x47,0xec,0x10,0x8b,0x00,0x00,
+ 0x05,0x20,0xb5,0xcb,0x2d,0x08,0x40,0x8f,0x25,0x91,0xfb,0xc3,0x5b,0x16,0x84,0x9f,0x68,0xdc,0x78,0xca,0x10,0xf0,0x4d,0xd2,0xc0,0x06,0xc1,0x0f,0x3c,0x28,0x6c,0xcf,0x0c,0x9c,0x00,0x00,
+ 0x05,0x20,0xb6,0x35,0x41,0xa9,0x66,0xc0,0xcf,0xf4,0x29,0xad,0x29,0x43,0x9a,0xac,0x6e,0x45,0xa4,0x29,0xf8,0x78,0xdb,0xbe,0x54,0x8a,0x49,0x10,0xd2,0xe8,0x70,0x3e,0xed,0x4e,0x00,0x00,
+ 0x05,0x20,0xb6,0x68,0x8f,0x48,0x5f,0xf7,0xbf,0x6f,0x80,0x01,0x97,0x90,0x40,0xa0,0x97,0xe7,0xdd,0xf1,0x62,0x57,0x7c,0x70,0x51,0x81,0x73,0x02,0x97,0x6d,0x67,0x57,0x34,0xe9,0x00,0x00,
+ 0x05,0x20,0xb6,0x6a,0xa4,0x77,0x5b,0xe1,0x4b,0x03,0xc5,0x1a,0xf1,0x60,0xeb,0xba,0x50,0x86,0xee,0x46,0x99,0x7a,0xd9,0x1c,0x89,0xaa,0xa8,0x7f,0x18,0xff,0x81,0x0f,0x76,0xd7,0x00,0x00,
+ 0x05,0x20,0xbf,0x04,0x49,0xd0,0x11,0x0d,0x91,0x07,0x9c,0x81,0x44,0xea,0x6a,0xf2,0xfc,0x56,0x4f,0xec,0x1f,0x18,0xad,0x3a,0x2e,0x61,0x2b,0x67,0x13,0x2c,0x2f,0x81,0xac,0xbb,0x00,0x00,
+ 0x05,0x20,0xbf,0x61,0x33,0x63,0x39,0x32,0x9d,0x57,0x29,0xde,0xd2,0xfc,0xde,0xf1,0xfd,0xed,0xd8,0x0e,0xbc,0x32,0x98,0x5f,0xe9,0xfa,0xe2,0xf1,0xc3,0x43,0x5f,0x3d,0x12,0xb4,0x00,0x00,
+ 0x05,0x20,0xb8,0x24,0x4b,0x3d,0x10,0x7e,0x4f,0x83,0x1a,0xf6,0x90,0x12,0xc6,0xaa,0x2f,0x7a,0x34,0xec,0xb0,0x0f,0x85,0x7d,0xef,0xef,0x34,0xa6,0x18,0xea,0x12,0x1e,0xfc,0xd6,0x00,0x00,
+ 0x05,0x20,0xb8,0x49,0x3c,0x06,0x5b,0x6e,0x09,0x85,0x49,0x40,0x93,0x96,0xf0,0x4d,0x3c,0x84,0x4a,0xd4,0x1b,0x3f,0x06,0x83,0x7f,0xd8,0x52,0xc4,0x5a,0x88,0x0f,0x74,0x93,0x41,0x00,0x00,
+ 0x05,0x20,0xb8,0xf4,0x1c,0x1e,0x3a,0xd4,0x60,0xa0,0x59,0xc2,0x03,0xc3,0x72,0x0d,0xd5,0x62,0x0b,0x85,0x7f,0xf0,0x89,0xfc,0x18,0xf0,0x53,0xbf,0xdb,0x8d,0x78,0xef,0x65,0x25,0x00,0x00,
+ 0x05,0x20,0xb8,0xdc,0xe6,0xbe,0xcd,0xb9,0xe3,0xf9,0x25,0xd8,0x10,0x36,0xb5,0x42,0x40,0x7b,0x08,0x51,0xe9,0xf4,0xc0,0x23,0xad,0x66,0x6e,0x13,0x87,0xc1,0xc5,0x29,0xa7,0x8b,0x00,0x00,
+ 0x05,0x20,0xb8,0xe1,0xa3,0x72,0x6a,0x05,0x15,0x91,0x53,0xcc,0x6d,0x47,0x45,0x08,0xe8,0x6b,0x01,0xf5,0x39,0x1e,0x16,0xda,0xe2,0xad,0xe9,0x00,0x63,0x94,0xc4,0xc4,0xa3,0x0a,0x00,0x00,
+ 0x05,0x20,0xb9,0x0c,0x27,0x1c,0xb1,0x6b,0x5b,0x4c,0xec,0xe3,0x60,0x7f,0x1e,0x13,0xcf,0xcd,0xc2,0xc9,0x9b,0x9e,0xf3,0x7c,0xc9,0xe3,0x4e,0xce,0xe6,0x27,0x42,0x93,0xba,0x7f,0x00,0x00,
+ 0x05,0x20,0xb9,0x71,0x92,0xd0,0xce,0xdc,0x26,0x57,0xc3,0x72,0xee,0x44,0x20,0x86,0x11,0xb9,0x54,0x6c,0x6e,0x73,0x5c,0x0f,0x9f,0x4f,0xce,0xab,0x26,0x68,0xca,0x98,0x11,0x3f,0x00,0x00,
+ 0x05,0x20,0xb9,0x83,0x9e,0xd5,0xe4,0x57,0xaa,0x02,0x11,0x3a,0xc9,0x13,0x78,0xa5,0x6e,0x81,0xb5,0x28,0x07,0xdf,0x32,0x19,0xfd,0x42,0x0f,0x70,0xe0,0x58,0x7b,0x51,0x2a,0xeb,0x00,0x00,
+ 0x05,0x20,0xb9,0xa1,0x9b,0xd0,0x6a,0xa9,0x83,0x0b,0x3a,0x40,0x38,0x3f,0x90,0xeb,0xc9,0x36,0x41,0xdb,0x07,0xec,0xf7,0xbf,0xaf,0xc5,0x5c,0xae,0xb2,0x9f,0xea,0xe6,0x36,0x90,0x00,0x00,
+ 0x05,0x20,0xb9,0xa4,0xad,0x1e,0x90,0x31,0xd0,0x59,0xe3,0x2d,0x8f,0x96,0xb8,0xfb,0x33,0x23,0xdd,0xdd,0x6c,0xe8,0xb4,0x24,0x2b,0xa5,0xe0,0xb0,0x82,0xc2,0x7e,0xf3,0x4c,0x66,0x00,0x00,
+ 0x05,0x20,0xba,0x48,0x1c,0x20,0x18,0x1c,0x82,0x1f,0xf8,0xd0,0xc9,0x27,0x26,0x08,0x46,0x3f,0xbe,0xe2,0x02,0xf3,0xd8,0xb8,0xc5,0x59,0x93,0xf9,0x92,0xb2,0xe1,0x9a,0xf7,0x88,0x00,0x00,
+ 0x05,0x20,0xba,0xcb,0x7a,0x48,0xcd,0xcb,0xd8,0x09,0xd2,0x60,0x89,0x06,0x2a,0xdf,0x5f,0xcb,0x90,0x41,0x35,0xdc,0x9b,0xee,0xce,0xe9,0x28,0x10,0xea,0xde,0x4a,0x3d,0x1e,0x30,0x00,0x00,
+ 0x05,0x20,0xbb,0x3b,0xdb,0x34,0xa7,0x33,0x25,0x8e,0x5b,0x3a,0xe4,0xac,0x99,0x6b,0x28,0x35,0x0e,0x4a,0x4f,0xd8,0xfe,0x94,0x79,0xf3,0x13,0xb6,0x0a,0x36,0x26,0x57,0x92,0xdb,0x00,0x00,
+ 0x05,0x20,0xbb,0x43,0xb7,0xde,0x6c,0x02,0x3c,0xe2,0x84,0x11,0xc0,0x84,0xbb,0x5a,0x84,0x00,0x22,0xde,0x47,0x79,0x9e,0xf2,0x65,0x10,0x8f,0x77,0x1e,0x66,0x4a,0xd0,0xa9,0x45,0x00,0x00,
+ 0x05,0x20,0xbb,0x6b,0x23,0x05,0xcd,0x5a,0x41,0xf1,0x30,0x8e,0x54,0x74,0xc9,0x54,0x64,0x5c,0x16,0x09,0x05,0x56,0x34,0x1a,0x38,0x1b,0xe4,0x02,0xad,0xcd,0xcf,0x6c,0xe7,0xbb,0x00,0x00,
+ 0x05,0x20,0xbb,0xe1,0x40,0xcb,0x85,0x9d,0x3f,0x86,0x72,0xf6,0x8a,0x22,0xbc,0xe8,0x9b,0xf1,0xab,0x84,0xa9,0x0b,0xd8,0x8f,0x58,0x7f,0x81,0x4f,0x16,0x5f,0x8d,0x22,0x8d,0xb9,0x00,0x00,
+ 0x05,0x20,0xbc,0x63,0x7d,0x44,0x4f,0x4e,0xf2,0x42,0xc8,0xf3,0x9f,0xd4,0x06,0x67,0x74,0x2a,0xdb,0x62,0x05,0xf5,0xd1,0x94,0x61,0xfa,0xab,0x88,0xc1,0x9b,0x99,0x6d,0xef,0xcd,0x00,0x00,
+ 0x05,0x20,0xbc,0x6d,0x48,0x61,0x62,0x32,0xa3,0xa7,0x56,0x45,0xe3,0xf2,0x87,0x48,0x7a,0xfe,0x2c,0x3f,0xbc,0xa0,0x71,0xdb,0x12,0x3b,0x19,0x67,0xf5,0x05,0xb6,0xae,0x54,0xe3,0x00,0x00,
+ 0x05,0x20,0xbc,0xee,0x7e,0x5a,0x6c,0x0a,0x57,0x2f,0xfa,0xd7,0x69,0x0e,0x4e,0xfc,0x93,0xa0,0x69,0x0a,0xc8,0x68,0xa3,0x6c,0x6a,0x93,0xca,0xb2,0x67,0xc0,0x0a,0xd2,0xb3,0x53,0x00,0x00,
+ 0x05,0x20,0xbd,0x07,0xc2,0x99,0x84,0x87,0x0e,0xbe,0x08,0xd2,0x0a,0x5b,0xba,0x07,0x3a,0x46,0x12,0x6a,0x38,0xd2,0x53,0x7f,0x68,0x90,0x92,0xab,0xe4,0xcd,0xa0,0x3a,0xfa,0x9e,0x00,0x00,
+ 0x05,0x20,0xbd,0x11,0x5a,0xb5,0xe2,0x4e,0xa2,0x79,0x5d,0x8a,0xc6,0x13,0x96,0x62,0x1e,0x07,0xcd,0x63,0x52,0x4d,0x85,0x86,0xa5,0x99,0x0c,0x03,0x2a,0xac,0xd3,0xf1,0x6b,0x59,0x00,0x00,
+ 0x05,0x20,0xbd,0x5f,0x90,0x40,0xb3,0x59,0x6f,0xa2,0x4e,0x18,0x97,0xf7,0xb6,0x34,0x6c,0xfa,0x63,0xb5,0xe9,0x3b,0x41,0x77,0x69,0x28,0xab,0x4e,0x40,0xeb,0x76,0x5c,0x8c,0x4b,0x00,0x00,
+ 0x05,0x20,0xbd,0x67,0x56,0x00,0x8b,0x27,0xdb,0x2f,0xeb,0xac,0x48,0x1d,0x69,0x01,0x2f,0xbf,0x02,0x62,0x90,0x41,0xa4,0x70,0x7f,0x3e,0x0c,0x1b,0x5b,0xbf,0x8a,0x1f,0x14,0xb5,0x00,0x00,
+ 0x05,0x20,0xbd,0xbc,0x15,0x93,0x9a,0x4d,0x2c,0xa2,0xc5,0x24,0x98,0x76,0x76,0x2b,0x44,0x7f,0x92,0xdc,0x50,0xa7,0xa4,0xdc,0x46,0xe2,0x2e,0xa7,0x90,0x47,0x41,0x0e,0x65,0xb9,0x00,0x00,
+ 0x05,0x20,0xbd,0x96,0xa7,0xd0,0x2a,0xac,0x87,0x2c,0x00,0x98,0x5c,0x0a,0xcb,0x95,0x5c,0xda,0x68,0xaf,0x4b,0x3b,0x3d,0xda,0xcb,0x13,0x99,0x23,0x44,0x98,0x7f,0xe0,0xcb,0x48,0x00,0x00,
+ 0x05,0x20,0xbe,0x07,0x98,0x46,0xc6,0x34,0x94,0x30,0xb0,0x90,0x89,0xcd,0x3f,0x01,0x71,0x71,0x97,0x90,0xa8,0x40,0x8e,0x46,0xb3,0x80,0x2c,0xac,0x65,0x96,0x76,0x9e,0x11,0x69,0x00,0x00,
+ 0x05,0x20,0xbe,0x0e,0xb2,0x32,0x0c,0x71,0x29,0x28,0x04,0x39,0x8f,0x1d,0x07,0x9f,0xca,0x33,0x2a,0xcd,0x83,0x6b,0x88,0x68,0x06,0xdd,0x4c,0xc1,0x27,0x67,0x1e,0xee,0xc3,0x5a,0x00,0x00,
+ 0x05,0x20,0xc6,0xfd,0xd5,0x97,0x75,0x59,0xfd,0x53,0x72,0x32,0xf4,0xe2,0xd4,0x8b,0x88,0x06,0xaf,0x07,0xac,0x07,0x56,0xbd,0x8d,0xcf,0x10,0x4a,0xf1,0xa8,0x6a,0xaf,0x2b,0x60,0x00,0x00,
+ 0x05,0x20,0xc6,0xc9,0x0a,0x6a,0x62,0xf6,0x65,0x78,0x4d,0xa3,0xa1,0xa4,0x5c,0xba,0x73,0xa1,0x1a,0x53,0x5d,0xab,0xf9,0x20,0x60,0x0d,0x8d,0xca,0x54,0xe4,0x1a,0xf5,0x91,0x14,0x00,0x00,
+ 0x05,0x20,0xc6,0xdc,0x21,0x2f,0xb1,0x80,0xb4,0xcc,0xfb,0x84,0x95,0x3a,0xc8,0x65,0xd8,0x2e,0x56,0x1b,0xb9,0xff,0x9c,0xe6,0x5d,0x07,0x66,0xc5,0xd3,0x49,0x4f,0xbf,0x9d,0xcb,0x00,0x00,
+ 0x05,0x20,0xc7,0x3b,0x73,0xc1,0x41,0xe6,0xda,0x27,0x28,0xb6,0x3c,0x99,0x1e,0x67,0xc5,0xb6,0x15,0x44,0x4f,0xce,0xdb,0xf4,0xa0,0xc9,0xdb,0x23,0x2b,0xf9,0x4d,0xe8,0xb5,0x9d,0x00,0x00,
+ 0x05,0x20,0xc7,0x1a,0x96,0x78,0xb3,0x1b,0x7b,0xed,0x43,0xb3,0x3e,0x47,0xb2,0xd4,0x3a,0x2f,0x58,0x14,0x78,0x26,0x5b,0x31,0x47,0xd1,0x42,0x60,0x9f,0x3d,0x4e,0x8e,0xf4,0x97,0x00,0x00,
+ 0x05,0x20,0xc7,0x6d,0x1d,0x06,0xdb,0x8c,0xf9,0x1a,0xdb,0xe7,0x84,0x13,0xf8,0x4d,0x65,0xfd,0x46,0x39,0x7b,0x2a,0xf0,0xa5,0xb6,0x53,0x6c,0xc6,0x07,0x40,0x49,0x04,0x83,0x94,0x00,0x00,
+ 0x05,0x20,0xc0,0x52,0x6c,0x2d,0xa7,0xaa,0xb6,0x5c,0xe0,0x02,0xbd,0x70,0x7f,0x0e,0xd5,0x89,0xfe,0xb5,0x6b,0xfb,0x81,0xfb,0x0b,0x4b,0xf4,0x85,0x2b,0x13,0x9e,0xd1,0xf4,0x54,0x00,0x00,
0x05,0x20,0xc0,0xb9,0x7b,0x21,0xbd,0xa2,0x48,0xda,0x8a,0x3e,0xc3,0x6c,0xac,0xfd,0x6d,0x63,0x21,0xb6,0xb3,0x37,0xa9,0x4d,0x42,0x2c,0x9e,0x75,0x61,0x07,0xdc,0xc9,0xab,0x9b,0x00,0x00,
- 0x05,0x20,0xc8,0xdc,0x00,0xc8,0xdf,0xa1,0xb2,0xe9,0x9f,0x00,0xb3,0x86,0x93,0xc3,0xbc,0x6d,0x56,0xe2,0x83,0xfc,0xf4,0x6e,0x55,0x5d,0xed,0x4e,0x53,0xe6,0xd1,0x4c,0x38,0x3c,0x00,0x00,
- 0x05,0x20,0xcc,0xaf,0x6c,0x3b,0xd0,0x13,0x76,0x23,0xc3,0x36,0xbb,0x64,0x4a,0x4a,0x06,0x93,0x69,0x6d,0xb0,0x10,0x6e,0x66,0xa4,0x61,0xf8,0x2d,0xe7,0x80,0x72,0x4d,0x53,0x94,0x00,0x00,
- 0x05,0x20,0xce,0x25,0x15,0xbd,0x08,0xe9,0x67,0x1c,0xa2,0xa5,0x16,0x0e,0x38,0xd9,0xe4,0xc6,0x20,0x31,0x86,0x23,0x21,0x5a,0x5a,0x76,0x1e,0x74,0xd5,0xd3,0x4e,0x86,0x61,0xf4,0x00,0x00,
+ 0x05,0x20,0xc1,0x19,0x15,0x62,0x0c,0x4e,0x6d,0x66,0xeb,0x00,0x94,0xf4,0x60,0x78,0x62,0x6c,0x9d,0x56,0xde,0xc8,0x7e,0xa2,0x97,0xa0,0x7d,0xf1,0xa2,0x33,0x7d,0x13,0xa1,0x9e,0x00,0x00,
+ 0x05,0x20,0xc1,0x5e,0xb4,0xfb,0xf7,0xb0,0x82,0xb0,0xa2,0x9c,0x76,0x46,0x36,0x65,0x6c,0x4a,0xf8,0x82,0x83,0xe1,0x3a,0xb3,0x9a,0x78,0xb4,0xf2,0x54,0xec,0x42,0x88,0xf5,0x7d,0x00,0x00,
+ 0x05,0x20,0xc1,0xa6,0x2e,0xb3,0x8c,0x3e,0xe0,0x74,0x7e,0x62,0x9f,0x38,0x6b,0xc0,0x24,0x69,0xd4,0x09,0x3f,0x58,0xe6,0x06,0x96,0xf6,0x14,0x07,0x17,0xda,0x9f,0x7d,0x74,0x87,0x00,0x00,
+ 0x05,0x20,0xc2,0x77,0x5d,0xb8,0x46,0x58,0xda,0x01,0x2a,0xef,0x9c,0x92,0xcb,0x02,0x40,0xe5,0xf3,0x74,0xed,0x13,0xf4,0x67,0x43,0xb1,0x6f,0xbd,0x6c,0xb8,0x75,0x4c,0xc6,0x27,0x00,0x00,
+ 0x05,0x20,0xc2,0xb5,0x28,0xa8,0x6b,0x0b,0x3e,0xa2,0x06,0xbd,0xd8,0xef,0xce,0xca,0x5f,0x86,0x8a,0x91,0x63,0xbe,0x66,0xcd,0x8b,0x42,0xb6,0xf7,0x49,0x80,0x7c,0x4e,0xf9,0xcd,0x00,0x00,
+ 0x05,0x20,0xc2,0x9e,0xf4,0xb2,0xd4,0x6e,0x61,0x9a,0x52,0x02,0xf4,0x21,0x24,0x25,0xcc,0x2e,0x46,0x64,0x10,0x90,0xd3,0x14,0x81,0x81,0xe2,0xe0,0x2d,0x1b,0x5b,0x4d,0x43,0x43,0x00,0x00,
+ 0x05,0x20,0xc2,0xab,0xed,0x45,0x15,0x5d,0xe9,0x18,0x6a,0xca,0x20,0x80,0x6c,0xcb,0xfe,0x9d,0x16,0x57,0x47,0xfe,0xe8,0xb5,0xbf,0x86,0x49,0x6f,0xd3,0x3e,0x73,0x7e,0x53,0x75,0x00,0x00,
+ 0x05,0x20,0xc2,0xd7,0x58,0x2b,0x54,0x9a,0x19,0x74,0xcd,0xd8,0xca,0xbe,0xbd,0x72,0x5c,0x6f,0x65,0x07,0xf4,0x61,0x6f,0x6b,0x69,0x06,0x7b,0x36,0xc6,0x3f,0x1f,0x83,0xbc,0x89,0x00,0x00,
+ 0x05,0x20,0xc2,0xdf,0x82,0x8a,0x5a,0xe2,0x13,0xef,0x8d,0x4b,0xfa,0x0c,0x7c,0x3a,0x9c,0xce,0x8c,0xf2,0x9d,0x2b,0x9e,0x90,0x45,0xad,0x3a,0x00,0xf8,0x31,0xc6,0xe2,0x47,0xb6,0x00,0x00,
+ 0x05,0x20,0xc3,0x1d,0xa1,0x35,0x63,0x64,0xa7,0x98,0x2e,0x43,0x3d,0xfe,0xaa,0x45,0x08,0xf8,0x00,0x52,0xc4,0xef,0x30,0x0b,0x75,0xad,0x1b,0x97,0x3e,0xfc,0x84,0xa4,0xe9,0x2b,0x00,0x00,
+ 0x05,0x20,0xc3,0x71,0xec,0xc2,0x61,0xfc,0x2a,0x4f,0xda,0xc5,0x14,0xe4,0xec,0x9f,0x27,0x0c,0x38,0x7c,0x22,0x6b,0x80,0x9d,0xca,0x1c,0x5d,0x86,0xe3,0x54,0x92,0xff,0xfb,0x81,0x00,0x00,
+ 0x05,0x20,0xc3,0x72,0x73,0xdd,0x68,0x22,0x0d,0x36,0x27,0xcb,0xf9,0x74,0x38,0x77,0x98,0x7b,0x64,0x02,0xff,0x5b,0x05,0x3e,0xed,0xd0,0xed,0x44,0x98,0xb3,0x35,0x4c,0x14,0x13,0x00,0x00,
+ 0x05,0x20,0xc3,0x8b,0xcc,0x56,0xbc,0x01,0xac,0x72,0xb1,0x02,0x4f,0x69,0xa1,0xc4,0x8c,0xe7,0xdb,0x52,0xa9,0x07,0x6b,0xfc,0x14,0x2f,0xee,0x11,0xbd,0xd3,0x60,0x78,0xce,0x45,0x00,0x00,
+ 0x05,0x20,0xc3,0x93,0x4c,0x47,0x10,0xf5,0x4a,0xec,0x69,0x85,0x9c,0x46,0xcc,0x05,0x90,0xd1,0xd2,0x42,0xd3,0x31,0xb3,0x1f,0x08,0x16,0xaa,0xd2,0x87,0xd3,0xbe,0x66,0x8e,0xe0,0x00,0x00,
+ 0x05,0x20,0xc3,0xc3,0x0e,0x81,0x64,0x74,0x20,0xeb,0xcd,0xdc,0x9a,0xae,0xb6,0x2e,0xe7,0xd1,0xe3,0x29,0xa6,0xf9,0x79,0x9c,0xd4,0xed,0x6a,0xf8,0xf3,0x62,0x00,0xf2,0xd9,0xcf,0x00,0x00,
+ 0x05,0x20,0xc4,0x17,0xa5,0x73,0x29,0x5f,0xb8,0x39,0xe0,0x34,0x15,0x16,0x93,0x1b,0x95,0xe5,0x3d,0x24,0x93,0x92,0x63,0x70,0x0c,0x6e,0xb2,0x5d,0x7e,0x88,0xc5,0x06,0xcd,0xd4,0x00,0x00,
+ 0x05,0x20,0xc4,0xb7,0xe8,0xce,0x84,0x19,0xb9,0xc9,0x00,0xe4,0x58,0x71,0x28,0x23,0x4c,0x08,0xb4,0xbd,0xc4,0x45,0x1e,0x37,0xbc,0x8e,0xa7,0xa9,0x55,0x7e,0xd1,0xc2,0x00,0x82,0x00,0x00,
+ 0x05,0x20,0xc4,0xbe,0xd7,0xed,0xec,0x29,0xd1,0x88,0x6f,0x3a,0x88,0x9c,0x4c,0x2c,0x3f,0x01,0x8a,0x1c,0x16,0x87,0x3b,0xfe,0xac,0x6a,0x99,0xad,0x69,0x99,0x58,0x03,0xf0,0x90,0x00,0x00,
+ 0x05,0x20,0xc5,0x20,0x1e,0xf4,0x71,0xcc,0x4f,0x72,0xb6,0xae,0x0e,0x05,0x78,0x02,0x9c,0xfa,0x90,0x10,0x00,0xbc,0xab,0x80,0xc5,0x6d,0x57,0x5f,0xff,0x70,0x87,0x9a,0xba,0xa0,0x00,0x00,
+ 0x05,0x20,0xc5,0x8a,0x0a,0x02,0x80,0x22,0x83,0x1b,0x9a,0xc0,0x01,0xc4,0x9c,0xa0,0xa4,0x66,0x47,0x0d,0x7a,0xf2,0x91,0xed,0xde,0x48,0xdc,0x0b,0xe3,0xdc,0xff,0x92,0x15,0x91,0x00,0x00,
+ 0x05,0x20,0xc5,0x9f,0x23,0x53,0xcd,0x5b,0x4b,0xa5,0xf2,0x58,0xe7,0x26,0x89,0xe8,0x15,0xf9,0xcb,0x9b,0x5a,0x73,0x0a,0x6b,0x60,0xce,0x41,0x9c,0x29,0x1d,0x82,0xc8,0x05,0xf4,0x00,0x00,
+ 0x05,0x20,0xce,0xf8,0xfb,0x76,0x6b,0x75,0xac,0x8d,0x99,0xe9,0xde,0x04,0x1d,0x0d,0xf3,0x36,0x29,0x0f,0x74,0x2f,0x4f,0xed,0xbf,0x5c,0x07,0x92,0xcc,0x85,0x18,0xce,0xe9,0x00,0x00,0x00,
+ 0x05,0x20,0xce,0xd3,0xab,0xc8,0xeb,0xe4,0xde,0x1b,0x83,0x01,0x13,0xe2,0x7c,0xc3,0xe2,0xa6,0x7d,0x48,0x85,0xd0,0x75,0xeb,0x57,0xb4,0xb1,0x45,0x78,0xdd,0x2e,0x1f,0xd2,0x65,0x00,0x00,
+ 0x05,0x20,0xce,0xde,0x6c,0x15,0x16,0x2e,0x44,0x3d,0x1b,0xf5,0xe4,0x65,0xe2,0x2f,0xb3,0xa8,0xbb,0xdc,0x7c,0x1b,0x98,0x11,0xc3,0x08,0x2f,0x93,0xbc,0x55,0x80,0x89,0x12,0x88,0x00,0x00,
+ 0x05,0x20,0xcf,0x98,0xbc,0x46,0xe2,0x48,0xc6,0xf1,0x01,0xd4,0x65,0xdb,0x6e,0xbc,0x94,0x5b,0x55,0x54,0xf7,0xc7,0x35,0xa0,0xc6,0x8b,0xa0,0x1b,0xa9,0x37,0xfd,0xe8,0xa2,0x40,0x00,0x00,
+ 0x05,0x20,0xcf,0xaf,0x29,0x4f,0x10,0xe6,0x70,0xdc,0xd4,0x06,0xb5,0x77,0x68,0xfc,0xf3,0xcf,0x2b,0x79,0xce,0x2e,0x9e,0x43,0xd4,0x64,0x85,0x74,0xd7,0x68,0x33,0xea,0x4c,0xe8,0x00,0x00,
+ 0x05,0x20,0xcf,0xc4,0x9b,0xbf,0x1c,0x98,0x28,0x8d,0x28,0x1b,0x22,0x8b,0x09,0xba,0x8c,0x90,0x7e,0xf3,0x6a,0x4e,0x56,0xec,0x52,0x63,0x6c,0xd4,0x5c,0x4a,0x3d,0xe2,0x8e,0x4f,0x00,0x00,
+ 0x05,0x20,0xcf,0xc4,0x9c,0x95,0x95,0xf5,0x80,0x34,0x9a,0x99,0x00,0x2b,0x4f,0xbc,0xb2,0x81,0xe8,0x90,0x8b,0x32,0x78,0x4b,0xd9,0x5e,0xf1,0x83,0x46,0x47,0x56,0x9b,0x5c,0xf6,0x00,0x00,
+ 0x05,0x20,0xcf,0xcc,0xa2,0x48,0x2a,0x0a,0xf5,0xf5,0xbc,0x4f,0x0b,0x4e,0x62,0xb8,0xa9,0xcf,0x4a,0x76,0xd5,0x69,0xc9,0x6b,0x8c,0x0e,0x9f,0x56,0x36,0xe1,0xe4,0x70,0x97,0x17,0x00,0x00,
+ 0x05,0x20,0xc8,0x0a,0x3e,0x74,0x5a,0x3e,0x47,0xcb,0x6a,0x7a,0xe4,0x26,0x98,0x40,0x30,0x66,0xf3,0xc3,0x83,0x01,0xf5,0x40,0x34,0xfa,0x43,0xeb,0xa8,0xa4,0xe1,0x09,0xd0,0x22,0x00,0x00,
+ 0x05,0x20,0xc8,0x55,0x01,0x42,0x68,0x45,0xb8,0xdb,0x48,0x72,0xeb,0xd2,0x45,0xf8,0x0b,0x8f,0x51,0xc3,0x99,0x18,0x81,0x7a,0x64,0x5a,0x91,0x1e,0x0c,0x5c,0x48,0x02,0x8d,0x34,0x00,0x00,
+ 0x05,0x20,0xc8,0x73,0xfd,0x68,0x67,0xfc,0x6b,0x4f,0x50,0xc3,0xc0,0xd8,0xb6,0x4c,0xc5,0xc0,0xbf,0x16,0xbc,0x92,0x58,0x09,0xdd,0x74,0x5f,0x61,0xe3,0xf8,0x9a,0x44,0x52,0x42,0x00,0x00,
+ 0x05,0x20,0xc8,0xac,0x68,0x5b,0xe7,0x5d,0xbf,0xcd,0xfc,0x1f,0x05,0x3c,0xdf,0x38,0x2b,0x48,0xc3,0xc0,0x45,0xb2,0x3b,0x90,0x11,0xc1,0xde,0xab,0xa2,0x42,0x72,0xe8,0xcb,0x5d,0x00,0x00,
+ 0x05,0x20,0xc8,0xf8,0xd9,0x73,0x22,0xc5,0x4c,0xfb,0x29,0x0e,0x2c,0xd0,0x82,0xcc,0xc9,0xff,0x1b,0xe6,0x17,0x8c,0xe2,0x09,0x0f,0x00,0x83,0x80,0x32,0xd6,0x0d,0x1e,0x89,0xc7,0x00,0x00,
+ 0x05,0x20,0xc9,0xad,0x22,0x12,0x37,0xb4,0x1a,0x81,0xef,0x27,0x15,0x17,0x9a,0x40,0x2a,0x39,0x8f,0x33,0xc8,0x35,0x90,0x5b,0x07,0x5a,0x24,0x1b,0xa5,0x32,0xc1,0x75,0x05,0xa5,0x00,0x00,
+ 0x05,0x20,0xca,0x08,0x7a,0x5c,0x6f,0xc1,0xba,0x3a,0xd5,0xb9,0x20,0xd8,0x28,0x5e,0x59,0x18,0x8a,0xb9,0x46,0xfe,0x2c,0x18,0x6c,0x87,0xee,0x19,0x0b,0x0b,0x40,0x17,0x8c,0xbf,0x00,0x00,
+ 0x05,0x20,0xca,0xb5,0x1f,0xab,0x39,0x41,0xb3,0x4e,0xab,0x3e,0xfd,0xdb,0x10,0x93,0xbe,0xa7,0x6c,0x05,0xb4,0xd8,0x58,0xa4,0xaf,0xf7,0xc1,0x53,0x27,0xef,0x09,0x84,0x26,0x07,0x00,0x00,
+ 0x05,0x20,0xca,0x82,0x93,0x15,0xfc,0x75,0x1c,0x25,0x3e,0x4c,0x78,0x47,0x85,0xa3,0x88,0x5b,0xbe,0x5d,0xac,0x25,0x4c,0x82,0xe0,0x63,0x6d,0x2f,0x3f,0x86,0x22,0x3a,0x58,0xe3,0x00,0x00,
+ 0x05,0x20,0xca,0x91,0xe3,0x81,0x64,0x95,0x14,0x72,0x91,0x7f,0xf3,0xf2,0x8a,0x4c,0xc8,0x10,0x39,0x98,0xbf,0xb0,0x98,0x58,0xb6,0x1b,0x10,0x2f,0x86,0xd6,0xb9,0x8a,0xf9,0xd2,0x00,0x00,
+ 0x05,0x20,0xca,0x90,0x9e,0x7f,0x60,0xa3,0x18,0xff,0x46,0xb6,0xaa,0x3f,0x60,0xc7,0xa8,0x43,0xbd,0x7a,0x6a,0x87,0xe4,0x5c,0xf3,0x84,0xf8,0x74,0xf7,0xfa,0x5c,0xf1,0xc1,0x91,0x00,0x00,
+ 0x05,0x20,0xcb,0xeb,0x08,0x0e,0x22,0x68,0x0c,0x01,0xf4,0x18,0xa4,0xcb,0xf3,0xa9,0xfe,0x7c,0x67,0x58,0x85,0x8a,0x69,0xe0,0x3a,0x2f,0x70,0xb1,0x0b,0x3f,0xb8,0x1d,0x42,0xb3,0x00,0x00,
+ 0x05,0x20,0xcc,0x0b,0x3f,0x8b,0xd1,0x45,0x7e,0x0a,0x5f,0xda,0x85,0x89,0xdb,0x96,0x0a,0x46,0xc6,0x20,0xf2,0x91,0xa8,0x4b,0x8f,0x33,0x96,0xcf,0xcb,0xcf,0x27,0x54,0x96,0xd6,0x00,0x00,
+ 0x05,0x20,0xcc,0x0e,0xe8,0x18,0xbb,0x23,0x53,0xa7,0xd7,0xfc,0x92,0x5d,0x5f,0x0e,0x67,0x7c,0x7c,0x98,0x00,0xb6,0xec,0x21,0x9c,0xca,0xad,0x28,0xe1,0x9c,0x0b,0x02,0x3d,0xdf,0x00,0x00,
+ 0x05,0x20,0xcc,0x62,0xa4,0x77,0x8c,0x6f,0x7c,0x5c,0x4d,0x19,0x51,0x58,0x7b,0xfc,0x94,0x09,0x01,0xbf,0xbc,0x03,0xb8,0x37,0x95,0xa2,0xd0,0xf1,0xa6,0xa6,0xc6,0x57,0xae,0x80,0x00,0x00,
+ 0x05,0x20,0xcc,0x8a,0xf1,0x34,0x2a,0xe1,0xb4,0x1b,0x5d,0x7f,0xc6,0x3a,0x40,0xc4,0x55,0x5d,0xc7,0xd3,0x3c,0x57,0x04,0xc9,0x61,0xc4,0xcf,0x41,0x89,0xf7,0x43,0x0a,0xa3,0x6d,0x00,0x00,
+ 0x05,0x20,0xcc,0xb3,0x0f,0x91,0xa0,0xb8,0x73,0xd7,0xec,0xbb,0x40,0xce,0x55,0x28,0x7a,0xa6,0xb0,0x67,0x92,0x16,0x4e,0xdd,0xe3,0xa9,0xc5,0x29,0x44,0xc5,0xad,0xb8,0x65,0xa0,0x00,0x00,
+ 0x05,0x20,0xcc,0xe3,0xb1,0x7e,0x19,0xf5,0x78,0x78,0xb4,0x86,0x62,0xb2,0x99,0x47,0xba,0xb6,0x11,0xca,0x78,0x91,0xc7,0x19,0xfe,0x49,0x5b,0x67,0xfe,0xea,0x3f,0x56,0x97,0x14,0x00,0x00,
+ 0x05,0x20,0xcc,0xf1,0x70,0xa4,0x04,0xfd,0x04,0x5c,0x51,0xf7,0x7e,0x3f,0xd4,0xd9,0xf9,0x1a,0xa6,0x6e,0x18,0x35,0x3a,0xf9,0xb6,0x9f,0x42,0x8d,0xa1,0x1b,0xea,0x87,0xa9,0x06,0x00,0x00,
+ 0x05,0x20,0xcd,0x00,0xc4,0xfb,0x60,0x1f,0xf6,0x96,0x36,0xdf,0xbb,0x6f,0x16,0x26,0x41,0x49,0xbf,0x53,0x6b,0x69,0xe7,0xad,0xb6,0x3c,0x5a,0xa0,0xde,0x23,0x24,0xaa,0x14,0x05,0x00,0x00,
+ 0x05,0x20,0xcd,0x44,0x75,0xc5,0x34,0xcc,0x06,0xbb,0xef,0xe5,0x3a,0x02,0x76,0xe1,0x9c,0xc7,0x9f,0xdf,0x56,0x6b,0xc3,0x28,0x94,0xd3,0x27,0x3e,0x84,0xfd,0xf3,0x10,0x2c,0x67,0x00,0x00,
+ 0x05,0x20,0xcd,0xe4,0x3d,0x96,0x02,0xc9,0xfc,0x31,0x98,0x89,0x16,0xb8,0xd6,0xb0,0x3b,0xb5,0xbe,0xd0,0x2d,0x04,0x86,0xc1,0xf1,0x4b,0x4c,0x82,0x31,0xe9,0xb0,0xa5,0xdd,0x90,0x00,0x00,
+ 0x05,0x20,0xce,0x35,0x8b,0x57,0x10,0x1c,0xba,0x13,0x0d,0xce,0xe4,0xcc,0x1a,0x6c,0x36,0x4b,0xf7,0x83,0x61,0xbb,0xc9,0x68,0x1c,0x73,0x89,0x23,0x05,0xeb,0x83,0xc5,0x0d,0xa6,0x00,0x00,
+ 0x05,0x20,0xce,0x62,0x4e,0x72,0xa7,0xff,0xbc,0x93,0x15,0xd1,0x1d,0xb4,0x43,0xd3,0x51,0xf3,0xf9,0xc4,0xeb,0x74,0xc3,0xaa,0x6a,0xb3,0xe8,0xb5,0x0e,0xfd,0x9b,0xa8,0xcf,0x04,0x00,0x00,
+ 0x04,0x20,0xc0,0x87,0x6d,0x13,0x94,0x29,0x8b,0x63,0x8a,0x0d,0x07,0x0d,0xb6,0x6a,0x12,0xa8,0x17,0x8d,0x6d,0xd9,0x01,0x2e,0x0b,0x09,0x3b,0xbf,0x0d,0x33,0x08,0x87,0x35,0xa8,0x20,0x8d,
+ 0x04,0x20,0xc0,0x8b,0x52,0x0e,0x8b,0x53,0xe2,0x3e,0x85,0x88,0xac,0x08,0x9a,0x47,0xa0,0x7c,0xc5,0x2e,0x7c,0x60,0x84,0xc5,0x5c,0xba,0x6d,0x69,0xcb,0x5b,0x53,0x6e,0xf1,0x84,0x20,0x8d,
+ 0x04,0x20,0xc0,0x95,0xe5,0xf4,0xa5,0xb7,0x9d,0x2c,0x9a,0x6e,0x17,0xc9,0x3e,0x17,0x13,0xab,0xf7,0x28,0x0c,0xbd,0x05,0xb0,0xac,0x72,0x6b,0x79,0x88,0xcd,0x37,0x98,0xf2,0x05,0x20,0x8d,
+ 0x04,0x20,0xc0,0x9a,0x47,0xb7,0x2a,0x9a,0x8e,0x5c,0x4a,0x08,0x4a,0xcc,0x14,0xab,0xa0,0xb2,0x2a,0xb9,0x6c,0x88,0x80,0x7a,0xa4,0xd0,0x6e,0x9a,0x6a,0xda,0xac,0x24,0xf0,0x0f,0x20,0x8d,
+ 0x04,0x20,0xc0,0xad,0x18,0x80,0x2e,0x63,0x91,0x75,0x5c,0xc6,0x55,0xd6,0x3c,0x5d,0x50,0x70,0xbf,0x08,0x63,0x53,0xed,0xae,0x29,0x5d,0x26,0x70,0xd7,0x5a,0x60,0x76,0x11,0xfc,0x20,0x8d,
+ 0x04,0x20,0xc0,0xad,0x68,0xd9,0x50,0x40,0x6a,0xa2,0xcd,0xe2,0xea,0xb1,0x09,0x79,0xa5,0xf9,0xe3,0x92,0x4e,0x2c,0x81,0xac,0xee,0x60,0x04,0xf8,0x61,0xd7,0x4e,0xb4,0x0a,0x8b,0x20,0x8d,
+ 0x04,0x20,0xc0,0xae,0x91,0x9f,0x89,0x8f,0x2b,0x46,0xf3,0x9f,0x10,0xe5,0x91,0x38,0xc4,0xd7,0x9e,0x11,0xb6,0x01,0x59,0x51,0xa7,0x49,0x8a,0xe9,0x39,0x48,0x32,0x28,0x35,0xbf,0x20,0x8d,
+ 0x04,0x20,0xc0,0xf4,0x06,0x23,0x71,0x23,0x36,0x8d,0x72,0x1a,0x0f,0xfc,0xbe,0x51,0x38,0x86,0xf9,0xbc,0x0a,0x2e,0xb4,0x66,0x7b,0x43,0x02,0xab,0xc5,0x27,0x14,0xcf,0xb2,0xef,0x20,0x8d,
+ 0x04,0x20,0xc0,0xf8,0xdc,0x52,0x50,0x52,0x1a,0x6f,0x4d,0x42,0xb3,0x18,0xe7,0xe5,0xab,0xb9,0xf0,0x53,0xab,0x66,0x95,0xb5,0xee,0x81,0x79,0xfd,0x5e,0xef,0x4d,0xd0,0x36,0xd5,0x20,0x8d,
+ 0x04,0x20,0xc0,0xfc,0x1d,0xda,0x6c,0xa7,0x83,0x9e,0xa9,0x9f,0x3d,0xbd,0xce,0xb9,0x98,0xaf,0xba,0xe6,0x93,0xda,0xfd,0xc8,0x23,0xfc,0xbb,0xab,0x57,0x65,0x05,0x72,0xac,0x07,0x20,0x8d,
+ 0x04,0x20,0xc0,0xca,0xe8,0x86,0xfd,0xe3,0x1b,0x9f,0x9b,0xb4,0xd3,0x29,0xaa,0x2d,0x4e,0x65,0x40,0xa1,0x86,0xd7,0x70,0x07,0xe0,0x44,0x0a,0x6a,0x12,0x1d,0x23,0x9f,0x32,0x8a,0x20,0x8d,
+ 0x04,0x20,0xc0,0xd1,0x02,0x2a,0x0f,0x11,0x7b,0xbf,0x5b,0xb4,0xb4,0x86,0x25,0xdb,0xaf,0x9f,0x1b,0xa2,0xab,0x3d,0xd1,0x5d,0xca,0xd8,0x63,0xa0,0x85,0xd9,0xf5,0x7c,0x31,0xe0,0x20,0x8d,
+ 0x04,0x20,0xc0,0xd7,0xd5,0x42,0x3a,0x05,0x2a,0x82,0x75,0x93,0x4a,0x99,0xbf,0x9f,0x2a,0x81,0xf9,0xb7,0xb8,0x28,0x0c,0xf1,0xc6,0x48,0xb9,0x50,0x69,0xc4,0xd1,0xaf,0x37,0x4c,0x20,0x8d,
+ 0x04,0x20,0xc0,0xdc,0x9a,0x31,0x15,0x4b,0xd0,0xd9,0x69,0x76,0x34,0x17,0xdb,0x83,0x16,0x0b,0x4d,0x16,0x5b,0xbe,0x6d,0x59,0x30,0x2e,0xa5,0x46,0x3f,0x28,0xf3,0x4a,0x95,0x63,0x20,0x8d,
+ 0x04,0x20,0xc0,0xea,0x1b,0x8f,0x32,0xf5,0xbb,0x62,0x15,0x05,0x44,0x25,0x06,0xcd,0xe1,0x1f,0xe6,0xb4,0x38,0xa4,0x6c,0x10,0x7e,0x9d,0x6d,0xce,0xf9,0xde,0x78,0xb5,0xc7,0x00,0x20,0x8d,
+ 0x04,0x20,0xc1,0x01,0x3f,0x10,0x1c,0x24,0xaa,0x3e,0x35,0x0c,0x39,0xb5,0x11,0x07,0x66,0x3b,0xe9,0x27,0x43,0x29,0x0f,0x38,0x05,0x87,0x67,0x38,0xd3,0xc1,0xe9,0xa8,0x63,0x75,0x20,0x8d,
+ 0x04,0x20,0xc1,0x0a,0x81,0x64,0xd4,0x2f,0x39,0xb9,0x39,0x29,0x18,0x98,0x7f,0xaf,0x2a,0xfa,0xfd,0x8e,0x6c,0x1e,0xae,0x92,0x1c,0x2b,0x77,0xd5,0xb8,0xdf,0xdd,0xca,0x4c,0xb8,0x20,0x8d,
+ 0x04,0x20,0xc1,0x0a,0x90,0x61,0x6e,0xab,0xc6,0x70,0x87,0xa1,0xe8,0x4e,0x9b,0xef,0xe3,0x41,0xa7,0xda,0x7b,0x4b,0x66,0x70,0x2e,0xf3,0x06,0x98,0x03,0x61,0xbc,0xec,0xde,0x6c,0x20,0x8d,
+ 0x04,0x20,0xc1,0x0c,0x77,0x8a,0x91,0xc0,0x06,0xb0,0xdf,0x2a,0xf3,0xb7,0x44,0x90,0x2c,0x2d,0x28,0xc5,0x3d,0xc8,0xde,0x87,0x1d,0x0a,0x65,0x64,0x17,0xea,0xc1,0xbd,0xb2,0x50,0x20,0x8d,
+ 0x04,0x20,0xc1,0x1b,0x6d,0x78,0xbb,0x47,0x94,0x5e,0xd3,0x4d,0x00,0xfd,0x75,0xa0,0xd7,0x57,0x51,0x84,0x65,0x35,0x5f,0xd9,0x2b,0xed,0xf9,0x48,0x81,0x34,0x12,0x4e,0x30,0xc8,0x20,0x8d,
+ 0x04,0x20,0xc1,0x1c,0x01,0xd0,0x8e,0xdd,0x14,0x5f,0x4b,0x65,0x24,0xf1,0x69,0x86,0xa6,0x63,0xeb,0x19,0xa9,0x20,0xec,0x56,0xff,0xd8,0x4f,0xe0,0x10,0x23,0xfa,0x65,0x39,0xf7,0x20,0x8d,
+ 0x04,0x20,0xc1,0x20,0x98,0xb5,0xb4,0x2f,0x0a,0x13,0x65,0x0a,0xff,0x20,0x53,0xc5,0xc7,0x16,0x18,0x9f,0x88,0x41,0xc9,0x3c,0xd1,0xab,0x1c,0x79,0x3d,0xfd,0x88,0xe5,0x92,0x44,0x20,0x8d,
+ 0x04,0x20,0xc1,0x22,0xd6,0x14,0xd1,0xa7,0x3c,0x6e,0x6e,0xb2,0x42,0x53,0x5e,0x71,0xbf,0x66,0xfb,0x37,0xbb,0x2d,0x6a,0x87,0xa7,0xea,0xcb,0xdd,0x21,0x95,0x20,0x93,0xa2,0xaf,0x20,0x8d,
+ 0x04,0x20,0xc1,0x27,0x32,0xe5,0xfa,0xa8,0x1a,0xc5,0x10,0xf6,0xb9,0x01,0x43,0x3a,0x70,0x14,0x8d,0xbb,0x49,0xcc,0x10,0x22,0x6a,0x92,0x6a,0xe3,0x4f,0x66,0x90,0x31,0x7c,0x3e,0x20,0x8d,
+ 0x04,0x20,0xc1,0x4c,0xed,0xee,0x68,0xa7,0xad,0xb6,0xc6,0xad,0x2e,0x2d,0xa6,0xb1,0xe2,0xb4,0xca,0xec,0xa1,0xa2,0x9b,0x7b,0xfe,0xfb,0xd8,0xea,0xf8,0x72,0x8a,0x73,0xa5,0x4c,0x20,0x8d,
+ 0x04,0x20,0xc1,0x59,0x44,0x81,0x9e,0x78,0x3f,0xda,0xb3,0xef,0xec,0x3e,0x6a,0x99,0x4e,0x14,0x32,0x2b,0x33,0xeb,0x30,0x5a,0xe1,0xda,0x6c,0xc9,0x6d,0xfa,0x4b,0x1d,0x1d,0x56,0x20,0x8d,
+ 0x04,0x20,0xc1,0x5f,0x0b,0x67,0x90,0x71,0x8d,0xa8,0xf6,0x43,0xb1,0x0c,0x63,0x1b,0x3f,0xf3,0xd8,0x7b,0xcc,0x86,0x6a,0x25,0x9e,0xf6,0x91,0xb6,0xc8,0x6a,0x8a,0x1a,0x26,0xc0,0x20,0x8d,
+ 0x04,0x20,0xc1,0x5f,0x41,0x32,0xbc,0xcc,0x9f,0x89,0xd0,0x32,0xe9,0x1e,0xdc,0x93,0x97,0x17,0x12,0xe8,0x37,0x1d,0xd4,0xbe,0x82,0xa5,0x5b,0xad,0x3d,0xce,0x02,0xf6,0x51,0x70,0x20,0x8d,
+ 0x04,0x20,0xc1,0x61,0xb9,0x12,0xe9,0xbe,0x69,0x6b,0x7e,0x6d,0xb0,0xbe,0x94,0xe8,0x93,0x3a,0x29,0xd2,0xf6,0x3e,0xe9,0x2c,0xfc,0x7b,0xce,0x96,0xdd,0x93,0xb8,0x89,0x27,0xda,0x20,0x8d,
+ 0x04,0x20,0xc1,0x67,0x44,0x50,0x1f,0xe1,0x64,0xf6,0xc0,0x0d,0xa8,0x11,0x3d,0x73,0xd0,0x6f,0xaa,0xc0,0x07,0x80,0x76,0x18,0xf4,0x8f,0x6e,0x63,0xdf,0x4e,0x79,0x2a,0x87,0xff,0x20,0x8d,
+ 0x04,0x20,0xc1,0x6f,0x9e,0xec,0xc3,0x0d,0xe9,0xd3,0x81,0xe6,0xd9,0x3a,0xa0,0x03,0xaf,0xc5,0xde,0x18,0xbd,0x10,0x5f,0x93,0xf9,0x14,0x9c,0x47,0xcb,0x04,0xf0,0x2b,0x7c,0x1f,0x20,0x8d,
+ 0x04,0x20,0xc1,0xbb,0x70,0x92,0x59,0x45,0x10,0x04,0x1a,0xd8,0xba,0x62,0xde,0x8b,0xa7,0xaa,0x7c,0x5b,0x90,0xbc,0xe9,0x06,0xbf,0xbd,0x11,0xfc,0x51,0x26,0xc7,0xd4,0x6f,0x89,0x20,0x8d,
+ 0x04,0x20,0xc1,0xbf,0xd2,0x8b,0xbb,0x12,0x04,0x19,0x02,0x31,0x79,0x6b,0xa9,0x70,0x51,0x7a,0xaf,0xea,0x8d,0x34,0x0f,0x2a,0x0f,0x8a,0xa1,0x1d,0x05,0x6c,0x9e,0x45,0xf4,0x08,0x20,0x8d,
+ 0x04,0x20,0xc1,0x85,0x96,0xe9,0x6b,0x81,0xd5,0x2d,0xb8,0xf7,0xa9,0x44,0xae,0x2a,0x5c,0xe9,0x14,0x6e,0x5e,0x3b,0x5b,0xa2,0x8c,0x61,0xad,0x22,0x6d,0xa4,0x95,0x88,0xf9,0xd3,0x20,0x8d,
+ 0x04,0x20,0xc1,0x86,0x5b,0x44,0xdb,0xdc,0xb7,0x0b,0x20,0x11,0xb5,0xc2,0x44,0x81,0x6a,0x44,0x59,0x0a,0x23,0x76,0x4e,0x7f,0x62,0x88,0x4f,0x8a,0x63,0x8f,0x05,0x9d,0x58,0x3d,0x20,0x8d,
+ 0x04,0x20,0xc1,0x8f,0xc3,0xdf,0x94,0x30,0x1e,0x81,0xda,0xee,0x1a,0x93,0x1f,0x54,0xcb,0xf5,0x54,0x08,0x55,0x04,0xaa,0xb4,0x44,0x20,0x9f,0xae,0xc9,0x6a,0x55,0x35,0x36,0x99,0x20,0x8d,
+ 0x04,0x20,0xc1,0x97,0x5a,0xb4,0x3b,0x1a,0xb5,0x53,0xea,0xd6,0x33,0xc4,0xda,0xb3,0xd3,0xe2,0xcc,0x11,0x9d,0xb5,0x7e,0x38,0x92,0xa7,0x64,0x27,0x28,0x60,0xf2,0xf9,0xaa,0x63,0x20,0x8d,
+ 0x04,0x20,0xc1,0x9d,0x27,0x85,0xbf,0x18,0xba,0x0f,0x1c,0x10,0xa4,0x78,0x47,0x13,0x4e,0x4f,0x93,0x39,0xa5,0xc7,0x97,0x37,0x13,0xaf,0xac,0xd6,0x97,0x38,0xd0,0xfc,0x2e,0x7a,0x20,0x8d,
+ 0x04,0x20,0xc1,0x9d,0x6b,0x67,0xdf,0x55,0x6b,0x14,0x69,0x62,0xb2,0x9b,0x21,0x76,0xe9,0x1e,0x7e,0x52,0x82,0x7d,0x9c,0x14,0xcf,0x95,0x97,0x8c,0x72,0x53,0x56,0x0d,0xbb,0xae,0x20,0x8d,
+ 0x04,0x20,0xc1,0xad,0x4b,0x67,0xa0,0xa4,0xca,0x2e,0x4e,0x0b,0xa6,0x28,0xe2,0x04,0xc7,0x17,0xcb,0xe5,0x99,0x38,0x53,0x3c,0xe7,0xc7,0x0d,0x3e,0xcf,0xaa,0x95,0xfc,0xbb,0x0e,0x20,0x8d,
+ 0x04,0x20,0xc1,0xf8,0x41,0xa6,0xaf,0x0b,0xbb,0xda,0xc8,0x0d,0x51,0xfe,0x4d,0xee,0x9f,0xf9,0x1f,0xf2,0x00,0xfd,0x3f,0x4d,0x52,0x9a,0x9f,0x9f,0xd8,0x10,0xfd,0x4a,0x62,0x6a,0x20,0x8d,
+ 0x04,0x20,0xc1,0xf9,0x47,0x60,0xb9,0x26,0x3b,0xb1,0xb5,0xc9,0xf6,0x59,0xb2,0xc5,0x07,0x39,0xac,0xf8,0x16,0x0a,0xb6,0xfd,0x24,0xb2,0x12,0xa9,0x5a,0xbd,0xc6,0x0e,0x3c,0xbb,0x20,0x8d,
+ 0x04,0x20,0xc1,0xfb,0x49,0x7c,0x6a,0xd7,0x67,0x3b,0xaa,0x7e,0x62,0x09,0x19,0x6c,0x20,0xca,0xd9,0xb4,0xa2,0x8c,0x97,0x5b,0x6c,0xf9,0x99,0x1f,0x11,0xe5,0x37,0xae,0x46,0x52,0x20,0x8d,
+ 0x04,0x20,0xc1,0xc6,0x3c,0x05,0xef,0xf2,0xcd,0x4d,0xf1,0x1f,0xa5,0x22,0x38,0x1b,0xa9,0xcb,0x4a,0x30,0x26,0xd1,0xf8,0x9d,0xb9,0xd9,0x10,0x2f,0xde,0x66,0xa7,0x98,0x49,0xb2,0x20,0x8d,
+ 0x04,0x20,0xc1,0xd1,0x2b,0x2e,0x6a,0x8c,0xb7,0x47,0xd5,0x51,0xc1,0xa5,0x44,0x3a,0x9d,0x46,0x9a,0x96,0xe2,0xea,0xd9,0xad,0x39,0x30,0x51,0xee,0x1b,0xc5,0x95,0x0d,0xca,0x0a,0x20,0x8d,
+ 0x04,0x20,0xc1,0xd2,0xac,0x2c,0x53,0x2f,0x7f,0xf1,0x90,0xc2,0xfd,0x0a,0x52,0xd4,0xdb,0x34,0x87,0x73,0x36,0xfe,0xe3,0xc6,0x7c,0x96,0x89,0xba,0x4c,0x53,0x86,0x8b,0x64,0xc5,0x20,0x8d,
+ 0x04,0x20,0xc1,0xdb,0x90,0xf5,0xec,0x10,0x48,0x88,0x4b,0xc1,0xbb,0x37,0x7a,0xe4,0x78,0xd0,0xcc,0x15,0xcc,0x88,0x95,0xab,0x59,0x9b,0xd5,0x3a,0xa8,0xce,0x99,0x29,0xb7,0xc0,0x20,0x8d,
+ 0x04,0x20,0xc1,0xe1,0x89,0xd1,0x66,0xb0,0xe7,0x57,0x65,0x27,0xa6,0x1c,0x3d,0x0a,0x85,0x6a,0x82,0x7f,0xf5,0x86,0xc5,0xb9,0xb5,0x7a,0xde,0xd8,0x0f,0xa2,0xe6,0x8b,0x92,0x8b,0x20,0x8d,
+ 0x04,0x20,0xc1,0xe7,0x72,0xd0,0xbd,0xcd,0xe0,0xe8,0x2a,0x8e,0x19,0x5e,0xcc,0xc9,0xad,0x64,0xd9,0xbe,0xf3,0x1d,0x8c,0xc9,0x78,0x3d,0x73,0xea,0xf6,0x55,0x67,0x2a,0x92,0x54,0x20,0x8d,
+ 0x04,0x20,0xc1,0xeb,0x8b,0xa4,0xa0,0xa3,0xe6,0xf9,0x26,0x37,0x89,0x76,0xeb,0xce,0xbd,0xca,0xd3,0x4d,0x18,0x6f,0x44,0xed,0x20,0x04,0x4c,0x4f,0x4c,0x37,0xa6,0x3e,0x47,0x33,0x20,0x8d,
+ 0x04,0x20,0xc1,0xee,0x23,0x3f,0x1a,0x0d,0xac,0x73,0xbd,0x86,0x22,0xd7,0x83,0x1d,0x2f,0x55,0xbe,0x22,0xc5,0x2b,0x87,0xa7,0x18,0x6b,0x0b,0xdf,0xb7,0xa8,0xdc,0x91,0xb0,0x58,0x20,0x8d,
+ 0x04,0x20,0xc2,0x34,0xae,0x3a,0x6c,0xb5,0x12,0x6f,0x85,0x1d,0x45,0xbe,0x4b,0x41,0xb3,0x6d,0xc3,0xaf,0x27,0x0f,0x5d,0xfb,0x7c,0x2b,0xe1,0x4d,0x6a,0x0a,0x4f,0x58,0xd3,0x0e,0x20,0x8d,
+ 0x04,0x20,0xc2,0x37,0xa7,0x30,0xff,0x39,0xfb,0xc7,0x11,0xd3,0xe2,0x35,0x92,0x6a,0x68,0x2f,0x17,0xc1,0x58,0x67,0xcd,0xee,0xde,0x07,0x2c,0x9c,0x22,0xe9,0x96,0xf1,0x23,0xe7,0x20,0x8d,
+ 0x04,0x20,0xc2,0x38,0x6b,0xc3,0x1e,0xd8,0xa5,0x49,0xa8,0x80,0xde,0x65,0x2d,0x3a,0x38,0xcf,0x0c,0x49,0xeb,0x47,0x11,0x4c,0x86,0xd8,0x44,0x4e,0x3d,0xd3,0x6f,0xa4,0x17,0x67,0x20,0x8d,
+ 0x04,0x20,0xc2,0x38,0xda,0x98,0xee,0xaa,0x47,0xd0,0xe4,0x41,0x3a,0x27,0x52,0x64,0xfc,0xa5,0x8d,0xbd,0x37,0xd1,0xd6,0xc9,0x3f,0x6f,0x6e,0x1a,0xc0,0x2a,0x70,0x80,0x61,0x70,0x20,0x8d,
+ 0x04,0x20,0xc2,0x3b,0x7f,0x22,0x4d,0x32,0x7e,0xf4,0x56,0x3d,0xb4,0xfc,0x8d,0x8e,0x2d,0x9a,0xe1,0x2a,0x87,0x28,0x4b,0xc7,0x8d,0x77,0x8b,0x0a,0x46,0xd4,0x1e,0xec,0x2e,0x34,0x20,0x8d,
+ 0x04,0x20,0xc2,0x3d,0x46,0x29,0x4b,0x08,0x7d,0x58,0xf1,0x3f,0xe8,0x68,0xe9,0x4b,0xea,0x82,0x8c,0x29,0x0e,0x57,0xe9,0x6a,0x64,0x77,0xe7,0xfa,0x7a,0x1c,0xd1,0x64,0x71,0x36,0x20,0x8d,
+ 0x04,0x20,0xc2,0x02,0x62,0x95,0xee,0xf8,0xd0,0xcc,0x55,0x2b,0x0e,0x4b,0x1d,0x8d,0xac,0x6a,0xf5,0x1e,0x9c,0x31,0x7d,0xc3,0x31,0x3d,0x52,0x99,0xe4,0xa7,0x7a,0x83,0x94,0x55,0x20,0x8d,
+ 0x04,0x20,0xc2,0x11,0x84,0x52,0xcd,0x97,0x3b,0x93,0xb1,0x56,0x46,0xec,0x9a,0x32,0x07,0x6e,0x0a,0xab,0x28,0x07,0x09,0x8c,0x3f,0x1e,0x37,0x9b,0x63,0x72,0xc2,0xcd,0xd5,0x47,0x20,0x8d,
+ 0x04,0x20,0xc2,0x12,0x3b,0xb1,0x66,0x69,0x45,0x68,0x87,0xb9,0xbd,0x44,0x74,0x9c,0xd3,0x17,0x77,0xdf,0xb0,0x82,0xa3,0x9e,0xc4,0x36,0x89,0x53,0x9a,0xef,0x86,0xc9,0x34,0x29,0x20,0x8d,
+ 0x04,0x20,0xc2,0x24,0x4f,0xf5,0x2a,0x91,0xb5,0xf9,0x9f,0xfc,0x0d,0xdd,0xb0,0x7a,0x22,0x8e,0xcf,0x4a,0xc5,0xcc,0x3b,0x28,0x76,0xb3,0x1b,0x6e,0xda,0x61,0x18,0xaf,0x01,0xa1,0x20,0x8d,
+ 0x04,0x20,0xc2,0x24,0x41,0xfe,0x45,0xdd,0xf3,0x26,0xac,0xc6,0x25,0x10,0xe0,0x4b,0x4e,0x2f,0x05,0x18,0xad,0x6a,0x7e,0x74,0x62,0x84,0x78,0xf8,0xba,0x2c,0x48,0x1d,0x95,0xd1,0x20,0x8d,
+ 0x04,0x20,0xc2,0x25,0x5a,0x55,0x90,0x9b,0x7f,0x63,0xcf,0xc3,0x68,0xe3,0x0c,0xc8,0x6b,0xfd,0x69,0x27,0xde,0xd1,0x61,0x6d,0x6a,0x75,0xdf,0xb2,0xc6,0xdc,0xb7,0x8c,0x0e,0x48,0x20,0x8d,
+ 0x04,0x20,0xc2,0x26,0x22,0x61,0xdb,0xb5,0x74,0xc5,0x77,0xce,0x65,0x7c,0xc7,0x37,0x6d,0xf8,0xc4,0x58,0xfd,0x28,0x31,0x86,0xcc,0xad,0x93,0x42,0x9e,0xe0,0x33,0x4e,0x9a,0x09,0x20,0x8d,
+ 0x04,0x20,0xc2,0x28,0x49,0x42,0x02,0xfe,0xda,0xdf,0xaa,0xe0,0x18,0x2a,0xc5,0xd8,0x5f,0xc3,0x04,0x89,0x67,0x2a,0xf8,0x6f,0x2d,0x84,0x7c,0x2d,0xa8,0x20,0x38,0x4c,0x27,0xa0,0x20,0x8d,
+ 0x04,0x20,0xc2,0x33,0xf1,0xe9,0x6a,0x32,0xb4,0xc2,0xcd,0xfe,0x47,0x49,0xa9,0xc0,0xee,0x9c,0x15,0x04,0x9a,0xe1,0x1b,0x32,0x16,0x95,0x76,0xac,0x90,0xec,0x17,0x03,0x84,0x6a,0x20,0x8d,
+ 0x04,0x20,0xc2,0x76,0x69,0x71,0xb5,0xa3,0x24,0x5c,0xcc,0x16,0x6f,0xd5,0x4e,0x09,0x8d,0x24,0x75,0x95,0xb0,0x4d,0xea,0x94,0x4d,0xec,0xdc,0x4e,0xab,0x8b,0x5e,0x51,0x83,0x02,0x20,0x8d,
+ 0x04,0x20,0xc2,0x77,0x0e,0x22,0x92,0x9d,0xca,0x28,0x70,0x28,0x90,0x69,0x6d,0xa6,0xb0,0x17,0xde,0x7d,0x18,0xcb,0x1f,0x7c,0xca,0xe2,0xf0,0xa9,0xad,0xa9,0xb2,0x48,0x68,0x6c,0x20,0x8d,
+ 0x04,0x20,0xc2,0x7d,0xef,0x16,0xe9,0x18,0xeb,0x9e,0x5f,0x2a,0x3c,0xf2,0x73,0xf7,0x76,0xaa,0x90,0xe0,0xd5,0x0b,0x18,0xb3,0x9b,0x87,0x6c,0x45,0xd2,0x87,0xc2,0x08,0x80,0x33,0x20,0x8d,
+ 0x04,0x20,0xc2,0x46,0x71,0xd2,0x27,0xf5,0x61,0x7a,0x61,0x46,0x65,0x24,0xa7,0x80,0x29,0xca,0x5a,0x8d,0x90,0xf7,0xb9,0xf7,0x98,0x76,0x24,0x1d,0x3a,0x78,0x0d,0x87,0x1d,0xba,0x20,0x8d,
+ 0x04,0x20,0xc2,0x54,0xe4,0xd5,0x32,0x37,0xb0,0x72,0xa7,0x4b,0x6e,0x82,0xf1,0x44,0xfa,0x27,0x8b,0x1e,0x6a,0x8b,0xde,0x33,0x22,0x04,0x39,0xd2,0x95,0x89,0x9b,0xef,0x2e,0xb3,0x20,0x8d,
+ 0x04,0x20,0xc2,0x68,0x3c,0xca,0x56,0xc5,0x4b,0x0c,0x12,0x67,0xd1,0x0c,0x72,0xd4,0x86,0xb9,0xbd,0x9f,0x50,0x2d,0xbf,0xf4,0xa6,0x41,0x2b,0x49,0xc6,0x4b,0x44,0x4a,0xb7,0x7c,0x20,0x8d,
+ 0x04,0x20,0xc2,0xb4,0x57,0x38,0xae,0x41,0x6e,0x60,0xc5,0xfd,0x07,0x3a,0xe5,0x58,0x24,0x5c,0x65,0x5c,0x08,0xd0,0x35,0xb5,0xcb,0xd7,0xbe,0x3b,0x29,0x0b,0xad,0xec,0xb7,0x99,0x20,0x8d,
+ 0x04,0x20,0xc2,0xb9,0x22,0x44,0x55,0xc6,0x6b,0x0b,0x98,0x26,0x6f,0xe5,0x16,0x78,0x84,0x45,0x57,0x97,0x03,0x73,0xe4,0xb3,0xbf,0x6c,0x18,0x30,0xb0,0x24,0x50,0x22,0x41,0x10,0x20,0x8d,
+ 0x04,0x20,0xc2,0x8f,0xb9,0xf3,0x99,0x4b,0x92,0xf4,0xff,0xce,0xa4,0x08,0xef,0x7b,0x4b,0x49,0xf0,0x2d,0x4f,0xc4,0xdb,0x10,0xa2,0x7f,0xc8,0x83,0xc8,0xb1,0x0f,0x33,0x30,0x2f,0x20,0x8d,
+ 0x04,0x20,0xc2,0x94,0x75,0xb7,0xd7,0xf1,0xc4,0xc3,0xe2,0x37,0xec,0x6e,0x02,0xec,0x5d,0x05,0x0f,0xd5,0x71,0xeb,0x8b,0xc0,0x89,0x22,0x72,0xf6,0xe3,0xbd,0x90,0x56,0x53,0x26,0x20,0x8d,
+ 0x04,0x20,0xc2,0xa0,0x43,0xd9,0x7c,0xf9,0xed,0x87,0xd0,0xe7,0xa5,0x2e,0xa7,0xb8,0x97,0x70,0x96,0x3a,0xad,0x68,0xbc,0x0e,0xf5,0xbe,0x58,0xf6,0x19,0xee,0xd4,0x29,0x28,0x37,0x20,0x8d,
+ 0x04,0x20,0xc2,0xa9,0xa1,0x2e,0xd1,0xdd,0xf6,0xd1,0xe4,0xa9,0x1a,0xb6,0xee,0x49,0xee,0xcc,0xdd,0x0c,0x79,0xa3,0x04,0xd4,0x46,0xf6,0xce,0x79,0x80,0xf3,0x7e,0x0a,0xae,0x1f,0x20,0x8d,
+ 0x04,0x20,0xc2,0xad,0x1b,0x50,0xa5,0xb5,0x41,0x75,0xd9,0x15,0x9e,0xce,0xb3,0xe3,0x3a,0xc3,0xbb,0x71,0x93,0xe3,0xb7,0x2f,0xef,0xe0,0xc2,0xe5,0xcf,0xa9,0xf9,0x9c,0x47,0x44,0x20,0x8d,
+ 0x04,0x20,0xc2,0xf4,0xf8,0x90,0x01,0xc6,0xb1,0x0c,0x1d,0x95,0x46,0x21,0xcf,0x45,0xc0,0x7d,0x1e,0xc6,0xa1,0x33,0xd1,0xb6,0xcc,0xb2,0xb6,0x9d,0xdf,0x3a,0xe0,0x39,0xfc,0x43,0x20,0x8d,
+ 0x04,0x20,0xc2,0xf5,0x29,0xc8,0xe0,0x76,0x5f,0x88,0x4e,0x93,0xfb,0x3c,0xb6,0xf3,0xf9,0xd4,0x0e,0xb2,0x0d,0x4d,0xa5,0x8e,0x84,0xf9,0x55,0xbc,0xa8,0x00,0x23,0x8d,0xb6,0x3c,0x20,0x8d,
+ 0x04,0x20,0xc2,0xf7,0xf6,0xe0,0xfb,0xad,0x13,0x9d,0x17,0x11,0xce,0xc8,0xe8,0x3a,0x64,0x45,0xf0,0x8c,0xec,0x69,0xec,0x4a,0xd6,0xb2,0x26,0x58,0x8c,0x29,0x5b,0x21,0x24,0x02,0x20,0x8d,
+ 0x04,0x20,0xc2,0xf6,0x17,0x77,0x36,0xb4,0x8d,0xd1,0x84,0xf1,0x88,0x92,0xaa,0xbb,0x15,0xb5,0xae,0xfd,0xa8,0x23,0x33,0xe2,0x72,0x79,0x83,0xee,0x9c,0x1d,0x2e,0x20,0xfe,0x1b,0x20,0x8d,
+ 0x04,0x20,0xc2,0xc0,0xec,0x59,0xce,0x22,0x6a,0xf2,0xba,0x44,0xb5,0xd9,0x8b,0xa4,0xe2,0xd0,0x0e,0x52,0x3d,0x21,0xad,0x30,0x91,0x71,0xff,0x0e,0x19,0x64,0x44,0x97,0x5a,0x86,0x20,0x8d,
+ 0x04,0x20,0xc2,0xc0,0xf8,0x9a,0xd3,0x47,0x07,0x2a,0x32,0xfd,0xbd,0x56,0x7a,0x2f,0x64,0x91,0x77,0x84,0x6c,0x81,0xc6,0x28,0x10,0xe8,0x76,0x29,0xac,0x4d,0xe7,0x12,0xae,0xc9,0x20,0x8d,
+ 0x04,0x20,0xc2,0xc2,0xb6,0xc4,0x7a,0x4b,0x4a,0x99,0xd2,0x53,0x5f,0xb1,0x3f,0x3d,0x17,0xe3,0x0d,0x08,0xf6,0x10,0x71,0x2b,0x46,0xb2,0xca,0xde,0x89,0xe2,0xde,0x1e,0xa2,0x76,0x20,0x8d,
+ 0x04,0x20,0xc2,0xc7,0x3b,0xfd,0xdd,0xc7,0x52,0x5d,0x52,0x71,0x8c,0xe0,0x5e,0xe0,0xbd,0xf0,0x14,0xe5,0xf7,0xb6,0x04,0x65,0xaa,0x5a,0xf4,0xaa,0x5d,0x40,0xd2,0x53,0x8c,0xd9,0x20,0x8d,
+ 0x04,0x20,0xc2,0xcf,0xba,0xad,0x14,0x7f,0x95,0xaf,0xbe,0x7a,0x99,0xed,0xcb,0x98,0xa6,0xa2,0x32,0x80,0x3a,0x41,0xee,0x36,0xea,0x90,0x9c,0xb7,0x87,0x9b,0x08,0x3e,0x38,0xbc,0x20,0x8d,
+ 0x04,0x20,0xc2,0xe5,0x56,0xa6,0x11,0x11,0x81,0x35,0x65,0x3d,0x31,0x55,0x69,0xf8,0x59,0xd6,0xfd,0x9f,0xfb,0x15,0x33,0xc9,0x45,0x98,0xd9,0x62,0xf7,0x70,0xfe,0x6d,0x0c,0xa7,0x20,0x8d,
+ 0x04,0x20,0xc2,0xe9,0x62,0x0a,0xcb,0x40,0x4b,0xd1,0xdb,0x52,0xa3,0xfd,0xc1,0xc3,0x86,0x97,0x04,0x51,0x9e,0x6a,0x29,0xdd,0x8e,0x8a,0x59,0x8d,0x69,0xfe,0xd9,0x69,0x24,0x00,0x20,0x8d,
+ 0x04,0x20,0xc2,0xf1,0x43,0x2d,0xfd,0x0e,0x9f,0xee,0x99,0x88,0x71,0x4e,0x4d,0x22,0x2f,0xbc,0xac,0xb3,0x90,0x43,0x20,0x8d,0xf1,0xeb,0xf0,0x38,0xac,0x43,0x90,0xd1,0xd1,0x0a,0x20,0x8d,
+ 0x04,0x20,0xc3,0x0d,0x87,0x0e,0xb9,0x99,0x65,0xc6,0xb5,0x09,0x4b,0x6c,0x8a,0xf8,0x80,0x19,0x27,0x74,0xb3,0xfe,0xea,0x2b,0xb8,0xe2,0x98,0x3c,0xa1,0xca,0x3d,0xa9,0xb3,0x44,0x20,0x8d,
+ 0x04,0x20,0xc3,0x11,0x6d,0x8f,0x8a,0x59,0x1e,0x7b,0x52,0xc1,0x51,0x86,0xf5,0xae,0x32,0xf1,0xe5,0x20,0xf2,0x55,0x11,0xb5,0x46,0x7e,0x43,0x66,0xcf,0x26,0xb5,0x52,0x0b,0x6a,0x20,0x8d,
+ 0x04,0x20,0xc3,0x1b,0x87,0x8f,0xf7,0x66,0x74,0x55,0x03,0x51,0xe6,0x2f,0x58,0x69,0x01,0x2f,0xe3,0x51,0xe1,0x7e,0x21,0x18,0xf7,0xbb,0xfc,0x89,0x48,0x7a,0x68,0x7a,0x74,0x14,0x20,0x8d,
+ 0x04,0x20,0xc3,0x1e,0xfe,0xa5,0x60,0x55,0x8a,0x74,0xe8,0x2e,0xcd,0xbd,0x6d,0xee,0x00,0x42,0xd5,0x18,0x06,0x2e,0x46,0x6e,0xcd,0xbc,0x65,0xbd,0x52,0x30,0xc5,0x56,0x9e,0x2f,0x20,0x8d,
+ 0x04,0x20,0xc3,0x23,0x46,0xb3,0x55,0x3b,0x81,0x1b,0x7e,0x2f,0x77,0x92,0x36,0x43,0x8c,0x25,0x7a,0x7c,0xfb,0x74,0x62,0xd2,0xa4,0x7b,0xb0,0xd5,0x77,0xaf,0xd5,0x8d,0xb7,0xac,0x20,0x8d,
+ 0x04,0x20,0xc3,0x27,0xa3,0x8c,0xa6,0x1d,0xdd,0xa0,0x5a,0xa9,0xd2,0xb9,0x8e,0xcc,0x2f,0xa8,0x1e,0x9f,0xf5,0x3f,0xae,0xf9,0x3a,0xd5,0x71,0x86,0x39,0xc5,0xca,0xb5,0x18,0x9a,0x20,0x8d,
+ 0x04,0x20,0xc3,0x29,0x42,0x83,0xa1,0x8f,0xfa,0xb4,0x4a,0xc5,0x88,0x7c,0xf3,0x33,0x67,0x17,0x9d,0xef,0x99,0xb9,0x3e,0x0d,0xfa,0xbc,0xae,0xd4,0x25,0x6d,0xbb,0x16,0xfb,0x3e,0x20,0x8d,
+ 0x04,0x20,0xc3,0x2e,0x40,0x7f,0x92,0x95,0x93,0x88,0x56,0xbf,0x4c,0x8f,0xfe,0x0d,0xb5,0x43,0x05,0x28,0x72,0x2d,0x03,0xbb,0x7e,0x9b,0xe3,0x2a,0x5a,0x12,0xe3,0xdf,0x72,0x77,0x20,0x8d,
+ 0x04,0x20,0xc3,0x76,0x0a,0xba,0xc3,0x57,0x44,0xeb,0xfe,0x19,0xdf,0x25,0xb8,0x23,0x3a,0xa7,0x53,0xab,0x9b,0x68,0x8d,0xc4,0xa3,0xe5,0x0a,0x2a,0x6b,0xd1,0x09,0x30,0x88,0xd1,0x20,0x8d,
+ 0x04,0x20,0xc3,0x41,0xcc,0xba,0x30,0xef,0xc8,0x73,0x1c,0x96,0x59,0x0c,0x0f,0xac,0x3c,0xc9,0xaf,0xb9,0xf1,0x66,0xaf,0x55,0xae,0x3a,0x35,0xf8,0x79,0x01,0x1b,0x5f,0x95,0x70,0x20,0x8d,
+ 0x04,0x20,0xc3,0x45,0xf2,0x8b,0xe3,0xce,0xb9,0x2d,0xe9,0x4f,0xf3,0x9e,0x35,0x06,0xae,0x38,0x7f,0xc7,0x05,0x84,0xe2,0x4c,0xed,0xc5,0x4a,0xaa,0x73,0x8b,0x49,0x77,0x21,0x91,0x20,0x8d,
+ 0x04,0x20,0xc3,0x50,0xba,0xe6,0x94,0x59,0x81,0xa9,0xae,0xba,0x38,0x90,0x2f,0x83,0x02,0xec,0x1e,0x3e,0x37,0x3f,0x8f,0xe4,0xd9,0x60,0x89,0x7f,0x2b,0x7b,0x36,0xeb,0x73,0x4b,0x20,0x8d,
+ 0x04,0x20,0xc3,0x55,0x5f,0xb5,0x27,0xf1,0xd3,0xdb,0x92,0xd7,0xbe,0x36,0x6a,0xcd,0xb4,0xf3,0x85,0x8a,0xd3,0x93,0x34,0x57,0xb3,0x36,0xdd,0xbd,0xd4,0x37,0x96,0x47,0x02,0xde,0x20,0x8d,
+ 0x04,0x20,0xc3,0x60,0x6c,0xb9,0x35,0x1d,0xab,0xa8,0xd1,0x1a,0x8a,0xc8,0x23,0x87,0x5a,0x27,0x4f,0x68,0x21,0xeb,0x9d,0x24,0x36,0x95,0x55,0xfc,0xbd,0xd4,0x67,0xc5,0x34,0x5b,0x20,0x8d,
+ 0x04,0x20,0xc3,0xb9,0x85,0x4f,0xe7,0x69,0x9e,0xf0,0x55,0xd6,0xf9,0x75,0x2c,0xef,0xc0,0x4a,0xfd,0x6d,0xf0,0x36,0xf4,0x22,0x22,0x90,0x9e,0x46,0xe5,0xe4,0xa9,0x9e,0x91,0x1d,0x20,0x8d,
+ 0x04,0x20,0xc3,0x81,0x3d,0x07,0x9e,0x3e,0x49,0x43,0xe3,0xed,0xef,0xcc,0x96,0x16,0xe6,0x7b,0xc8,0x8d,0xdd,0xb9,0x1d,0xed,0x25,0xe9,0x0f,0x17,0x5b,0x8f,0x77,0xc9,0xfe,0x5f,0x20,0x8d,
+ 0x04,0x20,0xc3,0x83,0x10,0x7e,0x3b,0x51,0x26,0x9a,0x1e,0x3c,0x37,0x04,0x51,0xc2,0x8c,0x91,0x33,0xc7,0x33,0x44,0x21,0x6a,0xc3,0x5e,0x37,0x87,0xed,0x76,0xa9,0xd4,0xcb,0x04,0x20,0x8d,
+ 0x04,0x20,0xc3,0x8c,0x5b,0x8c,0x4e,0xd7,0xb9,0x34,0x84,0x24,0x22,0xb5,0xa7,0x6b,0xcb,0xcb,0x69,0xa3,0x69,0x56,0xac,0xb8,0xb6,0x16,0x7b,0x40,0x77,0x72,0x2d,0xa3,0x01,0xa6,0x20,0x8d,
+ 0x04,0x20,0xc3,0x99,0x6b,0x94,0x48,0x5a,0x40,0x3f,0x6c,0xc8,0x10,0x47,0xdf,0xf7,0xee,0x37,0x17,0x87,0x89,0xe7,0xe9,0x7a,0xc8,0x0d,0xd4,0xea,0x93,0xd8,0xba,0xca,0xc3,0xa6,0x20,0x8d,
+ 0x04,0x20,0xc3,0x9b,0xd3,0x67,0x90,0xfc,0x9c,0x81,0x23,0x88,0xfa,0x4b,0xac,0x80,0x48,0xa4,0x90,0xec,0x33,0xbe,0x4b,0xb4,0x10,0x4f,0x7e,0xdc,0xe3,0xb7,0x91,0xc8,0xa4,0x62,0x20,0x8d,
+ 0x04,0x20,0xc3,0x9c,0x10,0xff,0x43,0xc4,0xfd,0xa6,0xf4,0x6f,0x95,0x36,0x08,0x3e,0x00,0xda,0xd8,0x54,0xf8,0xc5,0xa4,0x5a,0xee,0x79,0xde,0xab,0x20,0x30,0xbe,0xd0,0xb6,0xf4,0x20,0x8d,
+ 0x04,0x20,0xc3,0xa6,0x28,0x61,0xa9,0xd7,0x15,0xa1,0x29,0x0b,0x77,0x78,0x74,0x9c,0xb3,0x4d,0x2b,0x5b,0x20,0x02,0x0e,0x5d,0x10,0x40,0x5a,0x54,0x3b,0x59,0xb2,0x57,0x5b,0xa5,0x20,0x8d,
+ 0x04,0x20,0xc3,0xf6,0x9a,0x3b,0xfe,0xd8,0xd8,0x8f,0xc7,0x07,0x55,0x76,0xa8,0x69,0x7a,0xf6,0x84,0xb5,0xc6,0x34,0xf2,0xa5,0xd9,0xaf,0x22,0x1a,0xee,0x30,0x29,0x88,0x7e,0xf2,0x20,0x8d,
+ 0x04,0x20,0xc3,0xf9,0xf3,0x50,0x7e,0x2a,0x65,0x54,0x9a,0x9d,0xe3,0x90,0x20,0x70,0x3b,0x42,0x79,0x92,0xc4,0x80,0x14,0xc4,0x07,0x37,0xc5,0xbf,0xeb,0xf7,0x94,0x37,0x0c,0x6b,0x20,0x8d,
+ 0x04,0x20,0xc3,0xfc,0xa5,0x99,0xb1,0xaa,0x25,0x0f,0xee,0x06,0xe0,0xd5,0xae,0xf4,0xff,0xa3,0x74,0xaf,0xbc,0x2a,0xf7,0xbc,0x99,0xe4,0x5a,0xd4,0x6e,0x99,0x68,0x8d,0xf7,0x1c,0x20,0x8d,
+ 0x04,0x20,0xc3,0xc0,0x0c,0x97,0x59,0xdc,0xfa,0x38,0x66,0x83,0x5e,0x0c,0x94,0xbf,0x01,0xd5,0x2a,0xaf,0x6c,0xd4,0x75,0x65,0x3c,0xd0,0x32,0x71,0xc2,0x12,0x39,0x8e,0x61,0x26,0x20,0x8d,
+ 0x04,0x20,0xc3,0xc0,0xac,0x4a,0x7c,0x08,0x4e,0x7d,0x26,0x90,0x1f,0xa3,0xfb,0xe1,0x90,0x6c,0x4d,0x6b,0xec,0x80,0x49,0x14,0xf3,0x79,0xdd,0x0f,0x0a,0x0c,0x88,0x58,0xdb,0x2c,0x20,0x8d,
+ 0x04,0x20,0xc3,0xd4,0x95,0x4f,0x83,0x6e,0x21,0x8f,0x4a,0xa4,0x16,0x06,0x83,0x4e,0x76,0x6c,0x93,0xdb,0xfb,0x9b,0xb7,0x88,0x35,0x7a,0x19,0x39,0x5d,0xa3,0xaa,0xf7,0xa7,0x16,0x20,0x8d,
+ 0x04,0x20,0xc3,0xd8,0x85,0x4e,0x5b,0x90,0x00,0x52,0xa7,0x54,0x77,0x72,0xc5,0x04,0x02,0xeb,0x3f,0x76,0x84,0x2b,0xba,0x82,0x77,0xdb,0xb7,0x9d,0xc2,0x06,0x01,0x30,0x2e,0xfd,0x20,0x8d,
+ 0x04,0x20,0xc3,0xda,0x86,0x82,0x3a,0x3e,0x03,0x5d,0xa4,0x6e,0xac,0x7e,0x0b,0xfe,0x64,0x87,0xac,0xfc,0xd6,0x36,0xf3,0x7f,0xc1,0x4a,0x1f,0x20,0xdd,0x2d,0x9f,0x34,0x61,0xf4,0x20,0x8d,
+ 0x04,0x20,0xc3,0xdc,0x86,0xe4,0xd0,0x5e,0xf2,0xee,0x8f,0x72,0x9c,0x5e,0xc0,0x35,0xa1,0x50,0xe6,0xd1,0xdd,0x57,0x58,0x13,0x63,0x09,0xe0,0x4f,0x1a,0x60,0x8b,0xac,0x84,0x73,0x20,0x8d,
+ 0x04,0x20,0xc3,0xdf,0xfd,0xbe,0xba,0xa8,0x92,0x58,0x6b,0x6b,0x9d,0x8e,0xe4,0xd2,0x24,0x65,0xee,0x55,0x36,0xd3,0x32,0xaf,0x2a,0xd8,0x9b,0xb2,0x06,0xb0,0x12,0xb8,0xbe,0xf8,0x20,0x8d,
+ 0x04,0x20,0xc4,0x3f,0x2f,0x3c,0x9f,0x4e,0x63,0x94,0xf6,0x97,0x5b,0xa3,0x89,0xda,0xe3,0xe8,0x65,0xc5,0x2d,0x38,0xab,0xf5,0xf0,0x28,0x71,0x78,0x1a,0x6f,0xfb,0xb8,0x1e,0xe4,0x20,0x8d,
+ 0x04,0x20,0xc4,0x1a,0x05,0xf1,0xe7,0xc7,0xed,0x9d,0xae,0x4e,0x46,0xb7,0x1c,0xa3,0x01,0xef,0x82,0xd0,0xe6,0xb5,0xc3,0xf1,0xa6,0x1b,0xaf,0x73,0x73,0x15,0x7b,0x70,0x7e,0x2a,0x20,0x8d,
+ 0x04,0x20,0xc4,0x1c,0x88,0x4f,0x6c,0x72,0xd3,0xcc,0x1a,0x1c,0xe6,0x70,0xc2,0x74,0xc3,0x09,0x88,0x4f,0x88,0x13,0x59,0x78,0xd1,0xa6,0x3c,0x66,0x10,0x81,0x0e,0x94,0xb2,0x09,0x20,0x8d,
+ 0x04,0x20,0xc4,0x2a,0x70,0xb2,0xa2,0xe7,0x51,0x8d,0x8e,0x2b,0xfb,0x44,0x4a,0x1e,0x86,0x1c,0xf4,0x52,0x56,0xd7,0xe5,0xfb,0xbc,0x80,0xa8,0x77,0x8f,0xaf,0x6b,0xca,0x2a,0xed,0x20,0x8d,
+ 0x04,0x20,0xc4,0x40,0xc0,0x86,0x0b,0xca,0x99,0xe7,0x75,0xea,0x17,0x61,0xdf,0x6d,0xa9,0xac,0x54,0x50,0x2d,0x70,0x70,0x6b,0x21,0x55,0xe3,0x42,0xba,0xeb,0x04,0x73,0x69,0xc2,0x20,0x8d,
+ 0x04,0x20,0xc4,0x47,0x36,0xcf,0x8b,0x53,0xf1,0x2c,0x62,0x35,0x8e,0x20,0x7b,0xdb,0x6a,0xe6,0xbe,0x6b,0xdb,0x28,0x74,0x87,0x34,0x3c,0xba,0x18,0x90,0x57,0x50,0xd6,0xcb,0x98,0x20,0x8d,
+ 0x04,0x20,0xc4,0x56,0x2e,0x47,0x70,0x28,0xa3,0xcb,0xf6,0xcd,0x12,0x29,0x38,0x8e,0xa0,0x94,0x5e,0x03,0xba,0x3b,0xa2,0x35,0xd5,0x98,0x66,0x55,0xc2,0x89,0xef,0x36,0x9b,0x2c,0x20,0x8d,
+ 0x04,0x20,0xc4,0x58,0xf0,0x48,0x69,0x60,0x7f,0xf7,0x35,0xdc,0x17,0xa2,0x93,0xeb,0x85,0x4f,0x4d,0x3f,0x84,0x29,0xbf,0xdb,0x7a,0x47,0x13,0x53,0x2e,0x1b,0x5b,0x46,0x03,0x3d,0x20,0x8d,
+ 0x04,0x20,0xc4,0x60,0xe5,0xd8,0x0e,0xbb,0xc1,0xbd,0x0a,0xda,0xc9,0x0c,0xd0,0x18,0xcc,0x6a,0x28,0x48,0xfb,0xd4,0x61,0x57,0x96,0xa4,0x1e,0x18,0x9f,0xfa,0x0e,0x0f,0x03,0x80,0x20,0x8d,
+ 0x04,0x20,0xc4,0x6c,0xa9,0x20,0xcf,0xbf,0x0a,0xe8,0x2e,0xcd,0x2f,0x85,0x7b,0x4d,0xef,0xbe,0xb3,0xa6,0x49,0xcc,0x7a,0x0d,0xfd,0x8d,0x42,0x66,0xf8,0xfb,0x49,0x98,0xe8,0x6d,0x20,0x8d,
+ 0x04,0x20,0xc4,0x70,0x13,0xb3,0x44,0x97,0x24,0x8a,0x3d,0x2d,0xc2,0x4a,0x5a,0xa0,0x8c,0xac,0x2f,0xae,0x32,0x09,0xeb,0x51,0x66,0x6a,0xc5,0xef,0xa4,0xf1,0xc1,0x76,0x05,0x39,0x20,0x8d,
+ 0x04,0x20,0xc4,0x73,0x65,0xee,0x21,0x2a,0x6f,0xf2,0x60,0x38,0x4d,0x5a,0x9c,0xeb,0x1f,0x83,0x2a,0xf6,0xa8,0x97,0x53,0x30,0xb8,0x3e,0xd2,0x0f,0xd1,0x57,0x9b,0xc2,0x3f,0x34,0x20,0x8d,
+ 0x04,0x20,0xc4,0xb4,0xca,0x62,0xa2,0x6b,0xc6,0x01,0x92,0x73,0xc8,0x2a,0xb2,0x1f,0xf0,0x8b,0x7f,0x3f,0x47,0xe4,0xd4,0xdc,0x12,0xbf,0xf8,0xb9,0x67,0x30,0x7c,0x99,0xd2,0x3d,0x20,0x8d,
+ 0x04,0x20,0xc4,0x8e,0xfd,0x1b,0xc1,0xee,0xda,0x32,0x13,0x3b,0xe3,0x6e,0xd5,0x70,0x39,0xf0,0xa0,0x1c,0xac,0xb7,0x80,0xcc,0x64,0x7c,0x33,0x82,0xed,0x9b,0xe6,0x82,0xfc,0xac,0x20,0x8d,
+ 0x04,0x20,0xc4,0xa1,0xd8,0xcd,0xe5,0xca,0xb3,0xd3,0x4f,0x52,0xf6,0x90,0x30,0xc8,0x7f,0x91,0x05,0x9d,0xa4,0x8f,0xca,0xe8,0xff,0x1e,0x05,0xec,0xe6,0x3a,0x4e,0x43,0x65,0x8d,0x20,0x8d,
+ 0x04,0x20,0xc4,0xb1,0x7e,0x90,0x06,0xb3,0x60,0xf2,0x91,0x99,0xd3,0x4f,0x61,0x5e,0x5a,0x16,0xc9,0x42,0x41,0x5d,0x2e,0xd2,0xdc,0x57,0x05,0x81,0x5a,0xed,0xbc,0xab,0x14,0x0b,0x20,0x8d,
+ 0x04,0x20,0xc4,0xf5,0x5a,0x07,0xcb,0x58,0x88,0x6b,0xd2,0x82,0xa6,0xd0,0x45,0x26,0x05,0x7b,0x03,0x8c,0xf1,0x51,0x25,0x2f,0x7e,0x4a,0x9a,0x7c,0x04,0x49,0xdb,0xea,0x0a,0x82,0x20,0x8d,
+ 0x04,0x20,0xc4,0xc1,0xf8,0x7e,0xbd,0x5a,0xb3,0x3e,0x67,0x0f,0xdb,0x39,0xc1,0x5c,0x43,0x9e,0x19,0x73,0x32,0x90,0x1b,0x66,0xd0,0x1b,0x3e,0x3e,0xcf,0x64,0x0d,0x90,0x71,0x01,0x20,0x8d,
+ 0x04,0x20,0xc4,0xd1,0xa7,0x16,0x50,0x37,0xd5,0xcc,0x85,0x6d,0xf0,0x21,0x7e,0x66,0x00,0x74,0x75,0x97,0xb1,0x72,0x20,0x70,0xb4,0xdd,0x74,0xfa,0x45,0x99,0x26,0x13,0x1f,0x05,0x20,0x8d,
+ 0x04,0x20,0xc4,0xd4,0xa8,0x11,0x0a,0xff,0xf2,0x94,0xd8,0x01,0x90,0xd6,0x29,0xd2,0x8c,0xdf,0xd3,0x1d,0xc7,0x51,0x37,0x84,0xab,0xd0,0x79,0x07,0xf1,0xf9,0xa0,0x0b,0x84,0x75,0x20,0x8d,
+ 0x04,0x20,0xc4,0xe1,0xca,0x3a,0xd1,0xf5,0x6d,0x84,0xb2,0x29,0xa8,0x05,0xf0,0x21,0x89,0x4a,0xf3,0x85,0x95,0x87,0x81,0xdb,0xbc,0xf0,0x82,0x23,0x59,0xd1,0x8f,0xd4,0xd0,0x85,0x20,0x8d,
+ 0x04,0x20,0xc4,0xe0,0x79,0x39,0x6a,0xfb,0xe1,0x48,0xf4,0x54,0xd1,0x41,0x78,0xd0,0x87,0xad,0xff,0xac,0x21,0x16,0x0e,0xf6,0xfe,0x4b,0x23,0x6e,0x50,0x34,0xc1,0x52,0x03,0x5f,0x20,0x8d,
+ 0x04,0x20,0xc4,0xe1,0x98,0xb3,0xe5,0x51,0x36,0xa8,0x18,0xfd,0x0f,0xb5,0x30,0x43,0xf8,0xc1,0x12,0x69,0x8f,0x78,0xbd,0x80,0x82,0xa7,0x4f,0x43,0x1d,0x00,0x96,0x1c,0x7f,0xee,0x20,0x8d,
+ 0x04,0x20,0xc4,0xe2,0x7a,0xe2,0x4c,0x7f,0x11,0x0d,0x42,0x8c,0x1c,0x5e,0x67,0xf7,0x90,0xdd,0x24,0x75,0x17,0xbb,0x0f,0x91,0xc7,0x5d,0xe3,0x19,0xb9,0x16,0x2d,0x5f,0x38,0x41,0x20,0x8d,
+ 0x04,0x20,0xc4,0xf0,0xdd,0x13,0x61,0x53,0x0c,0x0a,0xc7,0x06,0x7a,0xbb,0x1c,0xe0,0x65,0x1b,0x0e,0xf5,0x12,0x22,0x10,0xa0,0x20,0x2a,0x5b,0xbc,0xda,0x13,0x43,0xb0,0x96,0x0d,0x20,0x8d,
+ 0x04,0x20,0xc4,0xf3,0xe7,0x57,0xcb,0xeb,0x8a,0x74,0xd0,0x6b,0x2a,0x3a,0xad,0x79,0x72,0x37,0x2b,0xbf,0x3f,0xf7,0xb0,0x90,0x02,0xe3,0x52,0x18,0x29,0xc1,0x37,0xce,0xcd,0xcc,0x20,0x8d,
+ 0x04,0x20,0xc4,0xf2,0xd6,0x79,0x36,0x03,0xcd,0xd3,0xec,0xa8,0x8a,0x19,0x00,0xfc,0x0e,0xd1,0xbf,0x44,0x1c,0x0a,0x36,0xcd,0x3f,0x1c,0x4f,0x2c,0x14,0xa3,0x0b,0x04,0x62,0x96,0x20,0x8d,
+ 0x04,0x20,0xc5,0x3c,0x85,0x9a,0xe9,0x29,0x4a,0x30,0xec,0xb0,0xfc,0xa3,0x6b,0x33,0x3e,0xc3,0x1f,0xb2,0xdc,0x24,0x8c,0xa6,0xf5,0xfa,0xa3,0x70,0x99,0x70,0xc6,0x25,0xe9,0x37,0x20,0x8d,
+ 0x04,0x20,0xc5,0x3e,0x2e,0xa9,0x26,0x62,0xc4,0x8e,0x02,0x2e,0x2b,0xcd,0x0e,0x8f,0x50,0x97,0x4b,0x50,0xdb,0x79,0x00,0xbb,0xa6,0x81,0x8f,0x6e,0xaa,0x2f,0x56,0xe8,0x60,0xbd,0x20,0x8d,
+ 0x04,0x20,0xc5,0x0a,0x4d,0xbb,0xb7,0xfc,0x9f,0x80,0xcb,0xb3,0x55,0x3d,0xc8,0xf8,0xf9,0x0c,0x45,0xcf,0x52,0x1e,0x46,0x55,0x8f,0x67,0x63,0xc5,0x42,0x0d,0x61,0x81,0x5d,0x48,0x20,0x8d,
+ 0x04,0x20,0xc5,0x0e,0x40,0xcd,0xe1,0xf5,0x22,0xf9,0x46,0x3b,0x36,0xea,0xaf,0xcc,0x4b,0xea,0xdf,0xd1,0xcf,0xea,0x10,0x13,0xfc,0xbc,0xce,0xbf,0x63,0xcb,0xf9,0xf3,0xc4,0xaf,0x20,0x8d,
+ 0x04,0x20,0xc5,0x20,0xe4,0x1e,0x3c,0x7f,0xfd,0x3d,0x62,0x8f,0xbd,0x04,0x8a,0x44,0x4f,0xcc,0x90,0x9e,0xa3,0x7a,0x23,0x52,0xb9,0x61,0xb0,0x74,0x75,0xd2,0x9c,0x75,0x40,0xef,0x20,0x8d,
+ 0x04,0x20,0xc5,0x2f,0xbd,0x67,0xd1,0xea,0xc9,0x83,0x84,0x71,0x30,0xdf,0x34,0x72,0x46,0x35,0xf0,0xec,0x6f,0x7e,0x80,0x7f,0xb4,0x03,0xd2,0x57,0x48,0x62,0xad,0x1d,0x84,0xaa,0x20,0x8d,
+ 0x04,0x20,0xc5,0x74,0x4c,0x92,0x10,0x29,0x1c,0xf8,0xcd,0x1b,0xf4,0x38,0x51,0xcb,0x62,0x54,0x39,0xba,0x8e,0xbf,0xaa,0xa7,0x02,0xbd,0xba,0x6b,0xeb,0xe4,0x49,0xa1,0xb8,0x31,0x20,0x8d,
+ 0x04,0x20,0xc5,0x7e,0x04,0x34,0x38,0xbe,0x7d,0x62,0x25,0x27,0x7a,0x4d,0x9b,0xf8,0xc7,0x13,0x98,0x3b,0x0f,0x6a,0xf9,0x44,0xb8,0xd3,0x96,0x73,0x9d,0x71,0x3a,0xb8,0x4d,0xa2,0x20,0x8d,
+ 0x04,0x20,0xc5,0x7e,0xb5,0x8b,0x03,0xb5,0x51,0xa6,0x72,0xef,0x6d,0x16,0x73,0x5c,0x51,0x49,0x3d,0x59,0x5a,0x72,0x04,0xa9,0xd0,0x85,0x86,0xbd,0x15,0xb5,0x99,0x6d,0xdf,0xe6,0x20,0x8d,
+ 0x04,0x20,0xc5,0x4d,0x9a,0xb0,0xfc,0x69,0x91,0xbf,0x66,0xad,0xfb,0xc9,0xb0,0xb8,0x52,0xba,0x7c,0xf1,0x08,0x05,0x3f,0xeb,0xeb,0x32,0x56,0x50,0xdc,0x10,0xdc,0x79,0x3e,0xc3,0x20,0x8d,
+ 0x04,0x20,0xc5,0x4f,0x55,0xf4,0x35,0x4b,0xfa,0xb4,0xb1,0xce,0xa2,0x59,0x6f,0xf2,0xc3,0xc4,0x1a,0x7a,0xd9,0x6c,0xe7,0x3f,0xef,0x5a,0xc6,0x87,0x66,0x76,0xe4,0x53,0xc3,0x51,0x20,0x8d,
+ 0x04,0x20,0xc5,0x5a,0xf7,0xd7,0x6d,0xd9,0xec,0x4b,0xae,0xb4,0x31,0x6a,0x8b,0x57,0x7b,0xc0,0x81,0x5b,0x8e,0xcd,0x3e,0xb8,0x37,0xcb,0xb5,0x7e,0xf1,0xf5,0x5b,0xca,0xc9,0x37,0x20,0x8d,
+ 0x04,0x20,0xc5,0x64,0xe5,0x5b,0xde,0x67,0xd5,0x08,0x41,0x37,0x0f,0x18,0xd9,0xa6,0xb6,0x3b,0x5e,0xe7,0x55,0xc4,0x17,0xa3,0x17,0xc2,0x63,0xc9,0x3c,0x51,0xd5,0xe1,0x9d,0x67,0x20,0x8d,
+ 0x04,0x20,0xc5,0x68,0x3d,0x17,0xd6,0x0f,0x9f,0x42,0x0b,0x97,0x86,0xc1,0xec,0x46,0x80,0xbe,0xba,0x9c,0x0e,0x04,0x7b,0xac,0x7c,0xfb,0xb4,0xaa,0xc3,0x50,0xae,0x58,0x47,0xb9,0x20,0x8d,
+ 0x04,0x20,0xc5,0x6a,0xe1,0xda,0x01,0xdc,0xb2,0xb3,0x2a,0xfc,0x21,0x85,0x88,0x7e,0x0c,0x3b,0xf0,0xe8,0x5c,0x78,0xb8,0xda,0xa9,0x5d,0x7e,0x7b,0xda,0xc0,0x19,0xb2,0xa7,0x1a,0x20,0x8d,
+ 0x04,0x20,0xc5,0xbf,0x38,0x02,0x89,0x69,0x96,0xf4,0xb1,0x20,0x57,0x63,0xf9,0x5e,0xa9,0x37,0x0d,0x02,0x50,0x36,0x24,0xd9,0xd3,0xf7,0x84,0xf9,0x42,0x56,0xff,0x17,0xfa,0x8d,0x20,0x8d,
+ 0x04,0x20,0xc5,0x82,0xf8,0xc9,0x0e,0x19,0xa6,0xb1,0x6a,0x0e,0xa0,0x6a,0xe9,0xf6,0x0c,0xd6,0x96,0xe3,0x52,0x71,0xd0,0xc2,0x8c,0xb1,0x6e,0x68,0xf8,0x31,0x20,0xaa,0x58,0x2f,0x20,0x8d,
+ 0x04,0x20,0xc5,0x95,0x75,0x83,0x03,0x73,0xd1,0xec,0x19,0x24,0x31,0xa7,0x5e,0xe5,0xaf,0x9a,0xa2,0xb1,0xe6,0x47,0xfb,0xc8,0x6f,0x58,0x01,0x52,0x58,0x2a,0x71,0x5b,0x3b,0x02,0x20,0x8d,
+ 0x04,0x20,0xc5,0x98,0x7e,0xe4,0x57,0xdc,0x75,0x11,0xff,0x2c,0x56,0x2f,0xd5,0x61,0x86,0xba,0xb9,0xb5,0xc8,0x0c,0x41,0x3b,0xa5,0x04,0xe0,0xc4,0x2d,0x0c,0x38,0x7d,0x9b,0x8d,0x20,0x8d,
+ 0x04,0x20,0xc5,0xa1,0xe7,0x5c,0x65,0x1d,0x56,0x81,0x4f,0x62,0xa0,0x24,0x3d,0x81,0x55,0x12,0xf9,0xf4,0x5b,0xc1,0xbe,0x15,0x1a,0xa8,0x0b,0x23,0x22,0x2c,0x43,0x38,0xc8,0x96,0x20,0x8d,
+ 0x04,0x20,0xc5,0xa0,0xa1,0xa9,0x07,0x7e,0x63,0xb3,0xdf,0xcb,0x06,0x97,0x98,0x48,0xd4,0x74,0x03,0x4b,0x29,0xbb,0xf4,0x05,0x10,0xa8,0xf5,0x5c,0xc7,0xed,0x64,0x71,0x35,0x1f,0x20,0x8d,
+ 0x04,0x20,0xc5,0xa0,0xfd,0xa9,0x36,0x11,0xd5,0x37,0x6b,0x92,0x77,0x1a,0xde,0x38,0xb0,0xeb,0x3a,0x2e,0x77,0x81,0x9b,0x55,0x4b,0xf5,0x37,0x2c,0xd4,0xa8,0x67,0xde,0x1d,0x05,0x20,0x8d,
+ 0x04,0x20,0xc5,0xa1,0x83,0x4b,0xfa,0x86,0x6e,0x15,0x24,0x8a,0x26,0x56,0x79,0x36,0x32,0x2b,0x5b,0x56,0x7b,0xc8,0x32,0x9d,0x52,0xb8,0xfa,0xf7,0xe3,0x4f,0x9d,0xdb,0x84,0xef,0x20,0x8d,
+ 0x04,0x20,0xc5,0xaa,0xfc,0x52,0x3c,0x6e,0x3d,0x93,0x96,0xef,0x95,0x41,0xc6,0x1f,0xc2,0x1f,0x0f,0x3b,0x72,0x1f,0xc2,0xef,0xf9,0xa2,0x52,0x6d,0xc8,0x7b,0x1b,0x41,0x40,0xfa,0x20,0x8d,
+ 0x04,0x20,0xc5,0xf6,0xd6,0xe2,0xf8,0xd9,0xf8,0x4b,0xeb,0x54,0x80,0xd3,0x62,0x3c,0xee,0x7c,0x66,0x4d,0xf1,0x24,0x5b,0x54,0xf8,0xf2,0x80,0xd8,0xf5,0xb5,0x4b,0xf0,0xba,0x63,0x20,0x8d,
+ 0x04,0x20,0xc5,0xc1,0xa4,0x53,0xbe,0x2b,0xf8,0x8e,0x32,0xf9,0x1a,0x99,0x5f,0xde,0xf1,0x5d,0x31,0x79,0xab,0x0b,0x85,0x49,0x7a,0x08,0x88,0xad,0xf8,0x58,0x5c,0x29,0xc6,0x58,0x20,0x8d,
+ 0x04,0x20,0xc5,0xcd,0x57,0xfb,0xcb,0x5e,0xc5,0xe5,0x3b,0xf6,0xe1,0xd9,0xfb,0xd7,0x2e,0x28,0xf6,0x20,0xed,0x54,0xda,0x53,0x01,0x72,0xc8,0x38,0x1e,0xdc,0x2b,0x76,0xba,0x12,0x20,0x8d,
+ 0x04,0x20,0xc5,0xd6,0x0b,0xa0,0x00,0x9e,0x0a,0xd8,0xdf,0x6b,0xd5,0x4e,0x1e,0x3f,0xc3,0xdf,0x3e,0x34,0xe6,0x97,0xff,0x4c,0x25,0xe8,0x7b,0xd8,0x30,0x35,0xda,0x4f,0x77,0x6d,0x20,0x8d,
+ 0x04,0x20,0xc5,0xd7,0x67,0xb2,0x49,0x18,0x5e,0xb1,0x9d,0x1d,0x3a,0xf2,0xe7,0xa2,0x48,0x73,0x76,0x88,0x05,0x39,0x7d,0x70,0x00,0x10,0x3c,0xc4,0xa7,0xbc,0xff,0x70,0x09,0xa1,0x20,0x8d,
+ 0x04,0x20,0xc5,0xdb,0x49,0x2d,0x3f,0x3c,0x97,0x66,0x38,0xa7,0xdf,0x81,0xbf,0xca,0x6b,0x67,0x52,0x96,0xc3,0x9e,0xad,0x6b,0x86,0xcc,0xbc,0xd5,0x2d,0xbc,0xd1,0xd4,0x74,0xf7,0x20,0x8d,
+ 0x04,0x20,0xc5,0xe1,0xb0,0xa6,0xc3,0x88,0x95,0xb5,0x95,0x75,0xb2,0x2e,0x9d,0x14,0x5a,0x5f,0xdf,0x98,0x34,0x80,0xea,0xfe,0x2a,0x0a,0xa8,0x03,0x1c,0x2f,0x6c,0x1a,0xbb,0xb2,0x20,0x8d,
+ 0x04,0x20,0xc5,0xe2,0x40,0xf4,0x09,0xa0,0xda,0xf9,0xec,0x3f,0xcf,0x4f,0x84,0x64,0x09,0xf5,0x0a,0x61,0xf3,0xce,0xde,0xf9,0x69,0x8e,0x94,0xc0,0x00,0xa0,0xba,0xf6,0xcc,0xcc,0x20,0x8d,
+ 0x04,0x20,0xc6,0x36,0x16,0xcb,0x2b,0x1e,0xa6,0x10,0xe0,0x7c,0xe9,0x74,0x9f,0x86,0x71,0x08,0xf3,0xa7,0xf7,0x32,0xa6,0x50,0x4d,0x7d,0x68,0x84,0x7f,0x73,0x28,0xa7,0xdf,0xe2,0x20,0x8d,
+ 0x04,0x20,0xc6,0x3f,0x1a,0x48,0xe4,0x3e,0x85,0x0d,0x5c,0xc7,0x7c,0x87,0x95,0xc6,0xfc,0x33,0xc8,0x93,0x16,0xb2,0x29,0xe1,0xed,0xef,0x63,0xd2,0x67,0x31,0x3a,0xa7,0x3f,0x52,0x20,0x8d,
+ 0x04,0x20,0xc6,0x0d,0x71,0x8a,0xb8,0x7f,0xa6,0xde,0x7a,0x8c,0x7b,0x2e,0xb9,0x1a,0x48,0xf0,0xa2,0x6d,0x5d,0x22,0x3d,0x0e,0x8d,0xb9,0x4e,0x0b,0x8b,0x2b,0xf0,0x70,0x35,0xa8,0x20,0x8d,
+ 0x04,0x20,0xc6,0x1d,0xd9,0x72,0x3e,0xb4,0x7c,0xff,0xaf,0xaf,0xed,0x18,0xb7,0xfe,0xe6,0x0f,0x3f,0x43,0x11,0xf3,0xa1,0xa4,0x2a,0xf0,0xd5,0x7c,0xaf,0x54,0xae,0xd8,0x61,0x5f,0x20,0x8d,
+ 0x04,0x20,0xc6,0x23,0xa7,0x92,0x19,0x6d,0x12,0x48,0xee,0x7e,0xde,0x30,0x75,0x88,0x12,0x4b,0x46,0x13,0xad,0x75,0x9d,0xee,0xa6,0x0a,0xb1,0xfb,0xf9,0x8b,0xbe,0x99,0x4c,0x45,0x20,0x8d,
+ 0x04,0x20,0xc6,0x2c,0xc1,0x68,0xe7,0x57,0xe7,0xdf,0x13,0xe9,0xa3,0x7d,0xa7,0x20,0x70,0x2c,0xfc,0x9a,0xce,0xb5,0x5e,0x16,0x4b,0xa0,0xf9,0x30,0xa3,0x35,0x66,0xe4,0xe8,0x2f,0x20,0x8d,
+ 0x04,0x20,0xc6,0x76,0x8c,0xdc,0xbe,0x78,0xe7,0x1d,0xd0,0x41,0x8a,0x28,0xee,0x05,0xe6,0x4b,0x75,0x54,0x48,0x03,0xe5,0x4c,0xe1,0x2a,0x64,0xbb,0x5f,0x5d,0xc4,0xa6,0x04,0x76,0x20,0x8d,
+ 0x04,0x20,0xc6,0x78,0xbf,0x82,0x02,0x49,0x76,0xb1,0x0e,0x63,0x15,0x2e,0xeb,0xad,0x24,0x1c,0x45,0x15,0xbb,0x6b,0xa7,0x95,0x33,0xcb,0x41,0xaa,0x48,0xe4,0x2f,0x96,0x85,0xf6,0x20,0x8d,
+ 0x04,0x20,0xc6,0x7a,0x8f,0x49,0x63,0xc5,0xa3,0xa6,0x43,0x27,0xec,0x19,0x67,0x40,0xa6,0x94,0xc1,0xd2,0xfb,0xe1,0x30,0xcf,0x07,0x18,0x89,0x4b,0x1e,0x46,0x99,0x7b,0x5a,0xc0,0x20,0x8d,
+ 0x04,0x20,0xc6,0x40,0xa3,0x3a,0x2d,0x89,0xf3,0x92,0x35,0xe2,0x5b,0xb8,0x03,0xe0,0x08,0xea,0xef,0x23,0x79,0x89,0x87,0x33,0x1b,0x2c,0xf0,0x9e,0xca,0x5e,0x48,0x2b,0xba,0x39,0x20,0x8d,
+ 0x04,0x20,0xc6,0x42,0xa0,0x6a,0x58,0x30,0x7a,0x48,0x1a,0x26,0x56,0xa5,0x58,0x21,0xbd,0x3a,0xf6,0x32,0xa9,0xb9,0x28,0xdb,0xeb,0x66,0xcd,0x11,0x2f,0x22,0x25,0x91,0x7f,0x6c,0x20,0x8d,
+ 0x04,0x20,0xc6,0x4f,0xa4,0x34,0x84,0x2a,0xb2,0xe3,0x89,0x5f,0xaa,0xac,0x22,0x93,0xda,0x55,0x5e,0xb9,0x2f,0x1d,0xbb,0x78,0x36,0x33,0x5d,0x2b,0xee,0x14,0xc3,0x55,0x06,0xf8,0x20,0x8d,
+ 0x04,0x20,0xc6,0x50,0x67,0x48,0xa4,0xbb,0xc4,0xef,0x7c,0x58,0xd9,0x37,0xab,0x90,0xeb,0x7d,0x9d,0x1d,0xfc,0xaf,0xee,0x99,0x8e,0xbe,0xd3,0x8e,0xaf,0x26,0xa7,0x6c,0xba,0xfe,0x20,0x8d,
+ 0x04,0x20,0xc6,0x50,0x90,0xfd,0xf4,0xf3,0x23,0x11,0xd8,0x3f,0x92,0xa9,0xa2,0x6c,0x8f,0x2e,0x22,0xa3,0xaf,0xf3,0xd0,0x3f,0xad,0xd4,0x08,0x94,0x28,0xb8,0xee,0x2e,0x05,0xdd,0x20,0x8d,
+ 0x04,0x20,0xc6,0x56,0x04,0x6f,0xb1,0x00,0xc6,0x3d,0x28,0x69,0x6d,0x14,0xd9,0x7e,0x9d,0x9f,0x19,0xc6,0x99,0x1d,0x19,0x62,0xb8,0x7f,0x44,0xf2,0xe0,0x5d,0x1d,0xfd,0x1e,0x55,0x20,0x8d,
+ 0x04,0x20,0xc6,0x5d,0xaa,0xe7,0x8a,0xa2,0x26,0xce,0xef,0x36,0xc3,0x54,0xcf,0x8c,0x65,0x1d,0xba,0x49,0x0a,0x4f,0xe9,0x5f,0xf8,0x98,0xbe,0xa4,0x9e,0xf3,0x93,0xdd,0xdb,0x2a,0x20,0x8d,
+ 0x04,0x20,0xc6,0x60,0x5c,0xdb,0xe5,0x36,0x73,0x2f,0x6e,0xef,0xac,0x8d,0x96,0x9d,0xa0,0x94,0xae,0x20,0x0c,0x25,0x05,0xee,0x0b,0x85,0x8a,0x29,0x6a,0x49,0x18,0x77,0x46,0x4f,0x20,0x8d,
+ 0x04,0x20,0xc6,0x63,0x6f,0xd1,0x45,0xa2,0xff,0x13,0xd5,0x6b,0x24,0xd8,0x00,0xb3,0x7f,0xb5,0x1e,0xa3,0xca,0xf6,0x76,0x89,0x28,0x41,0xd3,0x93,0x8f,0xe3,0x5d,0x01,0xef,0xe5,0x20,0x8d,
+ 0x04,0x20,0xc6,0x65,0xa0,0x8c,0xf6,0x3d,0xca,0x60,0x3b,0x2f,0x12,0x05,0xca,0xfb,0xd6,0xfd,0xac,0xbb,0xc6,0x3b,0xaf,0x2e,0xf3,0x64,0x91,0xfe,0xf7,0x02,0x1c,0x56,0x25,0x90,0x20,0x8d,
+ 0x04,0x20,0xce,0xb6,0xf2,0xa3,0x37,0xb3,0xc0,0x4d,0x48,0x29,0x27,0xf5,0xa4,0x12,0x55,0x1f,0xa2,0x2b,0xb6,0x60,0xc8,0x80,0xe2,0x14,0x01,0xcc,0xa8,0x35,0x0b,0x97,0xbb,0x26,0x20,0x8d,
+ 0x04,0x20,0xce,0x88,0xac,0x71,0xfc,0x76,0x56,0xa8,0xc5,0x94,0x86,0x93,0x01,0x67,0xd6,0xd2,0xb5,0xa8,0x93,0xc7,0xbc,0x59,0xba,0x33,0x98,0x78,0x9a,0xcc,0xb1,0xf2,0x47,0x1f,0x20,0x8d,
+ 0x04,0x20,0xce,0x88,0xee,0x50,0x4a,0x1e,0xf0,0xc3,0x4e,0x49,0x44,0xc0,0x6f,0xe2,0x14,0x53,0x13,0x24,0xbe,0xd4,0x2e,0xc7,0xb6,0xbe,0x1c,0x74,0x94,0x40,0x4d,0xea,0x12,0x1b,0x20,0x8d,
+ 0x04,0x20,0xce,0x8c,0xdc,0x9c,0x1f,0x9c,0xd0,0x96,0x2c,0x9f,0xe8,0xeb,0x01,0xe4,0x04,0x86,0x77,0x7c,0x5f,0x29,0x8c,0x60,0x1c,0xc5,0x01,0xad,0x82,0xe6,0x1f,0xfc,0x49,0x39,0x20,0x8d,
+ 0x04,0x20,0xce,0x90,0x7b,0xb4,0x9f,0x5e,0x1c,0x3b,0x19,0x6a,0xb3,0xea,0x36,0x67,0x60,0xf6,0xf9,0xb6,0x49,0x11,0x8d,0x52,0xc0,0x17,0x4f,0xc4,0xe8,0xed,0xa7,0x12,0x00,0x62,0x20,0x8d,
+ 0x04,0x20,0xce,0x96,0x75,0xc8,0xf7,0x02,0xba,0xeb,0x55,0x10,0x86,0x40,0x24,0xff,0x68,0x71,0x67,0x06,0x56,0x1d,0x40,0xc1,0x66,0x44,0xd3,0xe2,0xb7,0xcf,0x86,0xd1,0xf6,0x28,0x20,0x8d,
+ 0x04,0x20,0xce,0x9a,0x94,0x2c,0xe9,0x5e,0xf7,0x87,0x50,0x93,0xec,0x42,0x32,0xb1,0xa2,0x00,0xdf,0x3f,0xcd,0xc7,0x98,0x9c,0xd5,0xcb,0x70,0x3b,0xeb,0x48,0x15,0x51,0x23,0xa6,0x20,0x8d,
+ 0x04,0x20,0xce,0x9a,0xe1,0x0f,0x87,0x04,0x27,0xae,0xfc,0x58,0x8f,0x8a,0x49,0x4d,0x03,0xf9,0x1a,0xe2,0x7f,0x50,0x7b,0x29,0xaf,0x8a,0x95,0xa9,0x1c,0xe6,0xf2,0x22,0x02,0xb8,0x20,0x8d,
+ 0x04,0x20,0xce,0xb0,0x9a,0xdc,0x35,0xdc,0x4a,0xf9,0x3b,0x82,0x4a,0xae,0x2e,0x23,0xfa,0x2f,0x7b,0x70,0xf4,0xa8,0x3c,0xce,0x21,0x86,0xa7,0xf0,0xdf,0xf3,0x1e,0xf9,0xd4,0x35,0x20,0x8d,
+ 0x04,0x20,0xce,0xf6,0x68,0xf8,0xad,0x46,0xf4,0xd5,0x1c,0xac,0x53,0xaa,0x20,0xd5,0xf4,0x57,0xe5,0xa0,0x4d,0xd0,0x28,0x69,0x91,0x9b,0x3a,0x4c,0xb2,0x7e,0xd0,0x1f,0xc8,0xe9,0x20,0x8d,
+ 0x04,0x20,0xce,0xfd,0xcd,0x7e,0x20,0x6c,0xd1,0x8e,0x21,0x4b,0x26,0x10,0x7b,0x16,0xc7,0xd1,0x81,0xb7,0xe2,0x10,0xcf,0xc6,0xe2,0x66,0x39,0x56,0x2b,0xdd,0x05,0x1b,0x63,0xc4,0x20,0x8d,
+ 0x04,0x20,0xce,0xc1,0x23,0x66,0x99,0x1d,0x4f,0x18,0x91,0x30,0x4b,0x54,0x6e,0xc0,0xa4,0xc3,0x64,0xfa,0x5b,0x39,0x8a,0xf7,0x28,0xfe,0x44,0x85,0xd7,0x65,0x20,0x8c,0x6c,0x5f,0x20,0x8d,
+ 0x04,0x20,0xce,0xce,0x39,0xbe,0xac,0x68,0x33,0xa4,0x66,0xad,0x5b,0x9f,0x96,0x14,0xc3,0x0e,0xa5,0x86,0xc9,0xcc,0xc9,0xb1,0xed,0x1f,0xf5,0x5d,0xeb,0x26,0xef,0x10,0x39,0xa8,0x20,0x8d,
+ 0x04,0x20,0xce,0xce,0x61,0x9d,0x3f,0xcd,0xe6,0x83,0xe8,0xca,0x4a,0xda,0x4b,0xf9,0xc2,0x14,0xf3,0x6d,0xcd,0xe3,0xf1,0x7a,0x47,0x06,0xd1,0x6c,0xe2,0x7b,0xcd,0x16,0xb7,0x94,0x20,0x8d,
+ 0x04,0x20,0xce,0xd2,0xbd,0x23,0x25,0xbd,0x8a,0xc8,0x34,0x21,0x88,0x05,0xb9,0xd2,0x53,0x6f,0x02,0xd3,0x61,0x89,0xd4,0xd0,0x0d,0x49,0xbf,0x6d,0x30,0x27,0x34,0x2c,0x4c,0x94,0x20,0x8d,
+ 0x04,0x20,0xce,0xd9,0xb0,0x7a,0xc8,0x47,0xb4,0x91,0x6f,0xe2,0xd1,0x6d,0xf3,0xd0,0x40,0xfb,0x29,0xc2,0x62,0xcd,0x94,0x90,0xd1,0xd4,0xed,0xd9,0xe2,0x7d,0xcf,0x98,0xe2,0xac,0x20,0x8d,
+ 0x04,0x20,0xce,0xdc,0x3d,0x6c,0xae,0x09,0xd5,0x5c,0x3e,0xe0,0x8b,0x49,0x0d,0x96,0x12,0x1c,0x95,0x24,0xcf,0x67,0x65,0x12,0xd5,0x81,0x16,0x0f,0xba,0x71,0xd8,0x1a,0x6f,0x6e,0x20,0x8d,
+ 0x04,0x20,0xcf,0x34,0xd7,0xf7,0x29,0x1e,0xe6,0x76,0x8f,0xbc,0x3f,0x5b,0xce,0xa0,0x38,0x6e,0x7b,0x50,0xec,0xab,0x09,0xb0,0xf9,0xf1,0x84,0xd0,0xb6,0x16,0xd5,0xb3,0x6f,0x23,0x20,0x8d,
+ 0x04,0x20,0xcf,0x07,0xf2,0xf0,0x75,0x85,0x27,0x9a,0xd6,0x0a,0x62,0x77,0xdc,0xb7,0x2f,0xc3,0xa3,0x17,0x40,0xdd,0xda,0x4e,0x12,0xcf,0x7c,0x36,0x15,0xa3,0xef,0x96,0xcb,0xa3,0x20,0x8d,
+ 0x04,0x20,0xcf,0x0d,0x58,0x61,0x8c,0x4f,0x52,0xc3,0x6c,0x6d,0x03,0xbe,0xad,0xd4,0x5a,0xe7,0x5f,0x92,0x3e,0x02,0x89,0x2b,0x9c,0x1f,0x92,0xed,0xdb,0xd2,0x88,0x5e,0x03,0xc9,0x20,0x8d,
+ 0x04,0x20,0xcf,0x18,0xc7,0x85,0x3f,0x60,0xf4,0xb4,0xa7,0x4d,0xc8,0x55,0xd0,0xfa,0x53,0x1c,0x5c,0xc7,0xea,0x57,0x3e,0x24,0x32,0x5d,0x10,0xf2,0x93,0x07,0xe8,0xce,0xd6,0x0a,0x20,0x8d,
+ 0x04,0x20,0xcf,0x1f,0x8a,0x8e,0x8f,0x12,0x09,0x48,0x4f,0x35,0x39,0xf9,0xf9,0x05,0x00,0x38,0xf0,0x43,0x55,0xe6,0x9d,0x8c,0x56,0x2e,0xa5,0x94,0x59,0xcc,0x27,0xc6,0xeb,0x27,0x20,0x8d,
+ 0x04,0x20,0xcf,0x20,0x6a,0x81,0x26,0x56,0xe7,0x1f,0x01,0xcc,0x47,0xf2,0xa7,0xa1,0x0b,0xbf,0x6e,0x1f,0x4e,0xa0,0xad,0x1f,0x5b,0x73,0x52,0x32,0x4b,0xb0,0x96,0x11,0x35,0x95,0x20,0x8d,
+ 0x04,0x20,0xcf,0x22,0x68,0xca,0x83,0xce,0xec,0x9b,0xfe,0x98,0x51,0xb4,0xa6,0x08,0x03,0xb2,0x2e,0xa5,0xa0,0x31,0xe8,0x78,0xae,0xb6,0x8b,0xb4,0x5f,0x71,0x25,0x40,0x95,0x3c,0x20,0x8d,
+ 0x04,0x20,0xcf,0x25,0xe3,0x74,0x30,0x1b,0x1d,0xce,0x76,0xb4,0xd2,0x3d,0x31,0x33,0xbc,0xca,0x70,0xf2,0x9d,0x7d,0xa5,0x9b,0x78,0x26,0x1f,0xf7,0x02,0x1a,0x74,0xfb,0xf9,0x94,0x20,0x8d,
+ 0x04,0x20,0xcf,0x33,0x1d,0xd7,0x5b,0xd4,0x41,0x84,0xe3,0xe4,0xe5,0xa9,0x7b,0x93,0x3a,0x0a,0xf3,0xe7,0xf8,0x0f,0xc5,0x79,0x27,0x52,0xe9,0xcc,0xe0,0xda,0xed,0x95,0x06,0x26,0x20,0x8d,
+ 0x04,0x20,0xcf,0x74,0x1b,0xfb,0xdd,0xfb,0x2a,0x0d,0xe1,0x33,0x8d,0x26,0x93,0xdd,0xc9,0x50,0x6c,0xc8,0xb1,0xa3,0x56,0xe3,0xb6,0xbe,0x77,0x17,0x6f,0x0c,0xed,0xa3,0xf6,0x8b,0x20,0x8d,
+ 0x04,0x20,0xcf,0x48,0x26,0x9f,0xe2,0x8b,0xcc,0xee,0xf1,0xa5,0x5a,0xfd,0x00,0xd9,0x7c,0xc0,0x6a,0x50,0xc3,0x68,0xc8,0x33,0x21,0xd3,0x6f,0x7f,0xb3,0x05,0x01,0x9c,0xfb,0x69,0x20,0x8d,
+ 0x04,0x20,0xcf,0x6b,0xed,0xa3,0xeb,0xa9,0xd4,0x51,0xc0,0x44,0xbe,0xd0,0xe2,0x37,0x1e,0xd1,0x97,0x73,0xbe,0x6e,0xb4,0xe2,0x57,0x17,0xbc,0x80,0x57,0xde,0x75,0x8b,0x11,0xd5,0x20,0x8d,
+ 0x04,0x20,0xcf,0xb4,0xa1,0x8c,0xb4,0x9f,0xf8,0xee,0xb5,0x38,0x21,0xd4,0x35,0xa7,0x82,0x00,0x3d,0x83,0x75,0xd1,0xcf,0x57,0x96,0x80,0x42,0x78,0x56,0xe8,0x43,0x52,0x42,0x2c,0x20,0x8d,
+ 0x04,0x20,0xcf,0xb5,0x1e,0xea,0x04,0x33,0x0d,0x5e,0x3a,0x78,0x33,0x82,0x91,0xca,0x81,0x17,0x92,0x52,0x80,0x88,0xd6,0xce,0x4f,0x37,0xbd,0xd8,0x14,0x2e,0x59,0xa5,0xec,0x71,0x20,0x8d,
+ 0x04,0x20,0xcf,0xb6,0x3f,0xfc,0xc3,0xf8,0x23,0x32,0x28,0xa4,0x03,0x15,0x0c,0x09,0xa8,0xfc,0xf3,0x15,0x54,0x22,0xef,0x0b,0x08,0xff,0x7b,0xa9,0x28,0xe0,0x42,0xfc,0xea,0x6c,0x20,0x8d,
+ 0x04,0x20,0xcf,0xb6,0x57,0xa2,0x79,0x1d,0xb6,0xe9,0xfb,0x56,0x9d,0xe6,0x86,0x8c,0xfd,0xde,0xf9,0x40,0x4f,0x3a,0x2a,0xee,0x6f,0x45,0xcd,0xc6,0x3c,0x9b,0x5f,0x59,0x9a,0x65,0x20,0x8d,
+ 0x04,0x20,0xcf,0xb9,0xa1,0xf3,0xa0,0x05,0x08,0x78,0xeb,0x02,0x65,0x78,0x4b,0x57,0xd9,0x55,0x92,0xba,0xac,0xf6,0x2f,0x6c,0xba,0x12,0x98,0xee,0x1a,0xfa,0x72,0x0c,0x29,0x45,0x20,0x8d,
+ 0x04,0x20,0xcf,0xba,0xb0,0xde,0x95,0x77,0x6f,0xbf,0x56,0x95,0xec,0x4d,0x63,0x61,0xcf,0x5c,0x13,0x9c,0x89,0x16,0xa8,0x75,0x63,0xd5,0xdb,0x9a,0xcc,0x7c,0x9d,0xfe,0xca,0x13,0x20,0x8d,
+ 0x04,0x20,0xcf,0x8d,0x1e,0x8b,0xb8,0x8b,0xfb,0x22,0x42,0x56,0xfe,0xc3,0xa7,0xa9,0xbb,0x47,0x01,0x01,0xf5,0x03,0x66,0x4c,0x81,0xa4,0x47,0x4a,0x59,0xf2,0xe8,0xe3,0x31,0x54,0x20,0x8d,
+ 0x04,0x20,0xcf,0x9b,0xb3,0xff,0xb4,0xea,0x94,0x3e,0xdd,0x50,0x2d,0x83,0x00,0x48,0x7a,0x89,0x15,0x70,0x32,0x5b,0x4a,0x1b,0x18,0xc0,0x09,0xfb,0xf7,0xb8,0x0e,0xf0,0xf9,0x46,0x20,0x8d,
+ 0x04,0x20,0xcf,0x9b,0xd5,0x2b,0x00,0x0a,0xf4,0x7a,0x42,0x62,0x7e,0xf7,0xa6,0xfa,0xe1,0x77,0xd4,0xf4,0x2c,0x56,0xe0,0x7d,0xc3,0x3a,0xb9,0x9d,0xb7,0x2b,0x4f,0x34,0x59,0xa7,0x20,0x8d,
+ 0x04,0x20,0xcf,0x9b,0x0f,0x2d,0x4c,0x4b,0xb0,0x93,0xc1,0xfd,0x4e,0xe6,0x6d,0x18,0x49,0x87,0x09,0xb3,0x98,0x74,0x77,0xf9,0x46,0xb2,0x6c,0x6e,0x02,0x3f,0x83,0xff,0xf9,0xdf,0x20,0x8d,
+ 0x04,0x20,0xcf,0x9b,0x4a,0xdd,0xa9,0x40,0x89,0x5d,0xd7,0x9f,0x77,0x2b,0x74,0xd8,0x0a,0x2e,0x7c,0x6d,0xa6,0xb8,0x76,0xd7,0xc8,0x8e,0x5d,0x84,0x0a,0x97,0xce,0x08,0x27,0x62,0x20,0x8d,
+ 0x04,0x20,0xcf,0x9c,0xa4,0xdd,0x82,0x5d,0x85,0xde,0xbc,0x36,0x43,0xa1,0x7e,0xdb,0x14,0x07,0xe2,0x97,0x04,0x4c,0x0c,0xe6,0xf9,0x93,0xba,0xec,0xd7,0x3d,0x18,0x97,0x48,0x93,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa0,0xc2,0xef,0x4c,0x58,0xff,0x48,0x25,0x97,0xf1,0xe2,0xe8,0x35,0x48,0x21,0x23,0x29,0xbf,0x75,0x59,0x37,0x4d,0x8d,0xde,0x70,0xee,0x83,0x6e,0x81,0x65,0x7b,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa5,0xe9,0xf8,0x28,0xe2,0xd6,0xfa,0x38,0x7e,0x8b,0x40,0xa1,0x6f,0x9c,0xb3,0x76,0x7f,0x11,0x2f,0x29,0x13,0x78,0xa9,0x2e,0x3a,0x53,0x8d,0x73,0xd2,0x3d,0x8a,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa4,0xe0,0x76,0x4f,0x53,0x51,0xdc,0x93,0xcf,0xd5,0xcd,0xe5,0xb4,0x87,0xa6,0xc7,0xf3,0xb6,0x0d,0xe8,0xc6,0x8c,0x6f,0x89,0x99,0x07,0x62,0x18,0xbc,0x96,0x20,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa7,0xe2,0xde,0xc7,0x33,0x47,0x54,0x6f,0xd5,0x88,0x3c,0x3e,0x8e,0x80,0x8e,0x2f,0xa6,0x7f,0xb5,0xf0,0x3b,0x87,0x67,0x62,0x82,0x56,0x9e,0xed,0x4e,0xe5,0x99,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa6,0xc0,0x16,0xb0,0xb1,0x75,0x21,0xf2,0x22,0x3b,0x40,0x53,0x72,0x91,0x15,0x0d,0xcb,0xbd,0x58,0x5d,0x97,0x2d,0x3a,0xd1,0xa6,0x10,0x50,0x0e,0x80,0x23,0x49,0x20,0x8d,
+ 0x04,0x20,0xcf,0xa9,0xc9,0x6e,0x99,0xf0,0x6e,0xa2,0x6e,0x78,0x40,0x70,0x21,0x04,0xdf,0xa0,0x2f,0x3e,0x08,0x3c,0x1d,0x08,0x3d,0x8a,0x9b,0x78,0x53,0x6f,0x16,0x30,0x17,0x5a,0x20,0x8d,
+ 0x04,0x20,0xcf,0xf5,0x11,0xec,0x11,0x50,0x23,0x1f,0x10,0x87,0xa0,0x8d,0xf8,0xc5,0x49,0x65,0x60,0xdc,0x8c,0x29,0x63,0xde,0x55,0x7f,0x22,0xae,0x47,0xf4,0xc2,0x35,0x44,0x8b,0x20,0x8d,
+ 0x04,0x20,0xcf,0xf9,0xdb,0x28,0x4b,0x5f,0xea,0xa5,0x46,0xff,0xc8,0x18,0x80,0xd4,0x38,0x82,0x66,0x27,0xef,0x1f,0xb0,0xf3,0xd5,0x0f,0x7b,0x32,0x13,0x72,0xe7,0xbc,0x15,0xf2,0x20,0x8d,
+ 0x04,0x20,0xcf,0xc8,0x1d,0x5d,0x48,0x41,0x92,0x32,0x83,0x1c,0x11,0xf8,0xfa,0x04,0x90,0xb8,0x74,0x9b,0x63,0x23,0x0f,0x4a,0xee,0xba,0xca,0x0c,0xc9,0x83,0x90,0xa4,0x57,0xfd,0x20,0x8d,
+ 0x04,0x20,0xcf,0xcb,0xf5,0xc6,0xb4,0x7f,0xb7,0xab,0x28,0x39,0x43,0x6a,0x15,0x63,0x11,0x3b,0x0d,0x40,0x17,0x85,0xcc,0xfd,0x95,0x91,0x18,0x6a,0xb5,0x5a,0x56,0xc3,0xb4,0xfd,0x20,0x8d,
+ 0x04,0x20,0xcf,0xcd,0xb9,0xdf,0x6d,0xa0,0x98,0x3e,0xbb,0x35,0x97,0xec,0x68,0x71,0x1a,0x8a,0x11,0x42,0xdd,0x74,0x9d,0x75,0x49,0x3a,0xd1,0xdb,0xf8,0xb4,0x5c,0xa1,0xbf,0x78,0x20,0x8d,
+ 0x04,0x20,0xcf,0xcd,0xc4,0x11,0x4d,0xda,0x3e,0xd5,0xa1,0x0e,0xb2,0xe7,0xb2,0x2b,0xee,0xf5,0xd6,0x74,0x76,0x75,0xd1,0xdc,0x5c,0x08,0x02,0x4c,0x14,0xf2,0x39,0x09,0x31,0xd8,0x20,0x8d,
+ 0x04,0x20,0xcf,0xd3,0xa5,0x88,0xa9,0xe8,0x76,0x89,0x43,0x2d,0x90,0x79,0xc4,0x55,0x1e,0xf2,0xec,0xc4,0x0c,0x45,0x93,0xd9,0x51,0xc5,0x87,0x09,0x69,0x8a,0x07,0x47,0xdd,0x82,0x20,0x8d,
+ 0x04,0x20,0xcf,0xd2,0x10,0xd9,0x58,0xc8,0x3c,0x4d,0xfd,0x10,0x74,0xbd,0x4f,0xad,0xbb,0x69,0x06,0xe6,0x75,0x1b,0x18,0x9a,0xeb,0x0e,0x42,0x8f,0xec,0x54,0xea,0xf8,0x34,0x49,0x20,0x8d,
+ 0x04,0x20,0xcf,0xd3,0x37,0x80,0xc7,0x67,0x1a,0x0e,0xbd,0xdd,0x7e,0xbe,0x5b,0x04,0x67,0xd0,0x21,0xbc,0xf2,0x2a,0x7d,0x8e,0x7c,0x91,0x8b,0x89,0xe4,0xe2,0x16,0x34,0xd6,0x7a,0x20,0x8d,
+ 0x04,0x20,0xcf,0xd9,0xf8,0xb3,0x27,0x72,0xfd,0x2b,0x41,0xaa,0xf2,0xf9,0x20,0x0e,0x29,0x35,0xec,0xd3,0x1a,0x7d,0xcd,0x8c,0xfd,0x26,0xfe,0x98,0x06,0x20,0x7f,0x8e,0xeb,0xe9,0x20,0x8d,
+ 0x04,0x20,0xcf,0xd8,0x2a,0x20,0xfd,0xad,0xbb,0x07,0x07,0xce,0xec,0x0d,0xaf,0xa4,0xee,0xcd,0x05,0x97,0xc2,0xfd,0x5b,0x32,0xbd,0x18,0xe5,0xbc,0x41,0xdd,0xcd,0xd5,0xd1,0xfb,0x20,0x8d,
+ 0x04,0x20,0xcf,0xe3,0x76,0x45,0x95,0x9c,0x82,0x68,0xc6,0xd6,0x3f,0x15,0xbf,0x85,0xea,0x57,0x87,0x3a,0x6c,0x10,0xf9,0x7a,0x3e,0x73,0x58,0x97,0xfa,0xd2,0x3f,0x1e,0x8e,0xa1,0x20,0x8d,
+ 0x04,0x20,0xcf,0xe9,0xbd,0x79,0x0e,0xb1,0x56,0xda,0xfa,0x75,0xc7,0xa8,0x8b,0x59,0x54,0x95,0xf9,0x50,0x4f,0xa6,0x18,0x2f,0x60,0x30,0x4f,0xf2,0x47,0xab,0x13,0x7d,0x41,0xfd,0x20,0x8d,
+ 0x04,0x20,0xc8,0x3c,0xad,0x53,0x53,0xd6,0x9c,0x71,0xc5,0xf0,0x0a,0x22,0x93,0xaf,0xfd,0x20,0x07,0x71,0x26,0xad,0x81,0x54,0xbe,0x07,0x24,0xc1,0x82,0xd5,0xa2,0x12,0x17,0x3a,0x20,0x8d,
+ 0x04,0x20,0xc8,0x03,0x7f,0xc8,0xe8,0xc8,0xca,0x23,0xc4,0xb3,0x3c,0x92,0x2a,0x63,0x0f,0x86,0x39,0xfd,0xb5,0x1a,0xd9,0x02,0x8e,0x00,0x83,0x75,0xb8,0x13,0x74,0x5c,0x9a,0xf8,0x20,0x8d,
+ 0x04,0x20,0xc8,0x05,0xe8,0x1c,0x30,0x08,0x7b,0x87,0x72,0x35,0x14,0x98,0x14,0x2d,0xfb,0xdb,0x86,0xac,0x96,0xd1,0x2c,0xec,0xc0,0x73,0x0e,0xe9,0xdd,0x1e,0x06,0x29,0xe0,0xf6,0x20,0x8d,
+ 0x04,0x20,0xc8,0x07,0xd1,0xab,0x0a,0x53,0x88,0xba,0x76,0x63,0x4f,0xd7,0xf6,0x47,0x5c,0x78,0xcb,0xe2,0x3a,0x5c,0x77,0xc4,0x19,0x75,0xb5,0xbf,0x82,0x23,0x77,0x9c,0xd9,0x21,0x20,0x8d,
+ 0x04,0x20,0xc8,0x0a,0x30,0x15,0x83,0xd1,0xfd,0x42,0x69,0xec,0xa2,0x75,0xd1,0x1c,0xec,0x54,0x00,0x3d,0xa4,0x62,0xbd,0xa6,0x02,0x4a,0x5a,0x73,0xee,0xa8,0xc5,0xce,0x7d,0x87,0x20,0x8d,
+ 0x04,0x20,0xc8,0x0c,0xa3,0x80,0xc3,0xcd,0x54,0x67,0xd1,0xdd,0xcb,0x4a,0xba,0xdc,0x50,0xb8,0x17,0xd9,0xd8,0x86,0xdd,0x64,0x07,0x01,0xcd,0x95,0x64,0xbf,0xc7,0xee,0x89,0xd7,0x20,0x8d,
+ 0x04,0x20,0xc8,0x0f,0x1a,0xa1,0xb4,0x15,0x2e,0xfb,0xd3,0xbe,0x3f,0x9a,0xa4,0x22,0xdf,0x15,0x69,0x3b,0xc6,0x80,0xf7,0x57,0xc4,0xe1,0xb5,0xb2,0xb3,0x3d,0x07,0x2c,0x25,0x2a,0x20,0x8d,
+ 0x04,0x20,0xc8,0x17,0x13,0xda,0x89,0xea,0x79,0xf9,0xb6,0x65,0x2a,0xff,0xfb,0xc4,0x64,0x3e,0x4b,0x68,0x7c,0x5f,0x1d,0x0e,0x08,0x71,0x36,0x6c,0x3b,0x51,0xcc,0x73,0x02,0x6c,0x20,0x8d,
+ 0x04,0x20,0xc8,0x2d,0xf3,0x35,0x78,0x24,0x22,0xb7,0x98,0x4c,0x93,0xf6,0x4f,0x6c,0x0d,0xa9,0x28,0x39,0x08,0xe7,0x41,0x40,0x02,0x66,0x9b,0xb1,0x03,0xbc,0xf9,0xe9,0x48,0xe7,0x20,0x8d,
+ 0x04,0x20,0xc8,0x30,0x5a,0x61,0x9e,0x4e,0xfa,0xcb,0xbe,0x23,0x93,0x35,0x7f,0xbe,0xb6,0x96,0xab,0x80,0x39,0x0d,0x93,0x98,0x30,0x9a,0x30,0x09,0x35,0xa8,0x88,0x5f,0xfa,0x7e,0x20,0x8d,
+ 0x04,0x20,0xc8,0x75,0xaf,0x49,0x5b,0x22,0xd3,0x71,0x08,0x12,0xb1,0x4c,0xea,0x53,0xcc,0x44,0xe9,0xcd,0xc8,0xba,0x18,0x1b,0xc2,0x93,0x06,0x8c,0x1a,0xba,0xc5,0xd3,0xf6,0x7d,0x20,0x8d,
+ 0x04,0x20,0xc8,0x75,0x04,0x5f,0x2c,0x91,0x26,0x77,0x58,0x7e,0x2c,0x1b,0x64,0x2a,0xaf,0xde,0x08,0x42,0x3b,0x79,0xa9,0xcc,0x96,0x43,0x58,0x0e,0xbf,0x32,0xc9,0x72,0x11,0x94,0x20,0x8d,
+ 0x04,0x20,0xc8,0x7d,0xaa,0x71,0xdd,0x86,0x65,0x3f,0xc7,0x29,0x04,0x3d,0x30,0x14,0xd9,0x76,0x02,0x8d,0x34,0x4e,0x30,0x92,0xfd,0xc8,0xbf,0xc8,0x66,0xef,0x87,0x57,0x62,0x05,0x20,0x8d,
+ 0x04,0x20,0xc8,0x44,0x8d,0x0b,0x4f,0x52,0xa9,0xf3,0xd8,0xde,0xe1,0x15,0xcc,0xf0,0x41,0xc3,0x7c,0xee,0x85,0xb9,0x7e,0x71,0x14,0x42,0xc9,0x12,0xb2,0x69,0x6f,0x97,0x65,0x3d,0x20,0x8d,
+ 0x04,0x20,0xc8,0x58,0x74,0x3a,0x30,0x5a,0xc6,0x45,0x99,0xa8,0xc1,0xec,0xe3,0x4a,0xcf,0xac,0x56,0x21,0xa6,0x17,0xb8,0x8a,0xcf,0x56,0x8b,0x23,0x62,0xfb,0x20,0x03,0xad,0x77,0x20,0x8d,
+ 0x04,0x20,0xc8,0x5a,0xea,0xd3,0xde,0x42,0x84,0x40,0x38,0x79,0x8a,0x9f,0x6b,0x5b,0x95,0x73,0xfc,0x8b,0x56,0x64,0x08,0x49,0x96,0xb4,0xce,0xd3,0x26,0x95,0x21,0x56,0x53,0x61,0x20,0x8d,
+ 0x04,0x20,0xc8,0x6c,0x18,0x5f,0x13,0x41,0xd5,0x5a,0x3c,0x5d,0xc9,0xc9,0x97,0x1f,0xee,0x40,0x4a,0x1f,0x85,0xcf,0x28,0xad,0xec,0x72,0x01,0x39,0xf4,0xaa,0x19,0xb2,0xb7,0xb3,0x20,0x8d,
+ 0x04,0x20,0xc8,0x6c,0xf3,0x53,0x99,0xd2,0xcb,0x49,0xbb,0xbe,0xf5,0x7c,0x3a,0x67,0x50,0xb7,0x54,0xac,0x55,0xd1,0xdf,0xe2,0xf4,0x1d,0x5a,0xe7,0x02,0x54,0xe6,0x08,0xa3,0x8e,0x20,0x8d,
+ 0x04,0x20,0xc8,0xb4,0x2e,0xf9,0x5f,0x38,0x87,0x4b,0xf6,0xd1,0x5b,0xd1,0x78,0xdf,0xcb,0x2d,0x27,0x85,0x94,0x0c,0x8f,0xbf,0xe9,0xd3,0x4d,0x8f,0x73,0xaa,0x97,0xa6,0xb3,0xb1,0x20,0x8d,
+ 0x04,0x20,0xc8,0xb8,0xbe,0x75,0x37,0xdc,0xee,0xb0,0x1b,0xe7,0x1d,0x1d,0x5e,0x4a,0x9d,0x52,0xfd,0xbd,0xcb,0x0a,0x05,0xbe,0x6a,0x21,0xc4,0x49,0xba,0xf8,0x6a,0x18,0xa1,0x24,0x20,0x8d,
+ 0x04,0x20,0xc8,0x85,0xcb,0x48,0x04,0x6b,0x46,0xac,0xc0,0x6f,0xe5,0xe4,0x5c,0xb7,0xc8,0x5c,0x86,0x7b,0x65,0xf0,0x44,0xad,0x46,0x0c,0x5a,0xd0,0xeb,0xd2,0x24,0x89,0x20,0xb6,0x20,0x8d,
+ 0x04,0x20,0xc8,0x87,0x5f,0xe7,0x75,0x24,0xe2,0xf2,0x3b,0xf2,0x75,0x30,0x82,0x7e,0x9b,0xae,0x31,0xeb,0x73,0x62,0xa0,0x29,0x30,0x38,0xcb,0x19,0xe5,0xc6,0xe8,0xa8,0x9e,0x27,0x20,0x8d,
+ 0x04,0x20,0xc8,0x89,0x94,0x14,0x1f,0x63,0x0d,0x5e,0x55,0xd4,0x5f,0x12,0x5e,0x58,0x30,0x64,0x75,0xc1,0xa4,0xd1,0x92,0xad,0x2c,0xaa,0x6a,0x9f,0x4e,0x83,0xe2,0xc1,0x5a,0xe6,0x20,0x8d,
+ 0x04,0x20,0xc8,0x90,0x5d,0x79,0x1c,0xc6,0x5f,0xdd,0xab,0x74,0x20,0xe5,0x6c,0x46,0x0a,0x1b,0x24,0xc5,0x15,0x6f,0x60,0x96,0xc0,0x48,0x6e,0xf1,0xc1,0x3e,0xfd,0xf0,0x4b,0xd9,0x20,0x8d,
+ 0x04,0x20,0xc8,0x9a,0xbe,0xd5,0xc9,0x17,0x41,0x42,0xe0,0x6c,0x94,0xab,0xcc,0x5c,0x8e,0x9e,0x49,0x07,0xd7,0x0e,0xbe,0x00,0x4e,0x29,0x8e,0x92,0xa7,0x8f,0xfd,0x3c,0x1d,0xf8,0x20,0x8d,
+ 0x04,0x20,0xc8,0xa6,0xdb,0x57,0xab,0x6e,0xf0,0xa9,0x8b,0x10,0x90,0x4c,0x82,0x6e,0x02,0x21,0x37,0xbb,0xf3,0x81,0xec,0x28,0x74,0x8e,0x1c,0xcd,0x92,0xf8,0xaf,0xfd,0x8e,0xe4,0x20,0x8d,
+ 0x04,0x20,0xc8,0xa8,0x68,0xc8,0xb8,0xb8,0x77,0x8e,0xd0,0x41,0x1b,0x46,0x82,0xd6,0x7d,0x42,0xdf,0xcf,0x83,0x5a,0xde,0xe5,0x5e,0x6a,0x38,0x2e,0x85,0x5c,0xb9,0xa2,0x89,0x9d,0x20,0x8d,
+ 0x04,0x20,0xc8,0xad,0xeb,0xab,0x81,0x2b,0x57,0xcf,0x16,0xfb,0x62,0xa2,0xc5,0xb5,0x4d,0x0d,0x9a,0xf9,0x4a,0xf2,0x7f,0xce,0xb5,0xad,0x3b,0xe1,0x47,0x15,0x52,0x79,0x9c,0xbd,0x20,0x8d,
+ 0x04,0x20,0xc8,0xb1,0x46,0x21,0xf4,0x02,0x1d,0x36,0x74,0xa7,0x29,0x58,0x74,0x4f,0x60,0x4e,0x62,0x68,0x20,0xe7,0x40,0x4f,0xfd,0xae,0xa9,0x77,0x4e,0x39,0xf0,0x08,0x9d,0x28,0x20,0x8d,
+ 0x04,0x20,0xc8,0xf4,0xc3,0x22,0x44,0x9c,0xb5,0xb4,0x71,0x92,0x5d,0xd2,0xbf,0xf4,0xb1,0x74,0x13,0x83,0x4e,0x84,0xe2,0xda,0xe8,0x77,0xd0,0x56,0xdc,0x71,0xf2,0x02,0xbb,0xdc,0x20,0x8d,
+ 0x04,0x20,0xc8,0xf6,0x5b,0xb7,0xed,0xb2,0xd3,0xff,0x43,0x09,0x91,0x28,0x16,0x71,0xda,0x34,0xbf,0xb4,0xd7,0x46,0xd6,0x9f,0x7f,0x4f,0x5c,0xcf,0xdf,0xd7,0x11,0xc6,0x81,0x36,0x20,0x8d,
+ 0x04,0x20,0xc8,0xfe,0x88,0xe2,0x53,0x06,0xed,0x34,0x70,0x85,0x0a,0x61,0xb1,0xa3,0x49,0x2d,0x75,0xbf,0xb4,0xf6,0x74,0xe8,0xf4,0xee,0x33,0xa1,0x6b,0x50,0x57,0x84,0xed,0x19,0x20,0x8d,
+ 0x04,0x20,0xc8,0xff,0x48,0x7f,0xa3,0x58,0xa4,0x48,0x77,0x9e,0x5b,0x03,0x0c,0x30,0xfb,0xf8,0x9a,0x86,0xb9,0x40,0x4d,0x94,0x8b,0xbe,0xb4,0x7a,0x16,0xb0,0xfc,0xa6,0x7c,0x0c,0x20,0x8d,
+ 0x04,0x20,0xc8,0xd1,0xcf,0x03,0x34,0x4d,0xc4,0x98,0x03,0x56,0x6d,0x46,0x41,0x2c,0x7b,0x08,0xd4,0xf9,0x74,0x91,0x0b,0x86,0x2a,0xdb,0x4c,0x6f,0x35,0xc3,0x2b,0x41,0xc7,0x59,0x20,0x8d,
+ 0x04,0x20,0xc8,0xd9,0xdc,0xdd,0xd3,0xb0,0xe4,0xc0,0x6d,0x35,0x42,0x76,0x96,0x2d,0x44,0xed,0x98,0x15,0xdb,0x1f,0x80,0x34,0xa4,0x28,0xa2,0x9a,0xf2,0xb9,0x92,0xf7,0xf2,0xf7,0x20,0x8d,
+ 0x04,0x20,0xc8,0xdb,0xae,0x47,0x68,0x75,0x43,0x72,0xa9,0xfd,0x85,0xfa,0xd3,0x7e,0x28,0x0b,0x78,0x28,0x33,0x95,0xe9,0x23,0x2e,0x39,0x6d,0x0e,0x68,0x6c,0x3f,0x46,0x09,0xc7,0x20,0x8d,
+ 0x04,0x20,0xc8,0xdd,0x51,0xb4,0x8a,0x27,0xdd,0x79,0xdc,0x6d,0x21,0x3e,0x5e,0x6e,0xa2,0xa7,0x58,0x9c,0xb8,0x1d,0x67,0x02,0x4b,0xbe,0xe6,0xab,0x9e,0x0e,0xa8,0x17,0xc4,0x45,0x20,0x8d,
+ 0x04,0x20,0xc8,0xdd,0x5c,0x78,0xc2,0x4f,0x9b,0x16,0x5c,0x18,0x33,0x53,0x02,0xef,0x0c,0xe9,0xc2,0x3d,0xcb,0xe7,0xda,0x23,0x96,0xc8,0x31,0x4b,0x0c,0x3c,0x58,0x7a,0x8a,0x93,0x20,0x8d,
+ 0x04,0x20,0xc8,0xdd,0x84,0xa9,0x75,0xef,0xfd,0x4d,0xdb,0x8f,0x05,0xf0,0x90,0xf1,0x2c,0x19,0xef,0xa4,0x0f,0xf7,0x74,0x14,0x3f,0xe5,0xbb,0x94,0x9e,0xe1,0x82,0x4c,0x60,0x32,0x20,0x8d,
+ 0x04,0x20,0xc8,0xe0,0xe6,0xfe,0x9d,0x71,0x50,0xde,0x9b,0x1c,0x88,0x98,0xa4,0x5c,0x5f,0xa7,0x35,0x7c,0x3e,0xca,0x5b,0x67,0x61,0x11,0xc7,0x79,0x15,0x34,0x49,0xca,0x92,0xa2,0x20,0x8d,
+ 0x04,0x20,0xc8,0xe1,0x72,0xe6,0x17,0x08,0x01,0xee,0xf1,0xb2,0x69,0x9a,0x08,0x0f,0x3b,0x49,0x64,0x52,0x6a,0x9c,0x3d,0xe5,0xcd,0x09,0xd5,0x08,0xa7,0xa1,0xba,0x9f,0xcf,0xd2,0x20,0x8d,
+ 0x04,0x20,0xc8,0xe6,0x23,0xa0,0xb2,0xe9,0xa0,0xb1,0xa1,0x31,0xfd,0x72,0x23,0x42,0x00,0x2c,0xd6,0x2c,0x0c,0xe0,0x9b,0x3b,0xf7,0x58,0x76,0xcc,0x4d,0x41,0xb6,0x5d,0xab,0xc6,0x20,0x8d,
+ 0x04,0x20,0xc8,0xf2,0xa1,0x45,0xae,0x14,0xe0,0x76,0xeb,0xc7,0x48,0x5a,0x67,0x89,0x7d,0xe3,0x59,0x57,0x64,0x2e,0x19,0x78,0x6b,0x17,0xe0,0x69,0x6e,0x98,0xd8,0xe9,0xb9,0xa9,0x20,0x8d,
+ 0x04,0x20,0xc9,0x13,0xf6,0x23,0x29,0x58,0x75,0xe8,0x10,0x4f,0x7e,0x6a,0x6c,0x4a,0xc4,0x8d,0x67,0xf7,0x57,0xc5,0xe5,0xfc,0x5b,0x45,0xd3,0xfb,0x83,0x50,0x07,0x5b,0xbc,0xab,0x20,0x8d,
+ 0x04,0x20,0xc9,0x13,0x80,0x4e,0xd8,0x03,0xe7,0x5a,0xd0,0x2f,0xf0,0x75,0xa1,0x3d,0xd6,0xd8,0x1b,0xcf,0x86,0x51,0xa9,0x3d,0xb5,0xfa,0x24,0x8a,0x96,0x36,0x52,0xd6,0x0e,0xfe,0x20,0x8d,
+ 0x04,0x20,0xc9,0x1f,0x01,0x8e,0xdc,0xc8,0x21,0x00,0x59,0x57,0xf8,0x20,0x4c,0xbe,0x16,0xc2,0xae,0xcb,0xdc,0x87,0xd3,0x9e,0xd5,0xee,0xed,0x86,0x91,0xe7,0xa0,0x19,0x15,0x70,0x20,0x8d,
+ 0x04,0x20,0xc9,0x24,0xed,0x0c,0x32,0x53,0xf6,0x2a,0x45,0xaf,0x35,0x0d,0xd6,0x27,0x15,0x3c,0xbe,0x8f,0x44,0x91,0x76,0xf2,0x18,0x3b,0xad,0xee,0xf9,0x61,0x0a,0x53,0x13,0x95,0x20,0x8d,
+ 0x04,0x20,0xc9,0x2e,0xd5,0x99,0xa5,0xba,0xc7,0x8b,0xf9,0x64,0x44,0x2b,0x83,0xd1,0x0c,0x89,0x6f,0x96,0xa4,0xa9,0x72,0x9d,0xa2,0x2b,0xd1,0x1c,0xe9,0xc1,0xd6,0xca,0xae,0x66,0x20,0x8d,
+ 0x04,0x20,0xc9,0x78,0x26,0x7c,0x26,0xaf,0x20,0xe5,0xac,0x49,0x12,0x7e,0xa7,0xdf,0x90,0x8c,0xe1,0x91,0x48,0x1b,0x87,0xe4,0x39,0x69,0x22,0xdb,0x2f,0x4e,0x74,0xd5,0x06,0x57,0x20,0x8d,
+ 0x04,0x20,0xc9,0x78,0xae,0x10,0xa3,0x78,0xad,0x22,0xe1,0xc1,0xcf,0x39,0xc1,0x98,0x65,0x6c,0x81,0xe9,0x8c,0x23,0xf0,0x1d,0x1f,0xbf,0x52,0xf3,0x1f,0x47,0x2f,0x6b,0x00,0xe5,0x20,0x8d,
+ 0x04,0x20,0xc9,0x7c,0xdb,0x2e,0x31,0x98,0xfd,0x0f,0xee,0x55,0x12,0x18,0x62,0xbf,0xbc,0x7a,0x1a,0xde,0x78,0xe1,0x14,0x51,0x06,0xc2,0x12,0x44,0xf3,0xb2,0x85,0x01,0xcb,0x14,0x20,0x8d,
+ 0x04,0x20,0xc9,0x7d,0x30,0xb0,0xe2,0x3b,0x32,0xee,0x79,0x6c,0x3d,0xfd,0x5a,0x6e,0x4c,0x4a,0x77,0x8e,0x1d,0x29,0x8d,0x78,0xb6,0xd9,0xe0,0xdd,0x21,0xf0,0xd6,0x69,0x15,0x80,0x20,0x8d,
+ 0x04,0x20,0xc9,0x4f,0x7e,0xb4,0x91,0x82,0x89,0x16,0x6d,0x25,0x74,0x39,0xff,0x6e,0xab,0x60,0x31,0xc7,0xa0,0xa8,0x9f,0x41,0xe0,0x79,0x33,0x12,0x6e,0xfa,0x7e,0x7c,0x30,0x16,0x20,0x8d,
+ 0x04,0x20,0xc9,0x5d,0xfd,0x54,0x1b,0x8b,0x50,0xeb,0x84,0xe7,0xe2,0xa9,0x33,0xf0,0x8f,0x85,0xa1,0x0a,0x13,0xfc,0x01,0x0e,0xb7,0x36,0xa3,0x26,0xe2,0x4f,0x32,0xa7,0xcf,0x29,0x20,0x8d,
+ 0x04,0x20,0xc9,0x5c,0xc4,0x02,0x5b,0xa2,0x7f,0x6f,0x48,0x08,0xdc,0xf1,0xb1,0x3a,0xe7,0x68,0x7d,0x57,0x2c,0x74,0x18,0x49,0x85,0x8c,0xd8,0x20,0xef,0x07,0x79,0x45,0x17,0xe2,0x20,0x8d,
+ 0x04,0x20,0xc9,0xb5,0x89,0x2d,0x56,0x00,0x4d,0x41,0x29,0x50,0x03,0x71,0x7b,0x05,0xa2,0x8c,0xdd,0x91,0x68,0xa9,0x45,0x65,0x82,0x4a,0x22,0x1e,0xbf,0x7b,0xa9,0xd6,0x50,0x45,0x20,0x8d,
+ 0x04,0x20,0xc9,0xbe,0xe0,0xdc,0xe1,0xe0,0xb8,0x9d,0x8c,0xd9,0x37,0x3f,0x92,0x94,0x24,0x98,0x97,0x5d,0x49,0xdc,0x2b,0xb1,0x49,0x8e,0xe8,0xc9,0x5a,0x41,0x9c,0x6a,0x3a,0x72,0x20,0x8d,
+ 0x04,0x20,0xc9,0x81,0x40,0x85,0x9c,0x3f,0xe0,0x25,0x4f,0x8f,0x34,0xdf,0xdc,0x82,0xd1,0x11,0x7c,0x00,0x64,0x38,0xd6,0x55,0xf0,0x11,0xdd,0xbc,0xa0,0xf3,0x5a,0x42,0xd6,0x22,0x20,0x8d,
+ 0x04,0x20,0xc9,0x88,0x67,0xdc,0x31,0xfe,0x77,0xc3,0x51,0xe4,0x6a,0x03,0xc9,0xd2,0xd8,0xb6,0x15,0xc6,0xac,0x95,0x77,0x46,0xa2,0x9b,0x69,0x9f,0x85,0xa4,0xdb,0x5b,0x59,0x1b,0x20,0x8d,
+ 0x04,0x20,0xc9,0x93,0x19,0xbb,0x7a,0x32,0x00,0xdc,0x3f,0xc8,0xe1,0x85,0xfd,0xb5,0x68,0x5b,0x86,0x88,0x61,0xda,0x97,0x46,0xa8,0xf4,0x95,0xfe,0xf1,0x0e,0x42,0xa2,0x4d,0xd5,0x20,0x8d,
+ 0x04,0x20,0xc9,0x9f,0xb2,0xec,0x6c,0xb0,0x5b,0x1f,0xeb,0xbf,0x8b,0xa9,0x75,0x18,0x63,0x42,0x63,0xbe,0x28,0x8e,0x0e,0x63,0x35,0x74,0xca,0x66,0x86,0x62,0x86,0xda,0x0e,0x16,0x20,0x8d,
+ 0x04,0x20,0xc9,0xa2,0xf9,0x1c,0x63,0x22,0x12,0xc1,0xbf,0x7c,0xb9,0x71,0x6d,0x2b,0x3a,0xd2,0xc1,0xc4,0xdc,0xd6,0x11,0x39,0xa7,0xd1,0xe9,0x7e,0xc2,0xef,0x5e,0x62,0x3c,0x9d,0x20,0x8d,
+ 0x04,0x20,0xc9,0xaa,0xa5,0xb5,0xb9,0xd0,0x2b,0x01,0x37,0x08,0x29,0x6d,0xf9,0xfa,0x8c,0x0e,0xd1,0x2e,0x4c,0xb3,0x3b,0x55,0x90,0x9d,0xb8,0x2c,0x7f,0xe9,0x26,0x76,0xa7,0x69,0x20,0x8d,
+ 0x04,0x20,0xc9,0xac,0x25,0x94,0x28,0xd7,0x65,0xc9,0x83,0xa7,0x2a,0x2d,0x85,0x85,0xc4,0x44,0xe6,0x8f,0x72,0xf9,0x70,0x1b,0xd0,0x12,0xd4,0x82,0x18,0xfe,0xa7,0xbd,0x6e,0x09,0x20,0x8d,
+ 0x04,0x20,0xc9,0xae,0x6e,0x0f,0x89,0x41,0x68,0x83,0x99,0xd9,0x80,0x57,0x19,0xed,0x49,0x54,0x4f,0xdc,0x9c,0x31,0xe5,0x30,0x8a,0xce,0x39,0x2e,0x94,0x76,0x86,0x61,0x27,0x33,0x20,0x8d,
+ 0x04,0x20,0xc9,0xc0,0x1b,0xb9,0x61,0x24,0x62,0xa9,0xb4,0xc0,0xd1,0x11,0x7a,0x9c,0x9e,0xab,0x00,0xeb,0xba,0x91,0xda,0xa6,0x3f,0x24,0xc9,0x86,0xc8,0xcc,0xa8,0xd3,0x3c,0x98,0x20,0x8d,
+ 0x04,0x20,0xc9,0xc0,0xf6,0xbe,0xef,0x56,0xd6,0xc8,0x96,0x4c,0x3a,0xe9,0x89,0xce,0x6e,0x19,0x1d,0x26,0x20,0x9f,0xc0,0x03,0x8b,0x03,0x60,0x05,0xd9,0x35,0x44,0x87,0xd2,0xd8,0x20,0x8d,
+ 0x04,0x20,0xc9,0xc6,0x3e,0x6a,0x67,0xde,0xdf,0x5f,0x41,0xa5,0x47,0xeb,0xbb,0x6c,0xc3,0x1e,0x37,0x35,0x9a,0x9e,0x7a,0x5d,0xa0,0x9c,0xfd,0x26,0x69,0x89,0xd2,0x77,0x3a,0x2a,0x20,0x8d,
+ 0x04,0x20,0xc9,0xc8,0x0f,0xbe,0xa7,0xa6,0x6d,0xc1,0x4c,0x9f,0x7a,0x87,0xfa,0x79,0x76,0x4e,0x11,0x01,0x66,0xe8,0xfd,0x8d,0x5c,0x9c,0xae,0xac,0xd2,0x3f,0xc2,0xc3,0x16,0xb8,0x20,0x8d,
+ 0x04,0x20,0xc9,0xcc,0x3a,0x9d,0xa7,0xee,0x70,0xc0,0xda,0x2c,0x1e,0xa2,0x54,0xb4,0x4f,0x04,0x43,0x72,0xa3,0x11,0x04,0x0f,0xc4,0x31,0x5e,0x52,0xf7,0x35,0x2e,0x66,0x10,0x97,0x20,0x8d,
+ 0x04,0x20,0xc9,0xce,0xaa,0xf6,0x9f,0x7d,0xe9,0x4d,0xfb,0x1f,0xae,0x69,0xeb,0x2c,0x29,0x78,0xf7,0x62,0xce,0xe5,0xa0,0x07,0x29,0x4f,0x68,0x2c,0xb7,0x0d,0x6c,0x98,0x1b,0x00,0x20,0x8d,
+ 0x04,0x20,0xc9,0xcf,0x7b,0xaf,0x3b,0xb5,0x46,0x04,0xf2,0x42,0x19,0x26,0xe5,0x2a,0x06,0x96,0x9a,0x36,0x0e,0xb8,0x2d,0xa1,0xc8,0x5a,0x2d,0xda,0xf6,0x7a,0xe9,0x05,0x9a,0xcd,0x20,0x8d,
+ 0x04,0x20,0xc9,0xe3,0x95,0x4b,0xe6,0x50,0xeb,0x82,0x17,0xd2,0xd0,0x1c,0x6b,0xde,0x96,0xfa,0x20,0x72,0x22,0xec,0x88,0xf2,0x65,0x41,0xd3,0x7d,0x57,0xd0,0xa7,0x3c,0xac,0x3b,0x20,0x8d,
+ 0x04,0x20,0xc9,0xec,0xc9,0x04,0x1f,0x87,0xaa,0xde,0x60,0xa8,0xf6,0xdf,0xc9,0x8b,0x63,0x70,0x64,0x08,0xc9,0xdc,0xde,0xb5,0x86,0xaf,0xae,0x29,0x8c,0x90,0xe1,0x0e,0xc9,0x0b,0x20,0x8d,
+ 0x04,0x20,0xc9,0xf2,0xfa,0x30,0x3c,0x44,0xcc,0x3b,0xe3,0xbb,0x11,0xe0,0xeb,0x4e,0x9c,0xdc,0x69,0xad,0x80,0xdb,0x2e,0xff,0x1f,0xff,0x03,0x4c,0xb7,0x3e,0xbb,0xe1,0x73,0x94,0x20,0x8d,
+ 0x04,0x20,0xca,0x3f,0xf1,0x5c,0x16,0x9a,0x9b,0x05,0x25,0x0e,0x1f,0x22,0x72,0xfc,0xd2,0xa1,0x8e,0x1a,0xd7,0x59,0xf1,0x3e,0xc3,0x75,0x40,0xbf,0x3d,0xda,0x0b,0x95,0x99,0xb8,0x20,0x8d,
+ 0x04,0x20,0xca,0x14,0x4e,0xcb,0xf7,0x98,0x8c,0xff,0x16,0x21,0x49,0xb2,0x93,0x8b,0x3e,0x34,0xaa,0x3d,0xbc,0xc7,0x52,0xf4,0x94,0x37,0x72,0x18,0x25,0x12,0x2b,0x75,0xc7,0xd7,0x20,0x8d,
+ 0x04,0x20,0xca,0x1f,0xbf,0xe2,0x44,0x2b,0x04,0x16,0xe2,0x15,0x9f,0x12,0x80,0x1b,0xc3,0x4e,0xcf,0xce,0xa0,0x9f,0x3f,0x7c,0x76,0x5b,0xea,0x99,0xc8,0xe9,0xaa,0x80,0x32,0x1e,0x20,0x8d,
+ 0x04,0x20,0xca,0x1f,0x93,0x0e,0x3a,0x67,0x8c,0xc4,0x96,0x82,0xa3,0xff,0x77,0x92,0x33,0x75,0x67,0xfe,0x78,0xbd,0xf9,0xe2,0x60,0xfd,0x69,0xf3,0x39,0x1b,0x91,0xa8,0x23,0x3d,0x20,0x8d,
+ 0x04,0x20,0xca,0x21,0x44,0x57,0xa3,0xd9,0xc6,0x89,0x87,0x51,0xd4,0x19,0x3f,0x9d,0xbf,0x53,0x5d,0x21,0x89,0xca,0xb9,0x36,0xa3,0xa7,0x6a,0x33,0x75,0xdd,0xaf,0xc2,0xc3,0x57,0x20,0x8d,
+ 0x04,0x20,0xca,0x30,0xff,0x6a,0x9c,0xb9,0x65,0x45,0xa5,0xbd,0x01,0x38,0xdf,0xa4,0x80,0xfd,0x8a,0x3f,0x54,0xb4,0x9a,0x89,0x3d,0x13,0xfb,0x0e,0x62,0x77,0xca,0x6e,0xcc,0xbb,0x20,0x8d,
+ 0x04,0x20,0xca,0x7b,0xd5,0x1d,0x86,0x91,0x0e,0xcd,0x70,0x85,0x3f,0x1a,0xcc,0x13,0xee,0x03,0xb7,0x4d,0xaf,0x93,0x4d,0x15,0xd2,0x0c,0xc7,0x26,0x36,0xc9,0xe9,0x0f,0x79,0x65,0x20,0x8d,
+ 0x04,0x20,0xca,0x7e,0x92,0xfd,0xdc,0x0e,0xe1,0x99,0x8d,0xd1,0x4e,0xa5,0x37,0x26,0xbc,0xa4,0xbe,0xbc,0xc2,0x5b,0xf9,0x43,0x40,0xc1,0xf0,0x86,0xad,0x4e,0x0e,0xe8,0xd8,0xae,0x20,0x8d,
+ 0x04,0x20,0xca,0x46,0x5d,0x7e,0xdb,0xac,0xf9,0x17,0xe0,0x3e,0xa4,0x81,0xb8,0xf7,0x08,0xe7,0x7b,0x2a,0xe0,0x07,0x07,0x21,0x39,0x16,0xd5,0xc4,0x58,0x5d,0x9d,0x99,0xe9,0xc4,0x20,0x8d,
+ 0x04,0x20,0xca,0x4c,0xdb,0xa0,0xfc,0xec,0x73,0xb5,0x01,0x66,0xbd,0x4f,0x82,0x07,0x00,0xa8,0x9a,0xe3,0xb1,0xc0,0xd8,0x44,0xd5,0xf4,0x56,0x53,0x21,0xd7,0xb0,0x38,0xc3,0xc1,0x20,0x8d,
+ 0x04,0x20,0xca,0x6f,0xd8,0xb0,0x0a,0x1e,0x5d,0x16,0x06,0xd9,0x5e,0xbf,0x6e,0x5c,0x54,0x11,0x0f,0x64,0x02,0x7b,0x1b,0x5a,0x27,0x40,0x68,0xb1,0x24,0x16,0x07,0xe3,0x37,0x0a,0x20,0x8d,
+ 0x04,0x20,0xca,0x71,0xf1,0xf6,0x7e,0x8d,0xd6,0x91,0x7b,0x8f,0xac,0xc1,0xb3,0xc1,0x1e,0xc5,0xf2,0x59,0x35,0x17,0x98,0x64,0xb0,0x14,0x0c,0x75,0xd0,0x8b,0x79,0xf3,0x13,0x2b,0x20,0x8d,
+ 0x04,0x20,0xca,0xb6,0x23,0x22,0x57,0x7e,0xe9,0x72,0x56,0x97,0x60,0x72,0x16,0x43,0x07,0xaa,0x8e,0x4c,0xc9,0xe4,0xc0,0xdd,0xa0,0xb0,0xf4,0xfe,0x83,0xe6,0x5b,0x4a,0x5f,0xab,0x20,0x8d,
+ 0x04,0x20,0xca,0x85,0xa5,0xa0,0x7a,0xe7,0x81,0xd4,0xc7,0x43,0x7d,0xe7,0x56,0x4e,0x9a,0x99,0x51,0x69,0xf4,0x61,0x8e,0x37,0x7c,0x06,0x9a,0xd0,0x7d,0xaa,0x9a,0x82,0x77,0x41,0x20,0x8d,
+ 0x04,0x20,0xca,0x91,0x20,0xaf,0x6f,0xaf,0xc7,0x2c,0xee,0x59,0x18,0x2d,0x34,0x72,0x3f,0x61,0xe2,0x79,0x4a,0x17,0x2e,0xe8,0xe7,0xa3,0x75,0x8a,0x03,0xd1,0xbe,0x7e,0xa6,0xa9,0x20,0x8d,
+ 0x04,0x20,0xca,0x92,0xda,0x50,0x8d,0x41,0xb2,0x79,0x78,0x7d,0xc7,0xb4,0x91,0x4f,0x93,0x44,0x41,0xe2,0xe5,0x09,0x85,0xf4,0xad,0xe3,0x32,0x1c,0xb1,0x45,0xd2,0x7e,0xc5,0x9f,0x20,0x8d,
+ 0x04,0x20,0xca,0x92,0xe2,0x57,0xbb,0xb7,0x09,0xde,0x7f,0x2e,0x9e,0xfa,0xe6,0xbd,0x88,0x4f,0x0a,0x8a,0x04,0x9c,0x03,0x98,0xdc,0x4a,0x73,0x84,0xeb,0xdf,0xfb,0x23,0x8f,0xec,0x20,0x8d,
+ 0x04,0x20,0xca,0x97,0xa2,0xc9,0x08,0x95,0x36,0x2c,0x1c,0xf2,0xa0,0x3f,0x05,0xc7,0xa0,0x29,0xf1,0x56,0x14,0xfc,0x83,0x00,0xf3,0x50,0x28,0x76,0x0e,0xe2,0x3e,0x03,0x0f,0x3c,0x20,0x8d,
+ 0x04,0x20,0xca,0x97,0xfb,0xee,0x9f,0xdf,0xbb,0x94,0xf9,0xcf,0x41,0xbb,0xb1,0xde,0x73,0xc7,0xc5,0x3b,0x69,0x09,0x40,0xec,0x0e,0x2c,0x23,0x09,0xc5,0x5d,0xd9,0x4b,0x1e,0xb4,0x20,0x8d,
+ 0x04,0x20,0xca,0x9b,0x07,0x51,0x5e,0xcf,0xcd,0xf3,0xf7,0x1f,0x8b,0x30,0x28,0x07,0xd2,0x36,0x70,0xac,0x2c,0x21,0x2b,0xea,0x5e,0x90,0xac,0xca,0x03,0x6b,0x6f,0xff,0x43,0x10,0x20,0x8d,
+ 0x04,0x20,0xca,0xa1,0xc2,0x98,0x42,0xe0,0x6e,0xa9,0x06,0x48,0xff,0x1e,0x9b,0x24,0xa1,0xc7,0x66,0x3b,0x37,0x5e,0xc1,0xd2,0xd6,0x12,0xd8,0xd4,0x31,0xe0,0x6d,0x7d,0x7f,0x82,0x20,0x8d,
+ 0x04,0x20,0xca,0xa3,0xef,0x5d,0x51,0xa9,0x04,0x6a,0x79,0x2a,0xc0,0x1b,0xe6,0xde,0xb3,0x21,0x70,0xd2,0xe9,0x8f,0x92,0xe5,0xd1,0x4a,0xa5,0xf2,0xe7,0xe5,0xce,0x15,0x74,0x85,0x20,0x8d,
+ 0x04,0x20,0xca,0xae,0x4d,0x15,0xac,0xe4,0xe4,0xc0,0xd3,0x81,0x19,0x89,0xf4,0x7d,0x3a,0x11,0x24,0x58,0xc3,0xae,0xcb,0x4b,0x97,0x04,0xbc,0x65,0xa6,0x44,0x84,0xe4,0x6b,0xff,0x20,0x8d,
+ 0x04,0x20,0xca,0xb2,0x9e,0x75,0x8e,0xba,0x4e,0x9a,0xc7,0x30,0xb1,0x0f,0xd3,0x6d,0x18,0xa0,0x86,0x1d,0x40,0x10,0x0e,0x3f,0x51,0xcd,0x8b,0x80,0x6b,0x76,0x33,0xb4,0xde,0xfe,0x20,0x8d,
+ 0x04,0x20,0xca,0xb2,0x9e,0x50,0xf5,0xab,0xc1,0x5f,0x10,0x9f,0x1a,0x54,0x54,0xea,0x84,0x67,0xa7,0x89,0x59,0x1f,0x40,0xf3,0x47,0xa9,0xd9,0x93,0xc2,0x68,0xe9,0x45,0xac,0x55,0x20,0x8d,
+ 0x04,0x20,0xca,0xf5,0xf1,0x51,0x9b,0x32,0xf1,0xf6,0x94,0xf6,0x5f,0xe8,0xb6,0xb8,0x3e,0x7e,0x10,0x23,0xbe,0xe6,0x5b,0x65,0x2e,0x14,0xb0,0xae,0xe6,0x48,0xaa,0x14,0x39,0x76,0x20,0x8d,
+ 0x04,0x20,0xca,0xf6,0x3b,0xf1,0xb2,0xb2,0x49,0xf5,0xf5,0xfa,0x29,0xab,0x87,0xd4,0x9d,0xb5,0x0c,0x58,0x4c,0x51,0xa6,0xa8,0x3e,0xf6,0x0e,0xff,0xe7,0x01,0xbf,0x41,0x9b,0x3c,0x20,0x8d,
+ 0x04,0x20,0xca,0xf8,0x69,0xfa,0x80,0x28,0x2c,0xde,0x77,0x51,0x5c,0x03,0xcb,0x69,0x94,0x4d,0x27,0xd9,0xa4,0x4d,0x87,0x00,0x71,0xc7,0xd4,0x10,0xf0,0x4a,0x68,0xd3,0xca,0xe4,0x20,0x8d,
+ 0x04,0x20,0xca,0xfb,0x57,0x42,0xa6,0xc1,0x7e,0x32,0x19,0x6f,0xb8,0x19,0x9f,0x1d,0xe6,0xe0,0x50,0x48,0x95,0xa6,0x84,0x98,0xca,0x7f,0x56,0x79,0x29,0x3f,0xcd,0xc9,0x07,0x3f,0x20,0x8d,
+ 0x04,0x20,0xca,0xd0,0x09,0xf0,0xb1,0xb9,0x28,0x88,0xdf,0x6d,0x0a,0x12,0x25,0xa6,0xa6,0x8f,0x6c,0x46,0x05,0x02,0x36,0xbc,0x51,0xbc,0xc3,0x07,0x1e,0xd7,0xcb,0x8e,0x35,0x00,0x20,0x8d,
+ 0x04,0x20,0xca,0xd1,0x8e,0xbb,0x94,0x81,0x9f,0x04,0xe9,0xa1,0x36,0x00,0x38,0x35,0x6e,0x63,0x53,0x36,0x0d,0x76,0x75,0xc5,0x41,0xd2,0xc2,0x28,0x2b,0x99,0x1a,0x89,0xe6,0x78,0x20,0x8d,
+ 0x04,0x20,0xca,0xd5,0x68,0x62,0x6f,0xb8,0x4e,0xa3,0x72,0x8c,0xb3,0xe0,0x8c,0x37,0x3e,0x6a,0x08,0x5c,0xc1,0x21,0x45,0xb3,0x1c,0x1b,0x59,0x7d,0xac,0xca,0xb2,0xde,0x7b,0x25,0x20,0x8d,
+ 0x04,0x20,0xca,0xdf,0x99,0x8a,0x04,0xc7,0x1d,0x21,0xed,0xcc,0x9b,0xe4,0xcf,0xb1,0x02,0x89,0xfc,0x98,0xde,0x90,0xc9,0x08,0x46,0x8d,0xed,0x32,0xb5,0xd4,0x60,0xa7,0x59,0x10,0x20,0x8d,
+ 0x04,0x20,0xca,0xef,0xa4,0xaa,0x95,0xd2,0x29,0x92,0x95,0xdb,0xe9,0xc5,0xaf,0x72,0x2d,0xab,0x90,0xcc,0x88,0x55,0x9a,0xd6,0x91,0x85,0x94,0x9f,0x09,0x2f,0xfa,0x04,0xeb,0xdb,0x20,0x8d,
+ 0x04,0x20,0xca,0xf2,0x73,0x74,0xe8,0x7e,0x3e,0xd1,0x72,0x8b,0x90,0x1f,0x13,0x45,0xdd,0xd9,0x7d,0xb6,0x25,0x3f,0x49,0x3e,0xce,0xdd,0xf3,0x32,0x95,0x24,0x04,0xd5,0x08,0xbd,0x20,0x8d,
+ 0x04,0x20,0xcb,0x34,0x9d,0x2b,0x4d,0x5f,0xdf,0x43,0x68,0x0c,0x00,0xd2,0xa8,0x88,0xd2,0xeb,0x98,0x36,0xdc,0x53,0xc2,0xfe,0x1f,0x29,0x8b,0xc5,0xa4,0xf3,0x88,0xab,0xf0,0xb5,0x20,0x8d,
+ 0x04,0x20,0xcb,0x0a,0xc1,0xb3,0x2b,0x96,0x31,0xf7,0x58,0x9e,0xab,0xcd,0x43,0x54,0x70,0xf7,0xb9,0x54,0x9d,0x74,0x85,0x22,0x0d,0xc9,0x49,0x5b,0x3c,0x5c,0xbc,0xd0,0x27,0xa8,0x20,0x8d,
+ 0x04,0x20,0xcb,0x0a,0xc6,0x37,0xfa,0x19,0xba,0x94,0xa9,0xd5,0xc7,0x13,0x3e,0xf8,0x5e,0x0c,0xcd,0xf7,0x99,0xff,0xb3,0x08,0x7e,0xf3,0xf9,0x5d,0x41,0x5b,0x31,0x61,0x88,0x64,0x20,0x8d,
+ 0x04,0x20,0xcb,0x12,0xd1,0x46,0x36,0x9d,0x11,0xcf,0xf9,0xb8,0x6f,0xa5,0x00,0xbf,0xdf,0x0d,0x4c,0x33,0xba,0x6b,0x5c,0x37,0xba,0xe6,0xd8,0x30,0x25,0x46,0x57,0xc3,0xd5,0x25,0x20,0x8d,
+ 0x04,0x20,0xcb,0x19,0x31,0x8e,0x24,0xb6,0x98,0x99,0x98,0xf2,0xfe,0x52,0x8c,0x23,0x44,0x22,0xd9,0x89,0x4b,0xec,0x46,0x13,0xa0,0x5f,0x36,0x29,0x9a,0xca,0xe6,0x67,0xbf,0xde,0x20,0x8d,
+ 0x04,0x20,0xcb,0x1b,0xb4,0xe2,0xbd,0x06,0xa2,0xe1,0xea,0x83,0x6c,0x49,0x83,0x23,0xd4,0x03,0x79,0x98,0x76,0x8b,0xe3,0x0e,0x4b,0x60,0xb8,0x89,0x7e,0x0d,0xd2,0x38,0xfe,0x83,0x20,0x8d,
+ 0x04,0x20,0xcb,0x21,0x5a,0xe8,0x43,0xba,0x53,0xba,0x84,0x4b,0x87,0xd7,0xe8,0x94,0x6c,0x49,0x0c,0xc4,0x5e,0xca,0xbc,0x9b,0x9c,0x8f,0xd0,0x26,0x6c,0xfd,0xea,0xb7,0x54,0x74,0x20,0x8d,
+ 0x04,0x20,0xcb,0x27,0xf7,0xc8,0xd3,0x6b,0x61,0x75,0x7a,0x68,0x09,0xeb,0x65,0x0c,0xb4,0x3c,0xcd,0x34,0x82,0x79,0xf0,0x5e,0xec,0x61,0x7c,0x7c,0xe9,0x5d,0xd3,0xca,0x76,0x83,0x20,0x8d,
+ 0x04,0x20,0xcb,0x26,0x3f,0xe8,0x3c,0x6c,0x81,0xad,0x38,0x44,0xce,0x8e,0x14,0xca,0xf7,0x88,0xcb,0x4b,0xdf,0x06,0x39,0xb7,0x94,0xce,0x09,0x70,0x7b,0x23,0x35,0x2f,0xa4,0xa6,0x20,0x8d,
+ 0x04,0x20,0xcb,0x29,0x43,0xda,0xe7,0x70,0x3c,0x7e,0xed,0x28,0x4b,0xc3,0xe6,0x0b,0x22,0xac,0xee,0x7b,0x7b,0x38,0x4e,0x18,0xce,0xec,0x76,0xcc,0x82,0xc5,0x0b,0x6a,0x55,0x7b,0x20,0x8d,
+ 0x04,0x20,0xcb,0x2b,0x14,0x1a,0x80,0x99,0xe4,0x06,0xc2,0x8e,0x2d,0xd8,0xbf,0xa8,0xc2,0x18,0x39,0x35,0x20,0xec,0xec,0x14,0x41,0xfc,0x1e,0x6c,0xc3,0x05,0x7e,0x2c,0xcf,0xe0,0x20,0x8d,
+ 0x04,0x20,0xcb,0x2b,0x14,0x4d,0x64,0xb8,0xd8,0x60,0x4c,0xb0,0x4a,0xc9,0x75,0xfe,0xd2,0xbe,0xd6,0xc2,0xff,0x1b,0x85,0xc9,0xa5,0x40,0x84,0x89,0x83,0xf6,0xcd,0x45,0xa7,0x1a,0x20,0x8d,
+ 0x04,0x20,0xcb,0x30,0x0a,0xd3,0x19,0xff,0xf8,0x2d,0x15,0xdb,0x20,0x7b,0xdc,0x39,0x48,0xab,0xe3,0xf8,0x16,0xe3,0x7a,0x71,0xa9,0xf6,0xcf,0x26,0x0d,0x46,0x9e,0x8b,0x12,0xbf,0x20,0x8d,
+ 0x04,0x20,0xcb,0x32,0x9b,0xf3,0x58,0xba,0xde,0x47,0x8c,0xd8,0x06,0xf9,0x1a,0xd8,0x3b,0xb0,0xb4,0xf2,0x18,0xd3,0xa4,0x50,0x41,0xb1,0xbc,0x91,0x52,0xb9,0x9b,0x1e,0x32,0x67,0x20,0x8d,
+ 0x04,0x20,0xcb,0x76,0x64,0xa9,0xf0,0x50,0x12,0x0a,0xff,0xca,0x01,0x19,0xa2,0x49,0xf0,0x9e,0x83,0x6f,0x18,0xc5,0xab,0x1b,0xca,0x6c,0xcc,0x53,0x9a,0x39,0x7d,0xf0,0x1f,0x4e,0x20,0x8d,
+ 0x04,0x20,0xcb,0x76,0xc4,0xea,0x66,0x35,0x9e,0x1c,0xe5,0x55,0x9c,0x9d,0x55,0x44,0x23,0x91,0xc3,0x2a,0x80,0x5f,0x6f,0xbf,0xe3,0x85,0x1f,0xf4,0x7f,0xa1,0x93,0x41,0xe1,0x94,0x20,0x8d,
+ 0x04,0x20,0xcb,0x7a,0xfa,0x44,0xf7,0xdc,0x5a,0x85,0x29,0x52,0xec,0xef,0xc9,0x09,0xa9,0x59,0xc9,0x6b,0x2d,0x7b,0xa6,0x45,0x2e,0x3c,0xc3,0x26,0xe0,0x48,0x02,0xce,0x2e,0xd2,0x20,0x8d,
+ 0x04,0x20,0xcb,0x40,0x82,0x1e,0xbb,0x84,0x66,0xb7,0x5c,0x68,0xec,0x54,0x19,0x70,0x90,0x7b,0x29,0x52,0x03,0x34,0x2c,0xdc,0x1d,0xca,0x19,0xb6,0xe6,0x0e,0xbf,0x00,0x55,0x2c,0x20,0x8d,
+ 0x04,0x20,0xcb,0x43,0x5e,0x0a,0x8f,0x57,0xe3,0x11,0xab,0x91,0x82,0x3d,0x76,0x88,0x2e,0xa1,0xe4,0x2b,0xb6,0x03,0x58,0x6f,0x35,0xcd,0xff,0xef,0xb8,0x89,0x16,0xbd,0xac,0xc3,0x20,0x8d,
+ 0x04,0x20,0xcb,0x45,0xcb,0x9e,0xd8,0xb2,0x60,0x44,0xb9,0x0e,0x03,0xf7,0x29,0x5e,0xb3,0x90,0xd0,0xb9,0x0b,0xc8,0xeb,0xbb,0x2d,0x45,0xaf,0xd1,0x04,0xcb,0xc0,0x9e,0xb9,0x34,0x20,0x8d,
+ 0x04,0x20,0xcb,0x48,0x0e,0xb9,0x7f,0x81,0x9a,0x84,0x66,0xbb,0x71,0xb4,0x62,0x88,0x37,0xb6,0xac,0x8e,0x40,0xea,0xf8,0xca,0xa1,0xae,0x7f,0x08,0x6e,0xfc,0x74,0x05,0x5a,0xd3,0x20,0x8d,
+ 0x04,0x20,0xcb,0x4d,0x73,0x28,0x66,0x54,0x1e,0x5c,0x11,0xe0,0xe8,0xab,0x75,0x82,0xf5,0x5e,0x17,0x4c,0x8e,0x38,0x3e,0x59,0x54,0x02,0x3c,0x72,0x72,0x01,0xd2,0xf6,0xdf,0xce,0x20,0x8d,
+ 0x04,0x20,0xcb,0x51,0xf5,0x21,0xc0,0x11,0xa5,0x8e,0x9c,0x10,0x41,0x66,0xd2,0x5e,0x3f,0xe4,0xab,0xf8,0xe6,0xa6,0xc7,0x5d,0xe5,0xb3,0x3e,0x1e,0x35,0xea,0xd6,0xc6,0xea,0xca,0x20,0x8d,
+ 0x04,0x20,0xcb,0x57,0x56,0x31,0x3c,0x1d,0x5e,0x9a,0x73,0xca,0x08,0x7c,0xc7,0x07,0x8a,0xa1,0x70,0x5e,0x83,0x90,0x45,0x71,0x83,0x31,0x29,0xdf,0x95,0x86,0x04,0x00,0xe3,0x72,0x20,0x8d,
+ 0x04,0x20,0xcb,0x58,0x60,0xa3,0xd0,0x5d,0xad,0x61,0xad,0x19,0x4d,0xe4,0x2f,0x12,0x89,0x69,0x6c,0x6c,0x4e,0x85,0xa7,0x8d,0x47,0x7b,0xe1,0xef,0x01,0x5e,0x63,0xc8,0x6d,0x8d,0x20,0x8d,
+ 0x04,0x20,0xcb,0x59,0x67,0x03,0x23,0x50,0x8a,0x57,0xc4,0x08,0x5f,0x8f,0xc7,0xf1,0xcf,0xc7,0xd1,0xcc,0xc1,0xcc,0x3b,0xc7,0x72,0x75,0x7d,0x68,0xbc,0x44,0xc0,0x06,0xac,0xf8,0x20,0x8d,
+ 0x04,0x20,0xcb,0x67,0xa4,0x87,0xcd,0x45,0x52,0x65,0xf3,0xf2,0xd1,0x86,0x23,0x00,0x5b,0x61,0x23,0x04,0x96,0x1d,0x3e,0x9b,0xeb,0xf9,0x81,0x49,0x0d,0x7f,0x16,0x8c,0x9a,0xf4,0x20,0x8d,
+ 0x04,0x20,0xcb,0x6a,0xa8,0x53,0x7f,0xf2,0x08,0xda,0x7b,0x57,0xe9,0xdf,0x19,0x4d,0xbb,0xf2,0x4b,0x0b,0xba,0x4f,0x13,0x4a,0x77,0x8b,0x6a,0x87,0x61,0x4b,0x08,0x7e,0xe6,0xfc,0x20,0x8d,
+ 0x04,0x20,0xcb,0x6c,0x45,0x48,0xe3,0xe3,0xa5,0xd0,0x69,0xba,0xd6,0xaf,0x15,0xac,0xc9,0xa6,0x2b,0x2b,0x7c,0xf2,0x0e,0xb1,0xe0,0xc7,0xef,0x55,0x92,0x09,0xe2,0xca,0xea,0xc9,0x20,0x8d,
+ 0x04,0x20,0xcb,0x6e,0xab,0xe0,0x7d,0xf7,0x24,0x52,0xcc,0xc9,0x90,0xa4,0xc4,0x6c,0x1f,0xda,0x64,0x0c,0xde,0xc7,0x93,0x48,0x8b,0xec,0x26,0x9b,0xb9,0x2a,0x61,0x37,0xdf,0x7d,0x20,0x8d,
+ 0x04,0x20,0xcb,0xb8,0x51,0x66,0xdc,0x1c,0x4c,0x20,0xca,0x8c,0x99,0x98,0x83,0x25,0x48,0x93,0xb8,0xc4,0x67,0x7c,0x5c,0xc1,0x40,0x24,0x00,0xb4,0x19,0x07,0x03,0xce,0xbb,0x33,0x20,0x8d,
+ 0x04,0x20,0xcb,0xba,0x90,0x4a,0xb9,0xec,0x1d,0xf7,0xa8,0xd1,0x33,0x79,0x1e,0x76,0x76,0x1a,0x05,0xcc,0x81,0x44,0xf6,0x5e,0x92,0x91,0x89,0xf5,0xf4,0x87,0x5c,0x56,0xac,0xbf,0x20,0x8d,
+ 0x04,0x20,0xcb,0x82,0x9d,0x7c,0x24,0x63,0xf1,0x79,0x20,0xc3,0xa8,0x2c,0x2f,0x95,0xc8,0xae,0x31,0x42,0x2b,0xfb,0x39,0x18,0x47,0xff,0x25,0xd4,0xc0,0x97,0x17,0xbc,0xdf,0x76,0x20,0x8d,
+ 0x04,0x20,0xcb,0x86,0x92,0xb0,0x86,0x89,0x2a,0xc4,0x85,0xef,0x86,0xa7,0xcf,0x21,0x74,0x8d,0x08,0x50,0x98,0xfb,0x0f,0x3d,0x30,0xc5,0x7a,0x97,0x60,0xa7,0xc6,0xa1,0x24,0xd5,0x20,0x8d,
+ 0x04,0x20,0xcb,0x8b,0x22,0x2e,0x6f,0x7e,0xb6,0xdd,0x5c,0x3e,0x2c,0x98,0x53,0x2a,0xc6,0x81,0x8d,0x63,0xc4,0x8b,0xbb,0x27,0xfc,0xc3,0xf3,0x70,0x33,0x80,0x98,0x87,0x0c,0xbe,0x20,0x8d,
+ 0x04,0x20,0xcb,0x8f,0x70,0x65,0x4e,0x60,0xa3,0xd3,0x1a,0x0b,0x4e,0x88,0x3a,0x6b,0x79,0x97,0xae,0x80,0x63,0xf6,0x2c,0xa3,0x7a,0x12,0x71,0x6e,0x95,0xa9,0x74,0xd6,0x3d,0x8e,0x20,0x8d,
+ 0x04,0x20,0xcb,0x94,0xc3,0x62,0x5b,0x34,0x8d,0x2e,0xb9,0x15,0x48,0xa0,0xfd,0xdd,0x0a,0x46,0xba,0x82,0x5c,0x99,0xc6,0xf6,0x45,0x66,0x91,0x04,0xc7,0x9d,0xa7,0xb4,0x6c,0x1f,0x20,0x8d,
+ 0x04,0x20,0xcb,0xa4,0x9a,0x89,0x67,0x86,0x6c,0xa5,0xb1,0x7c,0xd9,0xeb,0x21,0xb2,0x8f,0x32,0xc0,0x94,0xf5,0x65,0x18,0x7a,0x7e,0x96,0x26,0xc3,0x3e,0x79,0x41,0xda,0xec,0x6d,0x20,0x8d,
+ 0x04,0x20,0xcb,0xa4,0xaf,0x16,0xfa,0x06,0xd9,0x75,0x14,0x04,0x06,0x32,0x84,0x51,0x19,0x86,0xf1,0xb4,0xec,0x19,0xcb,0xf9,0x85,0xdb,0x07,0xff,0xad,0x0d,0x4a,0x13,0x01,0x1b,0x20,0x8d,
+ 0x04,0x20,0xcb,0xaa,0xcf,0x59,0x40,0x9c,0xf2,0xcb,0x8b,0xfd,0xe8,0x8d,0x08,0x0f,0x92,0xbd,0x0c,0xdd,0xa4,0x17,0xb7,0x38,0x8c,0xad,0x9c,0xc1,0x5e,0xe9,0xea,0x82,0x29,0x20,0x20,0x8d,
+ 0x04,0x20,0xcb,0xac,0x2f,0xc5,0x4b,0x38,0xfd,0x73,0xa4,0x9f,0xd7,0x2e,0xe6,0x28,0xb3,0xb2,0x19,0x44,0x1c,0x02,0xb0,0x9b,0x75,0x4f,0xf5,0x38,0x52,0xfa,0xbd,0x43,0x01,0xea,0x20,0x8d,
+ 0x04,0x20,0xcb,0xf7,0x57,0xa9,0xe2,0x28,0xef,0xd5,0xde,0xad,0xa1,0x16,0xb8,0x00,0xbd,0x80,0xea,0x7a,0x71,0x74,0x2f,0x33,0x02,0xdf,0xb7,0x4b,0xb4,0x33,0x13,0xe2,0x84,0xae,0x20,0x8d,
+ 0x04,0x20,0xcb,0xcc,0xe0,0xbd,0x5a,0x4e,0xa5,0x40,0x50,0xf4,0xc9,0x58,0x7e,0x21,0x19,0xde,0x35,0x93,0xa7,0x77,0xa8,0x76,0x6d,0x4f,0x80,0xff,0xfb,0x3f,0xea,0x53,0x9e,0xd8,0x20,0x8d,
+ 0x04,0x20,0xcb,0xcd,0x80,0xb4,0x20,0xb9,0x6b,0x94,0x92,0x92,0xfc,0x1a,0x0e,0x77,0x22,0x3d,0xc6,0xa2,0x29,0x2f,0x57,0x6c,0x40,0x8d,0x44,0x84,0xee,0x5b,0x08,0xcb,0x33,0x8c,0x20,0x8d,
+ 0x04,0x20,0xcb,0xce,0x90,0xb1,0x7b,0x2c,0x26,0x12,0x67,0xdb,0x0a,0x6a,0x3e,0x4b,0xbd,0xd6,0x05,0xab,0x90,0x28,0x98,0x06,0xa7,0xdb,0x49,0x73,0x75,0x05,0x04,0x0f,0x0a,0x17,0x20,0x8d,
+ 0x04,0x20,0xcb,0xda,0xe7,0x6e,0x0e,0x88,0xeb,0xcb,0xa7,0xa7,0x4e,0x1a,0xa9,0x4a,0x9e,0xb1,0x04,0x7a,0xd1,0xfe,0x9b,0xbe,0xf0,0x32,0x26,0x0a,0x38,0xb4,0xb0,0xb4,0x32,0x71,0x20,0x8d,
+ 0x04,0x20,0xcb,0xde,0xc3,0xa7,0xfe,0x07,0x87,0x84,0x88,0xfd,0x84,0xe8,0x17,0x4a,0xe2,0xc5,0x67,0x64,0xb4,0x3e,0xcb,0x47,0x22,0xe2,0xd7,0x12,0x3e,0x3c,0x6e,0xa2,0xf2,0xc2,0x20,0x8d,
+ 0x04,0x20,0xcb,0xe1,0xa6,0xe4,0x4d,0x58,0x24,0xcc,0x6e,0x2c,0xb4,0xd8,0x0c,0x04,0x15,0xf4,0xff,0x72,0xc6,0xae,0x8c,0x20,0x3b,0x36,0x6d,0x09,0x83,0x78,0x51,0x38,0xc6,0xc6,0x20,0x8d,
+ 0x04,0x20,0xcb,0xe1,0x57,0x6b,0xa1,0xbd,0x38,0xdd,0x53,0x6c,0x3e,0x9e,0x3c,0x82,0xff,0xb3,0x1f,0x24,0x4c,0x7b,0x84,0xa5,0x93,0x5b,0x58,0x26,0xd8,0xf2,0x8d,0xe9,0x09,0xbb,0x20,0x8d,
+ 0x04,0x20,0xcb,0xef,0xa9,0xc3,0x5f,0xc5,0x51,0x6c,0x85,0xe2,0xe3,0x70,0x92,0xc2,0x6b,0x3a,0x0c,0xe0,0x75,0x5f,0x15,0x97,0xef,0xf9,0xa5,0x9f,0xc2,0xa0,0x25,0xde,0x4c,0x35,0x20,0x8d,
+ 0x04,0x20,0xcc,0x17,0x6c,0xe4,0xb9,0x1b,0x80,0x23,0x34,0xd3,0x93,0x5c,0x56,0x62,0x04,0x98,0x0d,0xe7,0x73,0x85,0xec,0x7f,0xa7,0x3d,0x3f,0xde,0xf1,0xcd,0xf0,0x3f,0x6b,0xda,0x20,0x8d,
+ 0x04,0x20,0xcc,0x21,0xc3,0x68,0x88,0x50,0x8a,0x65,0xcb,0xdc,0x29,0x65,0x39,0x61,0x65,0x0c,0x22,0x59,0x4d,0x9e,0x6e,0x9d,0x3a,0xc6,0x41,0x9d,0x6a,0x97,0xc2,0xc6,0xc4,0x06,0x20,0x8d,
+ 0x04,0x20,0xcc,0x22,0x9e,0x14,0xe7,0x7f,0x19,0x0e,0x90,0xfd,0xbb,0xe7,0x91,0x5d,0x39,0x78,0x09,0xbf,0x86,0x2a,0x1b,0x77,0x57,0x67,0x7a,0x84,0x9c,0x75,0xf9,0xae,0x42,0x70,0x20,0x8d,
+ 0x04,0x20,0xcc,0x23,0x60,0x1f,0xc3,0x6e,0xe7,0xd2,0xd1,0x3f,0x71,0xd7,0x85,0x03,0x5f,0xce,0x5c,0xf1,0xd0,0xf7,0xc7,0x2d,0x85,0x34,0xb1,0x9c,0x1f,0x7e,0x4b,0x0a,0x20,0x89,0x20,0x8d,
+ 0x04,0x20,0xcc,0x27,0x8a,0xc7,0xe7,0xd7,0xff,0x7e,0xc6,0xe8,0x6f,0xa2,0x79,0x46,0x41,0x3d,0x84,0x59,0x63,0x08,0x81,0x8c,0x77,0xab,0xc9,0x58,0x49,0x62,0x27,0x55,0xdc,0xdb,0x20,0x8d,
+ 0x04,0x20,0xcc,0x2b,0xd6,0x91,0xf8,0x8d,0x89,0x95,0x61,0x9a,0x08,0x3b,0x2d,0x4a,0x4a,0x62,0x35,0x01,0x2b,0x5a,0x93,0x6d,0xa8,0xe0,0xc4,0x51,0x39,0xd0,0xdc,0xda,0x77,0x2a,0x20,0x8d,
+ 0x04,0x20,0xcc,0x2a,0x16,0xc2,0xd6,0x3c,0xdd,0x4b,0xea,0x57,0x40,0x9a,0x6d,0x05,0x65,0x43,0xac,0xae,0xb2,0xb3,0xc7,0xc5,0xdb,0xb6,0x52,0xbd,0xa6,0xb9,0x27,0x20,0x59,0xcd,0x20,0x8d,
+ 0x04,0x20,0xcc,0x75,0xad,0x0b,0x78,0x0d,0x21,0x76,0xf8,0x1e,0x7a,0x30,0x3a,0x95,0xd2,0xe6,0x52,0xd0,0x29,0x65,0x31,0xfc,0xa7,0x15,0x94,0x4b,0x1c,0xb7,0xa1,0xf1,0x2d,0xb9,0x20,0x8d,
+ 0x04,0x20,0xcc,0x7c,0x52,0xa2,0x57,0xbb,0xb8,0x62,0x2d,0x8a,0x76,0x03,0xf4,0x64,0xac,0xf9,0x0e,0x98,0x86,0x01,0x6e,0x68,0x6a,0x5b,0x7c,0x9b,0xb7,0xc0,0xc0,0xf7,0x21,0x21,0x20,0x8d,
+ 0x04,0x20,0xcc,0x7f,0x28,0x09,0x68,0x65,0x79,0xe4,0x8d,0xac,0x61,0x01,0x98,0x44,0xe5,0x59,0xd1,0x05,0x1c,0xf1,0xcf,0x51,0xb2,0x0f,0xf8,0xae,0x28,0x4f,0x6e,0x56,0x56,0xe0,0x20,0x8d,
+ 0x04,0x20,0xcc,0x62,0x58,0xf6,0x51,0xed,0xa2,0x61,0xcf,0xd1,0x6f,0x38,0x2b,0xb5,0xd3,0x5d,0x6c,0x4f,0x89,0x7e,0xfc,0x4d,0x29,0x5b,0xa3,0xb4,0x81,0x7e,0x68,0x95,0x72,0x86,0x20,0x8d,
+ 0x04,0x20,0xcc,0x62,0x73,0x4b,0xba,0x2c,0xd7,0x85,0xc8,0xf4,0xb3,0xfa,0x4d,0x50,0x92,0x34,0x1b,0x61,0x4f,0xe7,0xf0,0xa0,0x7c,0xb8,0xa3,0x1d,0x2c,0xe4,0x72,0x59,0xdc,0x8e,0x20,0x8d,
+ 0x04,0x20,0xcc,0x67,0xb8,0x9b,0x8f,0x05,0xd8,0xed,0x72,0x82,0x1f,0x7c,0x42,0x1d,0x7f,0x03,0xd0,0xd1,0x9c,0x34,0x0c,0x36,0x44,0xee,0x1d,0x69,0xe3,0xe4,0x7f,0x49,0xae,0x89,0x20,0x8d,
+ 0x04,0x20,0xcc,0x6b,0x24,0xa6,0x21,0xda,0xcd,0x56,0x10,0xb3,0xce,0xaa,0x54,0xd4,0x1c,0x7a,0xfd,0xb3,0xcd,0x95,0xec,0x31,0x54,0x43,0xf9,0x3b,0x4a,0xc5,0xab,0x9a,0x25,0x63,0x20,0x8d,
+ 0x04,0x20,0xcc,0x71,0xa8,0xc1,0x62,0x81,0x7a,0xfe,0x93,0x9e,0xb0,0xbc,0xd6,0x4c,0x41,0x9f,0x6a,0x3e,0x75,0x85,0xe1,0xf0,0x5e,0x36,0xeb,0x83,0x8c,0x25,0x39,0xa8,0xa1,0x46,0x20,0x8d,
+ 0x04,0x20,0xcc,0xb9,0xf0,0xfb,0xcf,0x5a,0x5f,0x9e,0x00,0xee,0x63,0xc0,0xd1,0x22,0xbf,0xdd,0xe7,0x99,0xb5,0xb9,0x55,0xf9,0x64,0xa9,0x73,0xf1,0xcf,0xc1,0xc6,0x46,0x27,0x19,0x20,0x8d,
+ 0x04,0x20,0xcc,0x80,0xbb,0x52,0x64,0x29,0xfc,0xcf,0x5f,0xd8,0xb8,0x84,0x13,0xd1,0x79,0x8e,0x74,0x16,0x3b,0xe3,0xcd,0x34,0x63,0x53,0x87,0xbb,0xfb,0x9a,0xee,0xf7,0xd2,0x7d,0x20,0x8d,
+ 0x04,0x20,0xcc,0x83,0x92,0x92,0x24,0xcb,0x1b,0x8b,0x9d,0xea,0x9d,0xe6,0x21,0x37,0x57,0xbd,0x0c,0x66,0x0f,0x23,0x6c,0x72,0x0f,0xbe,0x09,0x5b,0x6c,0x97,0x44,0xd7,0xef,0xf1,0x20,0x8d,
+ 0x04,0x20,0xcc,0x8d,0x37,0x63,0x1a,0x95,0x48,0x73,0x94,0x20,0xdf,0x3a,0x3b,0xec,0x60,0xcb,0xff,0x32,0x8d,0x0e,0xf3,0xb7,0xcc,0xdd,0x62,0x36,0x17,0x0f,0x3d,0x1e,0xf9,0x93,0x20,0x8d,
+ 0x04,0x20,0xcc,0x91,0xde,0xdf,0x4d,0xaa,0x45,0xc7,0x42,0x2f,0xce,0x5c,0xf5,0x34,0x94,0x50,0x7a,0x5a,0x0d,0xac,0xe1,0x3c,0x38,0x81,0xdc,0xbf,0xf6,0xb2,0xf3,0x32,0x39,0xc5,0x20,0x8d,
+ 0x04,0x20,0xcc,0x90,0xfb,0x49,0x2f,0x67,0x0b,0xb7,0xfa,0x84,0x16,0x4f,0xf5,0xc0,0x88,0xec,0x5f,0xb1,0x52,0x4b,0xf4,0xf8,0x3f,0x35,0xb3,0x6d,0xaf,0x0f,0xe8,0xee,0x8a,0x3a,0x20,0x8d,
+ 0x04,0x20,0xcc,0x91,0x20,0x0e,0x20,0xfa,0x57,0x77,0xf5,0xa7,0x20,0xb5,0x59,0x26,0xd2,0x7d,0x6a,0xd5,0x79,0x24,0x62,0x6e,0xaf,0xe5,0xbf,0x04,0x70,0xf5,0xf8,0x4c,0xf0,0xf1,0x20,0x8d,
+ 0x04,0x20,0xcc,0xa3,0xcd,0xde,0x09,0xf3,0x65,0x18,0x1f,0xd0,0x35,0xcc,0x70,0x0c,0x53,0x5c,0xed,0x89,0xb4,0x16,0xe6,0x58,0xba,0xdf,0xc4,0xbc,0x30,0x19,0xea,0x03,0x9f,0xf4,0x20,0x8d,
+ 0x04,0x20,0xcc,0xae,0x62,0x15,0xea,0x71,0x52,0x2d,0xb6,0x68,0xe4,0x29,0x25,0x6d,0xe3,0x80,0x8a,0x86,0xa9,0x69,0x02,0x57,0x61,0x07,0x42,0x21,0x35,0x31,0xd2,0xeb,0x9d,0xc2,0x20,0x8d,
+ 0x04,0x20,0xcc,0xb3,0x42,0xc6,0x59,0x7d,0x88,0x07,0x62,0x54,0x0b,0xc6,0xd8,0x3c,0x11,0x66,0x1d,0x34,0xb4,0x95,0xf3,0x4e,0x71,0x34,0x89,0x3a,0x52,0x59,0xd3,0xb2,0x0f,0x7a,0x20,0x8d,
+ 0x04,0x20,0xcc,0xfc,0x65,0x39,0xfb,0x6f,0x80,0x63,0x46,0xf4,0x13,0x41,0x07,0xf3,0x11,0x49,0x29,0xe3,0xce,0xd5,0xa6,0x34,0xdc,0x37,0x75,0x00,0xd2,0x98,0xb8,0x76,0xb9,0x4e,0x20,0x8d,
+ 0x04,0x20,0xcc,0xfc,0x7a,0xe7,0x0e,0x02,0xf2,0xce,0x03,0xbf,0xf0,0xe2,0xdf,0xe0,0xb5,0x19,0x26,0x3a,0xe6,0xd6,0x75,0x2a,0x5c,0xf3,0x7d,0xb6,0x62,0x5e,0xbc,0x4d,0xbc,0x2e,0x20,0x8d,
+ 0x04,0x20,0xcc,0xfd,0x5f,0x92,0x07,0xfd,0x6a,0xbb,0x63,0xaa,0x4e,0x42,0x32,0x99,0x56,0xdc,0xb0,0x9d,0xb5,0xa7,0x12,0xb0,0x63,0xaf,0x26,0x65,0xac,0x51,0x0a,0xf5,0xc1,0x69,0x20,0x8d,
+ 0x04,0x20,0xcc,0xc4,0xc5,0xc6,0x53,0x1a,0x9f,0xf1,0x38,0xe4,0x23,0x96,0xfb,0x27,0xfd,0x33,0xf6,0x86,0x64,0xc8,0xb6,0xbd,0x76,0xb9,0x14,0x14,0x29,0x63,0xde,0xe2,0x71,0x40,0x20,0x8d,
+ 0x04,0x20,0xcc,0xce,0xc2,0x63,0x94,0x23,0xa9,0x32,0xfe,0x1b,0xf3,0x6c,0x6a,0x26,0xf4,0xf9,0xe1,0xff,0x4b,0xa8,0x28,0x66,0x06,0xd7,0x24,0xe3,0x2f,0x0d,0x4b,0x57,0x86,0x84,0x20,0x8d,
+ 0x04,0x20,0xcc,0xd9,0x69,0x61,0xdb,0xee,0x54,0xe3,0x3c,0xb3,0xa2,0x59,0xa7,0x7d,0xc8,0x59,0xe8,0x24,0xdc,0x9b,0xb7,0x82,0x90,0x1a,0x40,0x45,0xa6,0x1d,0x06,0x9e,0xd5,0x4c,0x20,0x8d,
+ 0x04,0x20,0xcc,0xdd,0x4e,0x62,0x75,0x35,0x5e,0x20,0x29,0x20,0x49,0x34,0x2f,0x2f,0xa9,0xee,0xe3,0x71,0x5c,0x92,0xfc,0x0e,0xa2,0x46,0x59,0x47,0x0e,0x02,0x96,0xe5,0x7a,0x76,0x20,0x8d,
+ 0x04,0x20,0xcc,0xed,0x1c,0x29,0x67,0x13,0x4a,0xe2,0x09,0x5c,0x83,0x67,0x3d,0x01,0x13,0x72,0x16,0x89,0xe8,0x4c,0x64,0x74,0x62,0x62,0x0e,0xf0,0x92,0x2e,0x36,0xd1,0xfa,0x56,0x20,0x8d,
+ 0x04,0x20,0xcd,0x36,0x45,0x1f,0x75,0x9c,0x12,0x56,0xde,0x09,0x82,0xd8,0xd8,0x6d,0x21,0x82,0xcd,0xac,0xd1,0x9c,0x21,0xcc,0x88,0xe7,0xa2,0x31,0xac,0x4d,0x4c,0xe9,0x61,0x95,0x20,0x8d,
+ 0x04,0x20,0xcd,0x37,0x83,0xfd,0x95,0x85,0xb7,0xcd,0x13,0xf0,0x9f,0x40,0xcb,0x4e,0xc4,0xd0,0x66,0x9a,0x05,0x1e,0x9f,0xfa,0xaf,0xd8,0xc2,0x7c,0xb0,0xe4,0x0a,0x4d,0x79,0x82,0x20,0x8d,
+ 0x04,0x20,0xcd,0x3f,0xe2,0x08,0x20,0x3e,0x05,0xe7,0x15,0x28,0x45,0x26,0xd0,0x79,0x98,0xbb,0x0a,0x31,0x4a,0x87,0x14,0x4f,0x33,0x3d,0x05,0x0d,0xb7,0x52,0xbb,0xed,0x48,0xf8,0x20,0x8d,
+ 0x04,0x20,0xcd,0x00,0xe9,0xd2,0x75,0xd3,0x4c,0x12,0xf5,0xd3,0xea,0xab,0x9f,0xf6,0x84,0x38,0x4f,0xd2,0x69,0x3f,0xd7,0x8a,0x65,0x9e,0x16,0xfb,0x98,0xad,0x87,0xf7,0x68,0x01,0x20,0x8d,
+ 0x04,0x20,0xcd,0x02,0xc4,0x66,0x6c,0x69,0x71,0xaa,0xc1,0xd6,0x83,0x1f,0x8c,0x86,0x13,0x2e,0x81,0xcd,0xa4,0xc0,0xcc,0x89,0x7f,0x65,0x77,0x72,0x8e,0x56,0x37,0x2c,0x46,0xe2,0x20,0x8d,
+ 0x04,0x20,0xcd,0x05,0xf9,0x38,0x37,0xf4,0xe6,0x9f,0xae,0x56,0x56,0xf5,0x10,0x12,0xe0,0x91,0x43,0x71,0x75,0x43,0xf0,0x36,0xbf,0x4c,0x7b,0xec,0xa3,0x0c,0xa9,0x3b,0x23,0x25,0x20,0x8d,
+ 0x04,0x20,0xcd,0x1a,0xc6,0xc7,0xe2,0xcc,0x6f,0x52,0xa4,0xd7,0x9d,0x55,0x65,0x7b,0x28,0x9a,0x3a,0xa9,0x2a,0xfc,0x2a,0x36,0x9e,0x0f,0x20,0x39,0xc6,0xb4,0x96,0x50,0x9e,0x7f,0x20,0x8d,
+ 0x04,0x20,0xcd,0x1c,0xc5,0xed,0x9b,0x48,0xd4,0xe3,0xf4,0x23,0x8d,0x8a,0x41,0x34,0x96,0xe9,0x78,0xc8,0xac,0x56,0x3b,0x0e,0xa6,0xf3,0xbe,0x84,0x81,0xfd,0x09,0xfa,0xff,0x1e,0x20,0x8d,
+ 0x04,0x20,0xcd,0x27,0x81,0xfd,0xf9,0x56,0x08,0x91,0x4e,0x28,0xc4,0x74,0xb8,0x2e,0x24,0xbe,0xc1,0x15,0x51,0xad,0x9c,0x86,0x97,0x6d,0x46,0xb6,0xa0,0x9e,0xd3,0x65,0x4f,0x69,0x20,0x8d,
+ 0x04,0x20,0xcd,0x32,0x35,0xfd,0xad,0x49,0xf1,0xe4,0x37,0x10,0xb4,0x85,0xd4,0x7c,0xa0,0x26,0x9b,0x12,0x19,0x9f,0xb3,0x71,0x19,0xb9,0x60,0xb9,0xd1,0xe7,0x22,0x85,0xc0,0xbe,0x20,0x8d,
+ 0x04,0x20,0xcd,0x74,0xda,0x48,0x97,0x08,0xa2,0xd1,0x06,0x93,0x58,0x9f,0x12,0x56,0xc7,0xa8,0x67,0x05,0xe2,0x28,0xdc,0xa6,0x9b,0x30,0xcb,0xd6,0xef,0xf2,0x8e,0x0a,0x60,0x09,0x20,0x8d,
+ 0x04,0x20,0xcd,0x7d,0xb3,0x91,0xc0,0xfa,0x65,0x3b,0x1e,0x1b,0xb1,0xb4,0xd4,0x05,0x0f,0xdf,0x83,0x6e,0x20,0x43,0xfa,0x5e,0x71,0x0b,0x1b,0x5a,0x36,0xda,0x4f,0xe6,0x7e,0x8c,0x20,0x8d,
+ 0x04,0x20,0xcd,0x42,0x7c,0x0a,0x83,0x79,0x97,0x11,0xa3,0x72,0x57,0xf0,0x8b,0x93,0xdc,0x22,0x9b,0x81,0xdb,0x39,0x44,0x85,0xc6,0xfa,0xec,0xbd,0x8e,0x1f,0xdf,0x18,0xc9,0x2a,0x20,0x8d,
+ 0x04,0x20,0xcd,0x4d,0x49,0xdb,0x54,0xfc,0xe9,0xc1,0xdf,0xf3,0xd7,0x56,0x43,0x1c,0x6f,0xf2,0x7a,0xde,0x72,0x9c,0xf7,0x18,0xc7,0x61,0xe0,0x2d,0xa5,0x30,0x61,0xfe,0x31,0x80,0x20,0x8d,
+ 0x04,0x20,0xcd,0x52,0xde,0xa6,0x42,0x6f,0xd2,0xd1,0x42,0x52,0xe7,0x28,0x7e,0xec,0xd5,0x47,0x83,0xc2,0x60,0x49,0x83,0xf9,0xa9,0xf9,0xf5,0xe7,0x83,0x28,0xfc,0xc8,0x69,0x3a,0x20,0x8d,
+ 0x04,0x20,0xcd,0x59,0x72,0xe3,0xb9,0xfb,0x6e,0x45,0x34,0xcb,0xab,0xc2,0x7f,0xc6,0xa4,0x73,0xde,0xac,0x56,0xb9,0xab,0x5f,0x6b,0xb9,0xba,0x51,0x94,0x47,0x80,0xad,0x87,0x10,0x20,0x8d,
+ 0x04,0x20,0xcd,0x5e,0x26,0x7c,0x84,0x61,0x6a,0xb5,0x2c,0xd0,0x43,0xb6,0x53,0x64,0x56,0x06,0xab,0x45,0x1b,0x6d,0xf8,0x80,0xea,0xf5,0x13,0x42,0xb7,0xe5,0x0e,0x80,0xf3,0x2a,0x20,0x8d,
+ 0x04,0x20,0xcd,0x72,0x88,0x95,0x5b,0x3f,0x0e,0xae,0xe9,0x3c,0xa6,0xbb,0xcc,0x69,0xaf,0xf5,0x49,0xab,0xce,0x63,0xd3,0x68,0x64,0x08,0x52,0x85,0xb4,0xb4,0x22,0xdf,0x04,0x18,0x20,0x8d,
+ 0x04,0x20,0xcd,0xb8,0xe5,0x99,0xf7,0xa2,0x53,0xe4,0x60,0x6a,0x61,0xe9,0x70,0xdf,0x7f,0x0f,0x75,0x2c,0x2f,0xa1,0x67,0x88,0xc0,0xe0,0x81,0x24,0xb1,0x22,0x3f,0x48,0x33,0x5f,0x20,0x8d,
+ 0x04,0x20,0xcd,0x82,0xd7,0x54,0xcf,0x77,0x21,0x74,0x0f,0x0b,0xa0,0x5e,0x38,0x9e,0xec,0xdf,0x27,0xad,0xa2,0xc0,0x6a,0x01,0x62,0xc8,0xe8,0x84,0x50,0xb9,0xce,0xd0,0x4b,0x5a,0x20,0x8d,
+ 0x04,0x20,0xcd,0x83,0x03,0x1f,0xab,0x27,0xf6,0x0a,0x44,0xac,0x0d,0x8b,0xd4,0x55,0x21,0xfe,0x04,0x46,0x59,0xa9,0x44,0x34,0x96,0xc3,0x92,0x86,0x7c,0x47,0xaf,0xf1,0x1c,0xc7,0x20,0x8d,
+ 0x04,0x20,0xcd,0x88,0x8c,0x73,0x8d,0x34,0x54,0x5c,0x9d,0xa0,0x74,0x1d,0x5d,0x95,0xcf,0xb4,0x07,0xba,0x1e,0xd2,0x23,0x79,0x5f,0x48,0x78,0x2e,0xf0,0xd6,0x1d,0x6f,0xa2,0xe9,0x20,0x8d,
+ 0x04,0x20,0xcd,0x8d,0xa1,0x56,0xaa,0x66,0xff,0x4d,0x1d,0x02,0xb0,0x52,0x09,0x43,0x23,0x80,0xce,0x20,0xae,0xd5,0x9e,0x65,0x45,0xb3,0x3c,0x53,0xc2,0x40,0x97,0xff,0x49,0xc8,0x20,0x8d,
+ 0x04,0x20,0xcd,0xa2,0xfd,0x28,0x3a,0x13,0xaa,0x18,0xc7,0x77,0x1e,0x74,0xfb,0xc7,0xc6,0x37,0x9a,0x36,0x9d,0xe2,0x31,0x6a,0x95,0x26,0x3c,0xd9,0x28,0x36,0xaf,0xa0,0x95,0xae,0x20,0x8d,
+ 0x04,0x20,0xcd,0xa4,0x07,0x96,0x32,0xbe,0x64,0xe6,0x49,0xd3,0xc7,0xbb,0xa4,0xa0,0xb6,0x42,0x3b,0xe9,0x4f,0xc5,0x37,0xc3,0x2d,0x0a,0x31,0xf0,0x5d,0x52,0x1f,0xae,0xf3,0x5e,0x20,0x8d,
+ 0x04,0x20,0xcd,0xa6,0x95,0x5f,0xa1,0x5e,0x65,0xc4,0x78,0x9f,0x3d,0x8a,0x42,0x28,0x56,0xa1,0x46,0xbd,0x2c,0x20,0xe2,0x7d,0xdd,0x73,0x73,0xaa,0x80,0x91,0x92,0x3d,0x43,0x86,0x20,0x8d,
+ 0x04,0x20,0xcd,0xa9,0xb2,0x3f,0x79,0x82,0x91,0xed,0x07,0xeb,0x1a,0x43,0x2b,0xab,0x83,0x67,0x22,0xb7,0xbd,0x57,0x7e,0x73,0x02,0xda,0x45,0xaa,0x9c,0x83,0xdd,0x73,0x66,0xf1,0x20,0x8d,
+ 0x04,0x20,0xcd,0xac,0xf0,0x95,0xf8,0x64,0xb2,0x26,0x2a,0xcb,0x2b,0xb3,0x95,0xeb,0xcc,0xf7,0xa3,0xe6,0xfe,0xf9,0x33,0x6d,0xe0,0xcb,0x8d,0x2e,0xdf,0x87,0xc0,0xfb,0xf6,0x01,0x20,0x8d,
+ 0x04,0x20,0xcd,0xf7,0xf2,0xdb,0xa1,0xe1,0x01,0x39,0xec,0x64,0x50,0x08,0x5a,0x37,0x6b,0x6f,0xbe,0x03,0x3e,0x7f,0x74,0x1c,0x12,0x00,0x55,0xc4,0x38,0xa2,0x52,0x21,0x4e,0xbc,0x20,0x8d,
+ 0x04,0x20,0xcd,0xc1,0x44,0x8d,0xf2,0xe8,0x89,0xeb,0x55,0x5e,0xc2,0x82,0x58,0x53,0x06,0x98,0x56,0x8e,0x10,0x55,0x7b,0x94,0x9f,0xbb,0x05,0xba,0x60,0x84,0x39,0xad,0xdd,0x36,0x20,0x8d,
+ 0x04,0x20,0xcd,0xc3,0x0d,0xab,0xe7,0xb4,0xac,0xed,0x17,0x7f,0xe0,0x0f,0x26,0x2c,0xca,0x78,0xd3,0xf4,0xd3,0xef,0xc6,0x0d,0x48,0xaa,0xb9,0x80,0x1c,0x7d,0xf6,0xac,0xba,0xc8,0x20,0x8d,
+ 0x04,0x20,0xcd,0xc5,0xa0,0xe6,0x90,0x1a,0x90,0xf7,0xde,0x67,0xb8,0x4d,0xf6,0xfc,0x9b,0x5e,0x5a,0x11,0x36,0xff,0xce,0x11,0x35,0x9e,0xd5,0x4d,0x24,0x1b,0x47,0xb5,0xde,0x9d,0x20,0x8d,
+ 0x04,0x20,0xcd,0xc4,0xdc,0xad,0xda,0x22,0x0c,0x54,0x1b,0xde,0xad,0xf1,0x7e,0x6f,0x2d,0x67,0xbc,0x0e,0xa3,0x88,0x25,0x10,0xe9,0x60,0x46,0x18,0xcd,0x91,0x94,0xbc,0xa9,0xdb,0x20,0x8d,
+ 0x04,0x20,0xcd,0xd5,0xc0,0xc2,0x24,0x19,0x37,0x36,0xac,0x3f,0xc3,0x12,0xb9,0x3b,0x14,0x78,0xb7,0xf8,0xea,0xb0,0x27,0xb9,0xf7,0x4e,0x3b,0x68,0xb3,0x06,0x18,0xa4,0x76,0x11,0x20,0x8d,
+ 0x04,0x20,0xcd,0xe0,0x37,0xd3,0x86,0x65,0x5b,0xda,0xe7,0x4a,0x1a,0xc7,0xe1,0x6a,0x56,0x80,0xf2,0xa6,0xd8,0xfa,0x16,0x6d,0x2b,0x77,0xb5,0xbe,0xf5,0xb7,0x46,0xb3,0x57,0x81,0x20,0x8d,
+ 0x04,0x20,0xcd,0xe0,0x4f,0x10,0xb0,0xe3,0x87,0x91,0xe9,0x95,0xc1,0x0c,0xb8,0x4d,0xda,0x11,0x4c,0x60,0x19,0xc8,0x11,0x85,0x55,0xd4,0x40,0xe3,0x2f,0x81,0x1b,0x9f,0x49,0x11,0x20,0x8d,
+ 0x04,0x20,0xcd,0xf2,0x5c,0xef,0x3c,0x68,0x43,0xfa,0x6d,0x05,0x15,0x74,0xfe,0xdc,0x8d,0xcb,0xc2,0xdc,0xd2,0x84,0xc9,0x16,0x10,0xa4,0x45,0x8b,0x28,0xfb,0xce,0x18,0x71,0xff,0x20,0x8d,
+ 0x04,0x20,0xcd,0xf3,0x03,0x96,0xc8,0xd9,0x86,0x72,0x52,0xec,0xc8,0x0c,0xfe,0x02,0xdc,0x02,0xa5,0xe1,0x21,0x1a,0x5a,0xd6,0x90,0x3c,0x55,0x81,0xe7,0x08,0xdd,0x6a,0x95,0xc6,0x20,0x8d,
+ 0x04,0x20,0xce,0x38,0x92,0x48,0xed,0x7d,0xf6,0x8d,0xd9,0x22,0x84,0x43,0xaf,0xc0,0x44,0x07,0x20,0x49,0xbc,0x99,0xf7,0x6c,0xf7,0x08,0x13,0xec,0xa0,0xd1,0x67,0x5c,0xb9,0x1d,0x20,0x8d,
+ 0x04,0x20,0xce,0x04,0x23,0x57,0x2e,0x51,0x1e,0xe6,0x93,0x7e,0xa2,0xe9,0xfe,0x2f,0xbc,0x00,0xf8,0x39,0xc2,0xbf,0x06,0x82,0x9c,0x8a,0xae,0x7a,0x7d,0x13,0x76,0xe7,0x08,0xbe,0x20,0x8d,
+ 0x04,0x20,0xce,0x07,0x94,0x38,0xe0,0x08,0x29,0x6c,0x04,0xe1,0x82,0x88,0x66,0xf0,0x7d,0x8f,0x35,0xdf,0x85,0x85,0x02,0x1b,0xbf,0x14,0x13,0x15,0xc6,0x14,0xe9,0xb6,0xee,0x5c,0x20,0x8d,
+ 0x04,0x20,0xce,0x09,0x32,0xa8,0x0d,0xba,0x04,0x57,0xfa,0x73,0xec,0xc8,0x65,0x5d,0x6a,0x76,0x7b,0x15,0xe9,0x1b,0xcc,0x85,0xe3,0xe3,0x10,0x46,0x40,0x7c,0x58,0x2a,0x99,0x32,0x20,0x8d,
+ 0x04,0x20,0xce,0x12,0x57,0x51,0x1b,0x3c,0x5f,0x2b,0x6c,0xae,0xe3,0xad,0x78,0xe6,0x62,0x59,0x4b,0x03,0xc7,0x5e,0xb0,0xc8,0x34,0x66,0xb9,0xed,0xea,0xb3,0x52,0x26,0x45,0xd1,0x20,0x8d,
+ 0x04,0x20,0xce,0x15,0x4e,0x05,0x5e,0x78,0xd0,0x55,0x83,0x5e,0x3e,0x18,0xf4,0x1b,0x13,0x5d,0xa5,0x7e,0x1e,0x60,0x48,0x9b,0xcd,0x9c,0xee,0x08,0xc3,0x1a,0xf2,0x65,0x72,0x6b,0x20,0x8d,
+ 0x04,0x20,0xce,0x17,0xc5,0x14,0x89,0x96,0xe7,0xca,0x90,0xb2,0xad,0x21,0x18,0x39,0xe1,0x75,0xe2,0xcc,0xce,0x94,0x6f,0xb4,0x94,0x09,0x5c,0xa1,0xf7,0x67,0xd3,0x8c,0xb7,0xc6,0x20,0x8d,
+ 0x04,0x20,0xce,0x1e,0x75,0x35,0x71,0xe3,0x8d,0x15,0x35,0x3d,0x9f,0xb9,0x0c,0x03,0x5c,0xf2,0x86,0x00,0x48,0xc8,0x8b,0x78,0x82,0x44,0x55,0x24,0x8c,0x68,0x3d,0x79,0xcd,0xe4,0x20,0x8d,
+ 0x04,0x20,0xce,0x22,0xe1,0xd1,0x91,0x35,0x4c,0xf4,0x34,0xf8,0x30,0x51,0xd6,0x39,0x6f,0x09,0xd7,0xe6,0x8c,0xb2,0xda,0xed,0x39,0xf7,0xaf,0xa3,0x07,0xeb,0x63,0xaa,0xfb,0x43,0x20,0x8d,
+ 0x04,0x20,0xce,0x2a,0x6a,0x31,0x5d,0x78,0x80,0xd3,0xf3,0x2a,0xde,0x7f,0xa3,0x2c,0x85,0xb9,0x82,0x3e,0x0d,0xf8,0x3c,0x83,0x9a,0xc1,0x72,0x7e,0x8d,0x27,0x82,0xdb,0xfa,0xe2,0x20,0x8d,
+ 0x04,0x20,0xce,0x30,0x42,0xaf,0xb4,0x6b,0x6d,0xf5,0xb6,0x29,0x59,0x8b,0x8a,0xb7,0x13,0xb7,0x11,0x8e,0x37,0x82,0xc7,0x42,0x19,0x69,0xb4,0x1a,0x4f,0xfb,0x3f,0xef,0x95,0x48,0x20,0x8d,
+ 0x04,0x20,0xce,0x5a,0xd3,0x42,0xc2,0x7f,0x8d,0xde,0xd9,0x49,0x37,0x75,0x1c,0x91,0xc6,0x56,0xca,0x21,0xbd,0xcf,0xc2,0xf7,0x97,0xc4,0xfa,0x2e,0x75,0xef,0x37,0x0a,0xaf,0x25,0x20,0x8d,
+ 0x04,0x20,0xce,0x5b,0x31,0x95,0xe2,0x0e,0xe4,0xf2,0xf5,0xe1,0xd9,0xb4,0x61,0x66,0xda,0x6a,0x58,0x7b,0x59,0x52,0x35,0xe7,0xb9,0xd8,0x39,0x49,0xc2,0x04,0x49,0x07,0x37,0xcf,0x20,0x8d,
+ 0x04,0x20,0xce,0x64,0x8f,0x86,0x34,0x2d,0xb0,0xb0,0xf7,0x56,0xd8,0x44,0x18,0x55,0xfd,0x4d,0xfd,0x58,0xa0,0x27,0xf1,0x88,0x88,0x17,0x1d,0x49,0xee,0xf4,0x1e,0x09,0x48,0x1d,0x20,0x8d,
+ 0x04,0x20,0xce,0x66,0x7c,0xfb,0x9c,0x38,0xd3,0x76,0xec,0x7d,0xe5,0xe2,0x52,0x7e,0x4d,0x6d,0x30,0x79,0x5f,0x42,0x35,0x31,0xc5,0x40,0x3e,0x1b,0xc5,0xda,0x7c,0x14,0x6f,0x56,0x20,0x8d,
+ 0x04,0x20,0xce,0x68,0x87,0xa5,0xc6,0x11,0x6b,0x2f,0xd3,0x05,0x39,0x4c,0x49,0x10,0xee,0x6f,0xaa,0x82,0x18,0xc0,0xdc,0x85,0xe1,0x7b,0x5e,0xeb,0x75,0xbe,0xbe,0x0c,0x55,0xb1,0x20,0x8d,
+ 0x04,0x20,0xce,0x68,0xbd,0x5e,0xb8,0x3c,0x2a,0x04,0xb4,0x7e,0xc9,0x65,0xa1,0xe5,0x69,0x73,0xdf,0x7e,0xae,0x4f,0xd5,0xe7,0xc8,0x00,0x7f,0xd7,0x7c,0xa7,0xde,0x35,0xdd,0xb3,0x20,0x8d,
+ 0x04,0x20,0xce,0x6f,0xc8,0xeb,0x11,0x55,0xe8,0xbd,0x28,0xda,0x72,0x5c,0x44,0x26,0xc2,0x26,0xe4,0xa5,0xaf,0x96,0x0a,0x94,0x9b,0x76,0xef,0x8c,0xa6,0xdd,0x3b,0x57,0xb7,0x9b,0x20,0x8d,
+ 0x04,0x20,0xce,0x70,0xfd,0x6a,0xfe,0x8e,0x33,0x84,0x37,0x9b,0x7a,0xe6,0xaa,0x3f,0xc9,0x52,0x3b,0x86,0x85,0xc7,0xf0,0xac,0xfa,0x0a,0x42,0xbf,0x41,0xb6,0x0f,0x53,0x73,0xa0,0x20,0x8d,
+ 0x04,0x20,0xce,0x73,0x9c,0xe7,0x39,0xe8,0x65,0xa8,0x35,0xc8,0x4d,0xd6,0x7b,0x8f,0x68,0x0d,0xd0,0xf0,0x24,0x92,0x33,0xe3,0x05,0xc6,0xf3,0x79,0x43,0x83,0x5b,0x99,0x10,0x0b,0x20,0x8d,
0x06,0x10,0xfc,0x32,0x17,0xea,0xe4,0x15,0xc3,0xbf,0x98,0x08,0x14,0x9d,0xb5,0xa2,0xc9,0xaa,0x20,0x8d,
0x06,0x10,0xfc,0xc7,0xbe,0x49,0xcc,0xd1,0xdc,0x91,0x31,0x25,0xf0,0xda,0x45,0x7d,0x08,0xce,0x20,0x8d,
0x06,0x10,0xfc,0xdc,0x73,0xae,0xb1,0xa9,0x1b,0xf8,0xd4,0xc2,0x08,0x11,0xa4,0xc7,0xc3,0x4e,0x20,0x8d,
};
static const uint8_t chainparams_seed_test[] = {
- 0x04,0x20,0xd7,0x13,0xfe,0x00,0xf0,0xf1,0x07,0xcb,0x30,0xb1,0x31,0xc7,0x68,0xbb,0x05,0xca,0x18,0xb5,0x1d,0xb1,0x0f,0xf2,0x7e,0x66,0xdb,0xaa,0xf4,0x05,0xaf,0x37,0x0a,0x62,0x47,0x9d,
- 0x04,0x20,0xd1,0x71,0xfe,0x4c,0x9e,0xe9,0x99,0xb1,0x6c,0xd5,0xdd,0x3a,0xc3,0xd8,0x74,0x1d,0x42,0x32,0x9f,0xca,0xe9,0x47,0x9e,0x18,0x74,0x43,0x22,0xb9,0xa5,0x31,0xb9,0x66,0x47,0x9d,
- 0x04,0x20,0xd2,0xe4,0xd1,0x40,0x65,0x5d,0x95,0xaf,0xe8,0x67,0xc0,0xe3,0x72,0xfd,0x0a,0x2e,0x35,0xb7,0xbd,0xac,0x67,0x78,0x36,0xe1,0xb8,0xba,0x30,0xcf,0x2e,0x05,0xdd,0x9d,0x47,0x9d,
- 0x04,0x20,0xde,0xdd,0xe8,0x01,0x03,0x98,0x3f,0x2d,0x3d,0x8b,0x99,0x27,0xea,0xe1,0xa3,0xde,0xff,0x50,0x30,0xc2,0x41,0x4e,0x7e,0x72,0x24,0x3d,0xad,0x78,0x3c,0xab,0x12,0x67,0x47,0x9d,
- 0x04,0x20,0xdb,0x9d,0xe0,0xc8,0x5d,0x65,0x4b,0xe0,0x7b,0x0f,0x63,0x80,0x85,0x21,0x73,0x07,0x94,0x0f,0xb0,0x23,0x38,0xec,0x78,0xb6,0x07,0xa1,0xd2,0xb0,0x82,0xf8,0x20,0xea,0x47,0x9d,
- 0x04,0x20,0xdb,0xc9,0xb2,0xe1,0x4b,0x43,0xf1,0xc9,0x3d,0xea,0x51,0x9a,0x71,0x6b,0x4a,0x15,0xe7,0x3e,0xfe,0x8b,0x24,0x7a,0xaa,0xff,0x53,0xf7,0xfc,0x10,0xc6,0xcc,0x14,0x88,0x47,0x9d,
- 0x04,0x20,0xe5,0x38,0xc1,0x67,0x52,0x2d,0x6f,0x2f,0xbe,0xc2,0xb3,0x45,0x2b,0x19,0x8c,0x10,0xf3,0x09,0xe5,0x37,0xfe,0x66,0x57,0x6f,0x7a,0x4d,0x78,0xf8,0x50,0x41,0xd6,0x90,0x47,0x9d,
- 0x04,0x20,0xed,0x76,0x8d,0x28,0xb0,0x44,0x2c,0xff,0xf4,0xd9,0x6a,0x5c,0xf9,0xca,0x5f,0x81,0xa2,0x23,0x48,0x82,0x24,0x2e,0xfc,0xbe,0x0a,0x1e,0xf9,0x02,0x43,0x31,0x37,0xf5,0x47,0x9d,
- 0x04,0x20,0xee,0x57,0x1b,0xab,0xd0,0xd7,0x27,0xca,0xe7,0xaa,0xe2,0x09,0xf3,0x4e,0x80,0x90,0xd2,0x0a,0x9d,0xc4,0x59,0xd0,0xdc,0xa1,0x97,0x09,0x4e,0x2f,0xfe,0x9f,0xa8,0x0a,0x47,0x9d,
- 0x04,0x20,0xf7,0xe5,0xb0,0x17,0xdc,0x21,0xed,0xfb,0xb6,0xf5,0xe6,0xb4,0x0b,0xb3,0xf3,0x6c,0xb8,0x3f,0x2a,0x93,0x89,0x66,0x2f,0x05,0x30,0xdf,0xfa,0xdf,0xf2,0x1b,0x52,0x78,0x47,0x9d,
- 0x04,0x20,0xf0,0x38,0xe6,0xe3,0xbb,0x4d,0x17,0x56,0xd0,0xae,0xf6,0xf4,0xa9,0x99,0x96,0xa9,0xe8,0xfc,0xfb,0x76,0x08,0xed,0x7f,0xb7,0xf0,0xa0,0xd3,0x8d,0xea,0x18,0x87,0x8c,0x47,0x9d,
- 0x04,0x20,0xf1,0x67,0x83,0x6d,0xa7,0x17,0xa6,0xdd,0x1f,0x19,0x5c,0xbd,0x92,0x8e,0x45,0x0c,0x5c,0x2c,0x9d,0x57,0x98,0xe1,0x46,0x40,0x3d,0x87,0x30,0x02,0x9f,0x1d,0x88,0xde,0x47,0x9d,
- 0x04,0x20,0xff,0x7b,0xca,0x5b,0xa3,0x4c,0x68,0x7d,0xf1,0x3d,0x18,0xef,0xb4,0x3e,0x39,0x34,0x0d,0x9c,0x3c,0x49,0x9b,0xe7,0x67,0x2c,0x78,0x61,0x42,0x67,0x62,0xd0,0x15,0xb5,0x47,0x9d,
- 0x04,0x20,0xff,0xbc,0xb7,0x65,0x60,0x0d,0xc1,0x04,0xbc,0x30,0x95,0x67,0xe9,0x37,0x62,0xf7,0x5b,0xe3,0x2a,0xd6,0x3b,0xaf,0x8a,0x98,0xc9,0xfb,0x4b,0x66,0xb2,0xdc,0x13,0xc0,0x47,0x9d,
- 0x04,0x20,0xf8,0x57,0x5e,0x80,0x2d,0xc4,0xc6,0x5e,0x7f,0x15,0x09,0xee,0xcc,0x29,0xf1,0x65,0x53,0x1c,0x41,0xc1,0xf7,0x51,0xa4,0xb0,0x76,0x86,0xe3,0x10,0x24,0x4d,0xd2,0x11,0x47,0x9d,
- 0x04,0x20,0xfd,0x74,0x90,0x71,0x06,0xbf,0x2b,0xdc,0x69,0x31,0xf2,0x63,0x1f,0x18,0x17,0x71,0xd2,0x75,0xe4,0xf5,0x35,0x89,0xc0,0x55,0x71,0x05,0xc4,0x77,0x64,0xbf,0x20,0x36,0x47,0x9d,
- 0x04,0x20,0xfe,0x4c,0x16,0x4f,0x37,0x75,0xb4,0xe2,0x54,0x7d,0x00,0x21,0x39,0x3a,0x2c,0xb7,0xe8,0x9a,0xf3,0x2f,0x8a,0xf6,0xe4,0x6b,0x7d,0xea,0x18,0xc3,0xc3,0x86,0x57,0xc5,0x47,0x9d,
- 0x04,0x20,0x00,0xe5,0x30,0x05,0x39,0xf9,0x05,0xac,0x6d,0x33,0xe5,0xb4,0x3a,0xd1,0x8c,0x75,0xb3,0x5f,0x9b,0xcc,0xd1,0x76,0xa0,0x24,0x84,0x49,0x4b,0x40,0x67,0xee,0x4d,0x93,0x47,0x9d,
- 0x04,0x20,0x01,0x25,0x8f,0x4c,0xb4,0x28,0x06,0xaa,0x4f,0xc5,0x5d,0x34,0x19,0x40,0xcd,0xb6,0xb9,0xad,0x52,0x3a,0xc3,0x52,0x05,0x9a,0x97,0x5e,0x69,0x9a,0x2a,0x66,0xde,0x48,0x47,0x9d,
- 0x04,0x20,0x02,0xee,0xed,0xe8,0x3d,0x20,0xd1,0xb0,0xb7,0x44,0xd6,0xb9,0x08,0x9b,0x13,0x35,0xee,0xf4,0x0b,0x8a,0x6e,0x10,0xfa,0xbc,0x75,0x14,0xcb,0x28,0xd4,0x40,0x44,0x3a,0x47,0x9d,
- 0x04,0x20,0x03,0x88,0x08,0xcf,0x7c,0xa3,0x1c,0xe6,0xd4,0x7a,0x50,0x61,0x1d,0x84,0x5c,0x95,0x89,0x4f,0x03,0x8c,0x91,0xf4,0x67,0xf2,0x4a,0xc4,0x2a,0x44,0x6e,0x47,0xc8,0xae,0x47,0x9d,
- 0x04,0x20,0x03,0xe3,0x9a,0xa7,0xe7,0x30,0xa7,0x21,0x93,0x8c,0x52,0x76,0x4b,0x43,0x7d,0x35,0x70,0xa9,0x3d,0x35,0x54,0x11,0x83,0x1b,0xe1,0x7b,0x6d,0xd9,0xaa,0xb2,0x26,0x9b,0x47,0x9d,
- 0x04,0x20,0x05,0x9e,0xaf,0x67,0x77,0x31,0xef,0xe7,0x65,0xd4,0x3b,0x86,0x2c,0x0c,0x10,0x9c,0x7d,0x4c,0xe4,0x2d,0xb7,0x05,0x12,0x51,0x17,0xfb,0x15,0x47,0xdd,0xd7,0x5b,0x0e,0x47,0x9d,
- 0x04,0x20,0x06,0x30,0xd8,0x03,0x34,0x16,0x0f,0xa4,0x8f,0xb1,0x21,0xc4,0x53,0x19,0x87,0xa3,0x60,0xf1,0xdb,0x2b,0x09,0xf2,0x18,0x1b,0x1e,0x5a,0x78,0x29,0xe7,0x4e,0x12,0x7e,0x47,0x9d,
- 0x04,0x20,0x0e,0x90,0xa0,0x77,0x60,0x80,0x95,0x5e,0x1a,0x5f,0xb3,0x1c,0x6d,0x87,0x11,0x20,0x35,0x52,0xe5,0x9d,0x7f,0xf0,0x4d,0xec,0x68,0x30,0xa4,0xca,0xd5,0xaf,0x0e,0x20,0x47,0x9d,
- 0x04,0x20,0x09,0x3f,0x9b,0xec,0xe7,0xf0,0xd6,0x03,0xba,0x2b,0xac,0xa3,0x13,0x41,0x9c,0x70,0x0e,0x58,0x9a,0x0c,0xd4,0xc3,0x66,0x84,0x7c,0xa7,0x76,0xd9,0xd3,0xa5,0xff,0xba,0x47,0x9d,
- 0x04,0x20,0x0a,0xe8,0xaf,0x6a,0xc9,0xd7,0x03,0x2a,0x8e,0xc7,0xe7,0xd9,0x47,0x77,0x87,0x3d,0xa4,0x09,0xa8,0xb3,0x44,0x2e,0x4a,0xcf,0xaa,0x08,0x3e,0x79,0x4d,0x2e,0x25,0xfd,0x47,0x9d,
- 0x04,0x20,0x0d,0x02,0xcf,0x15,0x0e,0x79,0x72,0xab,0xc2,0x25,0xbf,0xab,0x07,0xa1,0xc4,0xe8,0x0e,0xb3,0xe2,0x81,0xcf,0x7e,0xe3,0x4a,0x10,0xc7,0x0e,0x0e,0xbd,0xad,0x32,0x20,0x47,0x9d,
- 0x04,0x20,0x1e,0xc5,0x90,0x07,0x29,0x4f,0x7e,0xb3,0x46,0x51,0xe9,0x81,0x65,0x24,0x7f,0xae,0xcd,0x96,0xc6,0x00,0xfe,0x70,0x8c,0xc1,0x8a,0xe2,0xe3,0x80,0x48,0x40,0xab,0x10,0x47,0x9d,
- 0x04,0x20,0x18,0xd3,0xc1,0x52,0xa1,0xde,0xaa,0x4e,0x88,0xf3,0x7f,0x92,0x09,0xcc,0x43,0x6b,0x59,0x76,0x3d,0xce,0x2a,0x66,0x7c,0xa3,0xf3,0x39,0xaf,0x73,0xcf,0xf8,0x83,0x89,0x47,0x9d,
- 0x04,0x20,0x1c,0x0e,0x75,0xca,0x45,0xb3,0x0f,0xb3,0x7b,0x27,0xb5,0xde,0x22,0x86,0xde,0xe5,0xf3,0xd8,0x95,0x0a,0x11,0x96,0x86,0x84,0xee,0xbd,0x7a,0x04,0xd7,0x90,0xca,0x04,0x47,0x9d,
- 0x04,0x20,0x1c,0x66,0x71,0x60,0x3c,0xbf,0x22,0x32,0x91,0x56,0xe9,0xbf,0x74,0xb8,0xd7,0x47,0xc1,0x07,0x2e,0x88,0x59,0xa8,0xb0,0x9a,0xd5,0x93,0x09,0xb6,0xdb,0x6e,0x40,0x6a,0x47,0x9d,
- 0x04,0x20,0x1d,0x83,0xcf,0x89,0x90,0x06,0xa6,0x97,0xb2,0xa9,0x01,0x01,0x1f,0x98,0x62,0x04,0x65,0xa5,0x93,0x3e,0x6a,0x08,0x53,0xa3,0x90,0x2e,0xb5,0x02,0x1e,0x78,0x98,0x3d,0x47,0x9d,
- 0x04,0x20,0x27,0xe6,0xa8,0x97,0xbc,0x69,0xb7,0x0e,0xd4,0x4d,0xe9,0x9b,0xff,0xe6,0xc9,0xb3,0x3f,0xc5,0xa8,0xa0,0xaf,0x19,0x61,0xd2,0xfb,0x7d,0x5c,0xdf,0x62,0xb0,0x36,0xe6,0x47,0x9d,
- 0x04,0x20,0x24,0xe9,0x86,0x63,0x9f,0x96,0xe1,0x42,0x3e,0xa3,0x03,0x9d,0xfd,0x23,0xa4,0xeb,0x05,0xfa,0x3a,0xb1,0xcd,0x3a,0xce,0x24,0xbd,0x87,0x99,0x65,0xd9,0x19,0x75,0xf1,0x47,0x9d,
- 0x04,0x20,0x28,0x50,0xc2,0x49,0xb8,0x3e,0x68,0x10,0xe6,0x02,0xdd,0x01,0x42,0xe5,0x41,0xc1,0x58,0xd5,0x5e,0xb8,0x7b,0xae,0x0a,0x90,0x14,0x0f,0xe3,0x97,0xe4,0xfa,0x2b,0xaf,0x47,0x9d,
- 0x04,0x20,0x2e,0x43,0x1b,0x30,0xd6,0x62,0x9d,0xf8,0x50,0x8b,0x89,0xcb,0x49,0x2a,0x7b,0x42,0x40,0x10,0x0b,0xfe,0xcd,0xfe,0x6e,0xe8,0x65,0x89,0x2a,0xc3,0x8d,0x49,0xf2,0x2a,0x47,0x9d,
+ 0x05,0x20,0xd6,0x21,0xcb,0x8a,0xd9,0xa8,0x74,0xa9,0xe0,0x48,0xea,0xde,0xc0,0xea,0x1b,0x6a,0xfd,0x08,0x62,0xc1,0xfb,0x62,0x5f,0x15,0x42,0x99,0xce,0x0f,0xaf,0x73,0x59,0x35,0x00,0x00,
+ 0x05,0x20,0xe1,0xbb,0x4a,0x85,0x55,0x47,0x4b,0x5c,0x0d,0x13,0x22,0xab,0x90,0x25,0x63,0x9e,0x4d,0x48,0xba,0x30,0x4d,0x1f,0x4b,0x4d,0x98,0x64,0x52,0xb7,0x43,0xc2,0x4b,0x3b,0x00,0x00,
+ 0x05,0x20,0x2e,0xed,0xf9,0x38,0x8f,0x96,0x3e,0x98,0x58,0xbf,0x1a,0xdd,0xc8,0xbb,0x50,0x56,0x00,0xf3,0x69,0x71,0x0e,0x86,0xa5,0x56,0xc5,0xb5,0x30,0xc3,0x02,0x15,0x5a,0x60,0x00,0x00,
+ 0x05,0x20,0x6c,0x7e,0xd7,0x65,0x61,0xef,0x2f,0x5d,0xbb,0x26,0xe2,0xa5,0x51,0x47,0x6e,0x2e,0x4b,0x62,0x92,0x83,0xd3,0x7f,0x74,0x27,0x16,0xac,0xf5,0xa4,0x5f,0x20,0x5f,0xe0,0x00,0x00,
+ 0x05,0x20,0x77,0x93,0xb0,0xef,0x61,0xae,0xbd,0x59,0x9d,0xd0,0xca,0x71,0xb3,0xfc,0x1b,0x84,0xa9,0x00,0xcc,0x24,0xdd,0x16,0x04,0xb1,0x39,0x92,0xf9,0xba,0x82,0x18,0x41,0x31,0x00,0x00,
+ 0x05,0x20,0x70,0xa0,0x87,0x84,0x37,0xbf,0x1e,0x07,0x3c,0xca,0x50,0x5a,0x9d,0x6f,0x88,0x27,0xdc,0xfc,0xc6,0x62,0x07,0x4d,0x34,0x5a,0x3e,0x70,0xc1,0xb3,0xef,0x51,0xc9,0xa4,0x00,0x00,
+ 0x05,0x20,0x8e,0xb2,0x37,0xa8,0x52,0x59,0x7e,0x4e,0x4f,0x45,0x61,0x97,0x4e,0x76,0xe7,0x2d,0xbb,0x93,0x51,0xf3,0x38,0xcf,0xd7,0x88,0x96,0x1b,0xbc,0x90,0x26,0x8c,0xa9,0x06,0x00,0x00,
+ 0x05,0x20,0xb9,0x85,0x34,0xf2,0x44,0x76,0xdc,0x59,0x4d,0x18,0x63,0xb0,0x4a,0x66,0x1f,0xe0,0x6a,0x31,0xc4,0x31,0xf2,0x66,0x80,0x78,0x91,0x70,0xd6,0x5e,0xd4,0x1b,0x16,0x7a,0x00,0x00,
+ 0x05,0x20,0xc7,0x49,0xe0,0x43,0x3c,0x4a,0x92,0x97,0x11,0x0f,0x75,0xed,0x48,0xe4,0x5a,0x4c,0x4b,0x5f,0x21,0x75,0x28,0x47,0x06,0x26,0x0a,0xef,0xf8,0xc0,0x04,0x1d,0xa0,0x22,0x00,0x00,
+ 0x05,0x20,0xc1,0x36,0x04,0xd7,0x53,0x33,0xe1,0xf4,0xd6,0xb9,0xcb,0x7b,0x6b,0x86,0x6c,0x1e,0xe7,0x72,0x57,0x60,0xbc,0x86,0xb0,0x74,0x2a,0x7b,0x82,0x44,0x58,0x42,0xc2,0x53,0x00,0x00,
+ 0x04,0x20,0xfb,0xcf,0xf6,0x44,0x5a,0xe4,0xc9,0xdf,0xb2,0xaf,0x78,0x12,0x55,0x15,0x3c,0x62,0xbf,0x9a,0x67,0x93,0x25,0x15,0x86,0x4f,0x76,0x33,0xc6,0xfb,0x7a,0xaf,0x68,0xc8,0x47,0x9d,
+ 0x04,0x20,0x0a,0xb2,0xef,0xb1,0xf7,0xa0,0x23,0xf8,0x9e,0x41,0x45,0x86,0x0b,0xc0,0x58,0x62,0x2e,0x08,0x88,0x23,0x60,0x77,0x21,0x82,0x13,0xaf,0xb0,0x1d,0x4a,0xb0,0x9c,0xf3,0x47,0x9d,
+ 0x04,0x20,0x1f,0xb7,0x52,0xf3,0xb3,0x07,0x04,0x78,0x92,0xcd,0x8d,0x31,0x5c,0x3d,0x9f,0xc0,0x4b,0x79,0xd2,0x7b,0xd7,0xc5,0x19,0xc3,0xd0,0x2e,0x23,0x51,0x5a,0xfc,0xdf,0x22,0x47,0x9d,
+ 0x04,0x20,0x21,0x60,0x5b,0x7a,0xa9,0x87,0xcc,0xf3,0x60,0xee,0x95,0x37,0x02,0xeb,0x87,0x94,0x8f,0x77,0x84,0xe0,0xc7,0x35,0xe1,0x0a,0x46,0xcf,0x78,0xa2,0x63,0x82,0xad,0xa8,0x47,0x9d,
0x04,0x20,0x36,0x3c,0xd4,0x1f,0x8f,0x63,0xfa,0x49,0x62,0xb5,0x69,0xd6,0x9f,0x42,0xaa,0xfe,0x54,0x14,0xd1,0xd2,0xb2,0xae,0x52,0xe1,0x08,0x7e,0xc6,0x15,0x56,0x45,0xbd,0xb3,0x47,0x9d,
- 0x04,0x20,0x38,0x3d,0xac,0xa2,0x19,0x80,0xdc,0x61,0xff,0xb9,0x37,0xd6,0x53,0xf0,0xb0,0x89,0xb6,0x14,0x33,0x62,0x7c,0x33,0x8a,0x3d,0xdc,0xdd,0xba,0xfb,0x70,0xa4,0x6f,0x9b,0x47,0x9d,
- 0x04,0x20,0x38,0x04,0x94,0x99,0x3a,0x60,0x61,0x08,0xcc,0xf9,0x43,0x18,0x8f,0x01,0xb5,0x43,0x7e,0x35,0xa5,0x27,0x2a,0xf6,0x85,0x78,0x81,0x36,0xed,0xb6,0xb0,0xd2,0xac,0x77,0x47,0x9d,
- 0x04,0x20,0x38,0x54,0xfe,0xde,0xcf,0x83,0xb9,0x06,0x7f,0xaa,0x79,0x96,0x58,0x89,0x78,0x45,0x29,0x51,0x9a,0xbf,0x64,0xd1,0x02,0xe2,0x5f,0x74,0x15,0x2e,0x0d,0x8f,0x81,0x9e,0x47,0x9d,
- 0x04,0x20,0x3c,0x0c,0xec,0x7b,0x47,0x74,0x12,0xcc,0xef,0xe1,0x88,0xcb,0x57,0x11,0xd5,0xd8,0x91,0x7e,0x95,0x17,0x0c,0x12,0xe2,0x46,0x7c,0xc0,0xe3,0xe3,0x92,0x26,0xeb,0x85,0x47,0x9d,
- 0x04,0x20,0x3d,0x42,0xc6,0x66,0xb0,0x8b,0xcc,0xf9,0x6a,0xfd,0xa7,0x10,0xfe,0x2a,0x45,0xd9,0x3a,0xcd,0x15,0xa4,0x00,0xbf,0xde,0x1a,0x6d,0x3a,0x5b,0xa8,0xc8,0x95,0x6a,0x3c,0x47,0x9d,
- 0x04,0x20,0x3d,0xb7,0x5c,0xbf,0x7a,0xb7,0x0f,0xe3,0x21,0xeb,0xa1,0x3c,0x8b,0xf3,0x9d,0x72,0x3d,0x69,0xfc,0xcc,0x22,0xa5,0x1c,0xb4,0x3f,0x98,0xcb,0x63,0xa8,0xc8,0x9f,0xcc,0x47,0x9d,
- 0x04,0x20,0x40,0xc7,0x1f,0x78,0x96,0x51,0xc8,0xd4,0x54,0x0f,0x32,0x00,0xda,0x0d,0x2a,0xb4,0x04,0xff,0x0e,0xf3,0x94,0x8d,0xf4,0x5e,0x23,0x74,0xfa,0x0c,0xfa,0x87,0xfb,0x3b,0x47,0x9d,
- 0x04,0x20,0x43,0x30,0x0d,0xf9,0x04,0xba,0x10,0x88,0x45,0x56,0xa5,0xee,0x22,0x1d,0xb5,0xe2,0x8d,0xd9,0x1e,0x68,0x8d,0x87,0xaa,0x9b,0x82,0x6a,0x71,0xe5,0x95,0x2b,0x79,0xf6,0x47,0x9d,
- 0x04,0x20,0x45,0x0e,0x7a,0x38,0x4d,0x97,0xc8,0xd9,0xc7,0x2b,0xbc,0xae,0xa9,0xe3,0x3a,0x40,0x65,0xf3,0xc0,0xc8,0x31,0xab,0xe9,0x02,0x99,0x82,0xb2,0xa0,0x79,0x60,0x92,0xed,0x47,0x9d,
- 0x04,0x20,0x4a,0x3b,0x66,0x48,0xee,0x55,0x05,0xed,0x91,0x14,0x5e,0x57,0x64,0xeb,0x23,0xab,0x56,0x83,0x56,0x36,0x2d,0x6a,0x2f,0xf8,0x28,0x11,0x37,0x3a,0x73,0x76,0x2e,0x6a,0x47,0x9d,
+ 0x04,0x20,0x3d,0x90,0xfc,0xa1,0xd3,0x12,0xee,0x6d,0xac,0x83,0x6f,0x70,0x9e,0xa7,0xcd,0xf3,0xd5,0x13,0x35,0x8b,0x54,0x9d,0x9c,0xae,0x33,0x5b,0x56,0xf3,0x52,0xa8,0xbb,0xaf,0x47,0x9d,
+ 0x04,0x20,0x47,0x4c,0xf3,0xdb,0x43,0xd6,0xb9,0x36,0xa2,0x0a,0x49,0x03,0x71,0xdb,0x3d,0xc1,0x82,0x17,0x74,0xc2,0xa4,0x8e,0xec,0x12,0xb5,0xfd,0xfe,0xee,0x77,0x81,0xf4,0x17,0x47,0x9d,
+ 0x04,0x20,0x43,0xc3,0x99,0x69,0x61,0x27,0xd6,0x00,0xea,0xe0,0x42,0xaa,0xa1,0xaa,0xd7,0x40,0x1b,0xe9,0xed,0xa0,0x50,0x1c,0xb9,0xd8,0x32,0x3b,0xc9,0x50,0xcb,0x23,0xab,0xb1,0x47,0x9d,
0x04,0x20,0x4a,0x4b,0x4c,0x27,0xea,0x89,0xb2,0xa6,0x3e,0xf5,0x6e,0xc3,0xa4,0xe8,0xf6,0x5e,0x54,0xcc,0x93,0x64,0xce,0x36,0x82,0xd9,0x5f,0x1b,0x65,0x6b,0x02,0xc6,0x66,0x60,0x47,0x9d,
- 0x04,0x20,0x4b,0x74,0xfe,0x48,0xc5,0x79,0xd5,0x77,0xba,0xdf,0x52,0x63,0x40,0xc4,0x30,0x04,0xff,0xf5,0x29,0x01,0xcc,0x15,0x5a,0x58,0xf7,0xc0,0x16,0x28,0x83,0x36,0x60,0xa0,0x47,0x9d,
- 0x04,0x20,0x4c,0x6a,0x4c,0x67,0x94,0x97,0xa4,0xe3,0x78,0x9e,0x16,0x65,0x58,0xf5,0x95,0xa9,0xcd,0x94,0x9a,0xbc,0x40,0xc2,0x4e,0x20,0x71,0x72,0xd9,0x02,0x50,0x75,0x9f,0x41,0x47,0x9d,
- 0x04,0x20,0x4c,0x85,0xc2,0xc6,0xb5,0x6a,0xf4,0x3d,0x84,0xf9,0xc3,0x8b,0x21,0x7f,0x57,0x7e,0x66,0x66,0x6b,0x6d,0x5f,0x0a,0xd0,0xf0,0x76,0x56,0x65,0x78,0xf8,0xa7,0x42,0x75,0x47,0x9d,
- 0x04,0x20,0x52,0xf0,0xcb,0x8e,0xa9,0x27,0xd4,0x21,0x57,0x73,0xcb,0x40,0x17,0x6e,0x83,0x73,0xe4,0x59,0xa9,0x89,0x23,0x14,0x14,0x6a,0x91,0x85,0xd2,0xce,0x1c,0x85,0x05,0x06,0x47,0x9d,
- 0x04,0x20,0x55,0x93,0x75,0x82,0x96,0x4c,0xc8,0x24,0x96,0x48,0xb3,0x9e,0x15,0xf5,0xf5,0x6f,0x5b,0xec,0xf6,0x39,0xff,0xa8,0xaf,0x3a,0x4c,0x5d,0x22,0x3d,0xd3,0x14,0xc3,0x05,0x47,0x9d,
- 0x04,0x20,0x58,0xbf,0x47,0xe7,0x52,0x8d,0xb5,0x83,0xbc,0x55,0xb1,0xb8,0x02,0xe3,0xdc,0xc2,0xc4,0xe7,0x79,0x85,0xb2,0xe7,0x38,0x27,0xae,0xad,0x0c,0xb8,0x34,0xed,0x71,0xde,0x47,0x9d,
- 0x04,0x20,0x59,0x76,0xc7,0xdc,0xb8,0x4d,0x1d,0x51,0x40,0x75,0x43,0x57,0xdd,0x3e,0xa3,0x63,0x06,0x0f,0x5e,0x18,0x29,0x10,0x08,0xac,0xa0,0x60,0xd2,0xf3,0x63,0x6e,0xa6,0x58,0x47,0x9d,
- 0x04,0x20,0x60,0xbe,0xae,0x7d,0xa3,0x4d,0x6a,0x71,0x1a,0x5d,0xe5,0x98,0x9c,0xde,0xa0,0x99,0x39,0x19,0xd3,0x01,0x0a,0x5d,0x1c,0x21,0x43,0x94,0x92,0x71,0x5d,0x77,0xd7,0xdf,0x47,0x9d,
- 0x04,0x20,0x62,0x42,0x6d,0x98,0xc4,0xa1,0x16,0xc1,0x7d,0x17,0x9e,0x37,0x94,0x88,0x58,0x76,0xa9,0x13,0x6a,0x98,0x39,0x22,0x58,0x13,0xf8,0x9a,0x99,0xa2,0x25,0x56,0x59,0x05,0x47,0x9d,
- 0x04,0x20,0x6a,0xb1,0x07,0x66,0xbe,0x50,0xec,0x8e,0x6b,0x72,0xfc,0xb4,0xc2,0x67,0x26,0xa1,0x7a,0x10,0x15,0xd3,0xd0,0x36,0x7a,0xf0,0x83,0xd0,0xc3,0x59,0x85,0x68,0x90,0xd8,0x47,0x9d,
- 0x04,0x20,0x6d,0x6b,0x07,0x72,0xf7,0x45,0x8c,0x1d,0xe3,0x5c,0xf2,0x58,0x20,0xd2,0x95,0x25,0x22,0x51,0xc3,0x59,0x96,0xc1,0xdc,0x7e,0xa4,0x82,0x89,0x0a,0xf5,0x25,0x38,0x1a,0x47,0x9d,
- 0x04,0x20,0x77,0xaa,0x57,0x56,0x17,0xce,0xdd,0x79,0x64,0xaf,0x78,0xb2,0xf4,0x91,0x36,0x75,0x1c,0x1c,0xcd,0x31,0x35,0x4a,0xe4,0x8b,0x64,0x65,0x4e,0x06,0xec,0x2a,0xc4,0x95,0x47,0x9d,
- 0x04,0x20,0x70,0x11,0x6d,0x2d,0xa7,0xc9,0x9f,0xd8,0xe3,0xe8,0xae,0x5a,0x4a,0x50,0xac,0x3f,0xd6,0x57,0xad,0xd0,0xa5,0x35,0x14,0xd7,0xb1,0x76,0x58,0xb0,0x90,0xa4,0x1c,0x9b,0x47,0x9d,
- 0x04,0x20,0x72,0xdb,0xfc,0x04,0x48,0xee,0xec,0xae,0x1b,0xad,0xe6,0x9a,0x87,0xe1,0x17,0xae,0x13,0x70,0xae,0x83,0x90,0x62,0x59,0x30,0xed,0x44,0x43,0xe9,0xab,0xee,0xaa,0xd0,0x47,0x9d,
- 0x04,0x20,0x74,0xd8,0x56,0x9c,0x5e,0xb4,0x62,0x12,0xea,0x6f,0x1e,0x3d,0x95,0x22,0x50,0x16,0xe3,0xba,0x45,0xb2,0xa3,0xad,0x26,0xb0,0x13,0x74,0xdd,0xec,0x22,0xe0,0x70,0x9a,0x47,0x9d,
- 0x04,0x20,0x75,0x45,0xe9,0x01,0x21,0x81,0x44,0x1b,0x57,0x76,0x8c,0x3f,0x85,0xa9,0x74,0xf4,0x3c,0xf8,0xd5,0x12,0xcf,0x13,0x1e,0x2f,0x18,0x13,0x78,0xa3,0x51,0x59,0x49,0x49,0x47,0x9d,
- 0x04,0x20,0x7b,0x3b,0xf1,0xa0,0x78,0xc9,0xba,0xb4,0xd2,0xad,0xed,0x0b,0x1e,0xd2,0x8d,0xd2,0x08,0xd1,0x51,0x5b,0x01,0x74,0x6c,0xc0,0x5d,0xcd,0x4c,0x53,0xf3,0xba,0x16,0xe3,0x47,0x9d,
- 0x04,0x20,0x7b,0x11,0x26,0x1d,0xf6,0xa1,0xb7,0xc3,0x36,0x19,0x0d,0x27,0x10,0x36,0xb7,0xd5,0x93,0x60,0xc8,0xf8,0x82,0x79,0x46,0xe8,0x78,0xce,0x29,0x50,0x2b,0x44,0x3f,0x7a,0x47,0x9d,
- 0x04,0x20,0x7b,0x96,0x08,0xa2,0x54,0x5c,0xd0,0x94,0x9c,0x0a,0xa7,0xb3,0xea,0x7d,0x38,0x0b,0x8e,0xee,0x91,0xe3,0x91,0xb9,0xc9,0xcc,0x81,0x28,0x2e,0xc3,0x02,0x9a,0xcf,0x65,0x47,0x9d,
- 0x04,0x20,0x81,0x34,0x90,0x93,0x9c,0xf9,0xc9,0xe7,0x81,0xa5,0xab,0xf1,0x03,0xe1,0xb3,0x2f,0xf7,0xcf,0x19,0x94,0x2f,0x7a,0x1b,0xc5,0x83,0xc9,0x8c,0xc3,0x5b,0x09,0x96,0x14,0x47,0x9d,
- 0x04,0x20,0x86,0x7d,0x81,0xf5,0x72,0x30,0xc0,0x91,0x4c,0x8e,0x04,0x48,0x47,0xce,0xcd,0x43,0xef,0x22,0x67,0x17,0xea,0x95,0x2f,0x51,0x4f,0x57,0x67,0x58,0x21,0xa5,0x2e,0x68,0x47,0x9d,
- 0x04,0x20,0x8b,0xfc,0xf6,0xec,0x3b,0x71,0x25,0x88,0xe8,0xc8,0x72,0xc3,0x89,0x05,0x27,0x81,0x28,0x6b,0xb6,0x72,0xa7,0xc5,0x16,0xaa,0x67,0xe6,0x37,0xb7,0x2b,0x99,0xa8,0x97,0x47,0x9d,
- 0x04,0x20,0xa2,0x46,0x23,0xd2,0xdb,0x3e,0x7a,0x65,0x05,0xd4,0x45,0x78,0xff,0x3e,0xc1,0x28,0xdb,0xfa,0xf1,0x5e,0x32,0xe9,0x6a,0x8f,0x96,0x45,0x15,0x01,0x7f,0x1f,0x75,0xbf,0x47,0x9d,
- 0x04,0x20,0xa8,0xa6,0xbb,0x02,0x06,0x65,0x3b,0xb2,0x52,0x79,0xd1,0xc9,0x6a,0x01,0x42,0x43,0xca,0x69,0xe1,0x69,0x90,0xfe,0x2c,0xd2,0x7c,0x18,0xfd,0xab,0xc7,0x71,0x7f,0x8b,0x47,0x9d,
- 0x04,0x20,0xa9,0x7b,0x48,0xf7,0x73,0xcb,0x07,0x37,0x4e,0xaa,0x68,0xc4,0x67,0x08,0xea,0x5b,0x68,0x0a,0xfe,0x14,0x82,0x6a,0xa1,0x79,0x82,0x9c,0x0b,0x52,0x17,0xd6,0x6b,0x1b,0x47,0x9d,
- 0x04,0x20,0xb3,0x6e,0x64,0x99,0x26,0x7a,0xeb,0xd4,0x53,0x8c,0x94,0xb1,0x4a,0x37,0x02,0xaa,0xa9,0xc8,0x36,0x11,0xec,0xf9,0x0f,0x08,0xa3,0x9f,0x3e,0xaf,0xd2,0xd1,0x2a,0x0b,0x47,0x9d,
- 0x04,0x20,0xb3,0xd4,0x15,0x0e,0x3f,0x12,0xed,0xfc,0xab,0x69,0x55,0x91,0x45,0xcf,0xc1,0x2f,0x35,0xa4,0xf7,0x94,0xff,0xd8,0xbe,0x44,0xc8,0x36,0xaf,0x0f,0xa0,0x4e,0x36,0x22,0x47,0x9d,
- 0x04,0x20,0xb6,0x5e,0x39,0xeb,0x93,0x18,0x22,0xad,0x78,0x94,0x34,0x48,0x31,0x8d,0xd1,0x42,0xb7,0x38,0x58,0x49,0xea,0x00,0xb9,0xcf,0x58,0x43,0x38,0x22,0x22,0x88,0x87,0xde,0x47,0x9d,
- 0x04,0x20,0xb9,0x80,0xf6,0xa1,0x4a,0x0a,0xc6,0xe3,0x19,0x27,0xe9,0x2d,0x75,0x60,0x14,0x3d,0x2c,0xda,0x97,0x77,0x54,0x9f,0x78,0xb8,0x9b,0x72,0x6a,0x58,0xab,0x8b,0x95,0x95,0x47,0x9d,
- 0x04,0x20,0xba,0xab,0x91,0x9c,0x48,0x8b,0x9b,0x34,0x5c,0x30,0xf3,0xd2,0x78,0xd3,0xbf,0x09,0x79,0x23,0x4e,0x18,0x5d,0x5e,0x75,0x6b,0xa2,0x91,0x63,0x2c,0x75,0xfd,0x06,0x36,0x47,0x9d,
- 0x04,0x20,0xbb,0x50,0xf0,0x50,0x8d,0xb7,0x6c,0xd4,0x87,0x59,0x0d,0xfd,0x5f,0x51,0x86,0xa8,0x43,0xb3,0x7a,0xe7,0x2f,0x54,0x97,0x7d,0xed,0xc3,0x7b,0x31,0xe6,0xb9,0x05,0xe7,0x47,0x9d,
- 0x04,0x20,0xc0,0xc1,0xf5,0x59,0xe8,0x46,0xf6,0x9d,0x41,0xf0,0xde,0x8b,0x32,0xf9,0x6f,0xd6,0xb2,0xd5,0x36,0x56,0x43,0xd3,0x60,0x08,0x55,0x94,0x13,0xf5,0xef,0x7f,0x4d,0x4a,0x47,0x9d,
- 0x04,0x20,0xce,0xd3,0xd2,0xba,0x56,0xa1,0xde,0xc9,0xc4,0xdb,0x50,0x7b,0xe9,0x4d,0x59,0x65,0x1c,0x02,0x4a,0xa3,0xea,0x73,0xb2,0x66,0x70,0xe7,0x85,0xc1,0x20,0x60,0x79,0x96,0x47,0x9d,
+ 0x04,0x20,0x4b,0x5e,0x72,0xcc,0x87,0x51,0x65,0x3b,0x05,0x4e,0xdf,0x10,0x3b,0xad,0xee,0xe9,0x47,0x6f,0x2e,0x2e,0x62,0x98,0x4a,0x2a,0xe7,0xdd,0xc4,0xb9,0x9d,0x72,0x99,0x0e,0x47,0x9d,
+ 0x04,0x20,0x4c,0x4e,0xfb,0x40,0x07,0x4c,0x53,0xfe,0x9a,0x61,0xf9,0xa7,0xad,0x92,0xa4,0xf7,0x6f,0xf0,0x84,0x16,0xc7,0xd3,0xc2,0x0c,0xec,0x30,0x5d,0xd6,0xa7,0x4c,0x50,0x08,0x47,0x9d,
+ 0x04,0x20,0x4d,0x1b,0xe3,0x0d,0x81,0x30,0x25,0x1e,0xfc,0x27,0x8f,0x33,0x2d,0x8c,0xa7,0x17,0x9f,0x97,0x82,0xda,0xfb,0x60,0x1e,0x0c,0x03,0x08,0x11,0xfc,0x44,0x30,0xef,0x73,0x47,0x9d,
+ 0x04,0x20,0x77,0x75,0x8f,0x94,0x03,0x9d,0x03,0x1e,0x4e,0x90,0x3a,0x2f,0xec,0x32,0x28,0x6e,0xe1,0x96,0xfe,0x81,0x3f,0x66,0x4b,0x52,0x84,0x3d,0xbb,0x6b,0x88,0x2d,0x2a,0x7d,0x47,0x9d,
+ 0x04,0x20,0x8a,0x0c,0x56,0x6d,0x2e,0x41,0x7a,0xb9,0x2f,0xe1,0xfe,0x23,0xe1,0xf8,0x55,0x18,0xe8,0xa0,0x5b,0x0a,0x67,0xd4,0x63,0x53,0x25,0xb2,0x3c,0x37,0xac,0x4a,0xc6,0x7d,0x47,0x9d,
+ 0x04,0x20,0x9f,0x87,0xe2,0x3c,0x3d,0x10,0x82,0xee,0x13,0xde,0x40,0x00,0xda,0x2a,0x20,0xbb,0xd2,0xc8,0x22,0x12,0xcf,0x9e,0xe4,0xf6,0x95,0xbd,0x34,0xeb,0x35,0xa7,0x11,0xa9,0x47,0x9d,
+ 0x04,0x20,0x99,0x25,0x3d,0x55,0xd9,0x5d,0xcb,0x96,0xb0,0xb8,0xbe,0x55,0x45,0x97,0x6b,0xf4,0x09,0xe1,0xcd,0x1d,0x3c,0x0a,0x99,0x5c,0x11,0xea,0xd8,0xbe,0x74,0x49,0x6e,0x09,0x47,0x9d,
+ 0x04,0x20,0xa5,0xe6,0xc9,0xb1,0xea,0x28,0x2e,0x2f,0x64,0x57,0x05,0xcd,0x81,0xc6,0x8a,0xc0,0xfa,0x91,0xc4,0x4f,0xd3,0x3a,0xea,0x05,0xe8,0x62,0x13,0x8e,0x72,0x2d,0x4d,0x31,0x47,0x9d,
+ 0x04,0x20,0xbd,0x0e,0xc8,0x73,0x43,0xa7,0xc6,0x25,0x15,0xcf,0x3e,0x23,0xa8,0xb0,0xbf,0xe8,0x20,0xa7,0xec,0x2a,0xf6,0x37,0x6c,0x60,0x5e,0x4d,0xed,0xf4,0xb1,0xef,0xf7,0xb2,0x47,0x9d,
0x04,0x20,0xc8,0x88,0xfe,0x71,0x5f,0xa3,0x6c,0x96,0x6a,0xd7,0x9e,0x38,0x84,0x9f,0x44,0xe1,0x6b,0xdc,0x98,0x31,0xad,0x96,0x29,0xe7,0x00,0x83,0x63,0x03,0xae,0x69,0x2e,0x63,0x47,0x9d,
- 0x04,0x20,0xcb,0x2a,0x8c,0xe7,0xe5,0x1f,0x4e,0x3a,0x13,0xd6,0x9e,0xd7,0x68,0x51,0x83,0xf4,0x2d,0x3e,0x21,0x38,0x63,0x18,0xe9,0x97,0x27,0xff,0x45,0x48,0xc3,0x6c,0xca,0x59,0x47,0x9d,
- 0x04,0x20,0xcb,0x80,0x0d,0xdf,0xf0,0xa6,0x28,0x84,0x98,0xc8,0x47,0x72,0xbe,0x53,0x04,0x43,0x9c,0x3a,0x0e,0x46,0x9c,0x75,0x4c,0x57,0x50,0x98,0xe5,0x25,0x80,0x5d,0xa2,0x91,0x47,0x9d,
- 0x04,0x20,0xcb,0xaa,0x0a,0x5d,0x6e,0x8a,0xfa,0x49,0x5a,0x8c,0x0c,0x9d,0x7a,0xe9,0x9d,0xc6,0xe4,0xcd,0xc1,0x6a,0xff,0xbb,0xf1,0x89,0xf1,0xd5,0x16,0x3f,0xdc,0xbb,0xe9,0x1b,0x47,0x9d,
};
#endif // BITCOIN_CHAINPARAMSSEEDS_H
diff --git a/src/clientversion.cpp b/src/clientversion.cpp
index e7d63e34c6..bf5579ee69 100644
--- a/src/clientversion.cpp
+++ b/src/clientversion.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <clientversion.h>
#include <util/translation.h>
diff --git a/src/common/settings.cpp b/src/common/settings.cpp
index 5761e8b321..db1001111a 100644
--- a/src/common/settings.cpp
+++ b/src/common/settings.cpp
@@ -4,6 +4,10 @@
#include <common/settings.h>
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <tinyformat.h>
#include <univalue.h>
#include <util/fs.h>
@@ -27,6 +31,9 @@ enum class Source {
CONFIG_FILE_DEFAULT_SECTION
};
+// Json object key for the auto-generated warning comment
+const std::string SETTINGS_WARN_MSG_KEY{"_warning_"};
+
//! Merge settings from multiple sources in precedence order:
//! Forced config > command line > read-write settings file > config file network-specific section > config file default section
//!
@@ -81,7 +88,9 @@ bool ReadSettings(const fs::path& path, std::map<std::string, SettingsValue>& va
SettingsValue in;
if (!in.read(std::string{std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>()})) {
- errors.emplace_back(strprintf("Unable to parse settings file %s", fs::PathToString(path)));
+ errors.emplace_back(strprintf("Settings file %s does not contain valid JSON. This is probably caused by disk corruption or a crash, "
+ "and can be fixed by removing the file, which will reset settings to default values.",
+ fs::PathToString(path)));
return false;
}
@@ -106,6 +115,10 @@ bool ReadSettings(const fs::path& path, std::map<std::string, SettingsValue>& va
break;
}
}
+
+ // Remove auto-generated warning comment from the accessible settings.
+ values.erase(SETTINGS_WARN_MSG_KEY);
+
return errors.empty();
}
@@ -114,6 +127,10 @@ bool WriteSettings(const fs::path& path,
std::vector<std::string>& errors)
{
SettingsValue out(SettingsValue::VOBJ);
+ // Add auto-generated warning comment
+ out.pushKV(SETTINGS_WARN_MSG_KEY, strprintf("This file is automatically generated and updated by %s. Please do not edit this file while the node "
+ "is running, as any changes might be ignored or overwritten.", PACKAGE_NAME));
+ // Push settings values
for (const auto& value : values) {
out.pushKVEnd(value.first, value.second);
}
diff --git a/src/common/system.cpp b/src/common/system.cpp
index ba42c6df50..1fa53a5f34 100644
--- a/src/common/system.cpp
+++ b/src/common/system.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <common/system.h>
#include <logging.h>
diff --git a/src/compat/byteswap.h b/src/compat/byteswap.h
index 9ee71ef267..0d0b079230 100644
--- a/src/compat/byteswap.h
+++ b/src/compat/byteswap.h
@@ -5,44 +5,66 @@
#ifndef BITCOIN_COMPAT_BYTESWAP_H
#define BITCOIN_COMPAT_BYTESWAP_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
+#include <cstdint>
+#ifdef _MSC_VER
+#include <cstdlib>
#endif
-#include <cstdint>
-#if defined(HAVE_BYTESWAP_H)
-#include <byteswap.h>
-#endif
+// All internal_bswap_* functions can be replaced with std::byteswap once we
+// require c++23. Both libstdc++ and libc++ implement std::byteswap via these
+// builtins.
-#if defined(MAC_OSX)
+#ifndef DISABLE_BUILTIN_BSWAPS
+# if defined __has_builtin
+# if __has_builtin(__builtin_bswap16)
+# define bitcoin_builtin_bswap16(x) __builtin_bswap16(x)
+# endif
+# if __has_builtin(__builtin_bswap32)
+# define bitcoin_builtin_bswap32(x) __builtin_bswap32(x)
+# endif
+# if __has_builtin(__builtin_bswap64)
+# define bitcoin_builtin_bswap64(x) __builtin_bswap64(x)
+# endif
+# elif defined(_MSC_VER)
+# define bitcoin_builtin_bswap16(x) _byteswap_ushort(x)
+# define bitcoin_builtin_bswap32(x) _byteswap_ulong(x)
+# define bitcoin_builtin_bswap64(x) _byteswap_uint64(x)
+# endif
+#endif
-#include <libkern/OSByteOrder.h>
-#define bswap_16(x) OSSwapInt16(x)
-#define bswap_32(x) OSSwapInt32(x)
-#define bswap_64(x) OSSwapInt64(x)
+// MSVC's _byteswap_* functions are not constexpr
+#ifndef _MSC_VER
+#define BSWAP_CONSTEXPR constexpr
#else
-// Non-MacOS / non-Darwin
+#define BSWAP_CONSTEXPR
+#endif
-#if HAVE_DECL_BSWAP_16 == 0
-inline uint16_t bswap_16(uint16_t x)
+inline BSWAP_CONSTEXPR uint16_t internal_bswap_16(uint16_t x)
{
+#ifdef bitcoin_builtin_bswap16
+ return bitcoin_builtin_bswap16(x);
+#else
return (x >> 8) | (x << 8);
+#endif
}
-#endif // HAVE_DECL_BSWAP16 == 0
-#if HAVE_DECL_BSWAP_32 == 0
-inline uint32_t bswap_32(uint32_t x)
+inline BSWAP_CONSTEXPR uint32_t internal_bswap_32(uint32_t x)
{
+#ifdef bitcoin_builtin_bswap32
+ return bitcoin_builtin_bswap32(x);
+#else
return (((x & 0xff000000U) >> 24) | ((x & 0x00ff0000U) >> 8) |
((x & 0x0000ff00U) << 8) | ((x & 0x000000ffU) << 24));
+#endif
}
-#endif // HAVE_DECL_BSWAP32 == 0
-#if HAVE_DECL_BSWAP_64 == 0
-inline uint64_t bswap_64(uint64_t x)
+inline BSWAP_CONSTEXPR uint64_t internal_bswap_64(uint64_t x)
{
+#ifdef bitcoin_builtin_bswap64
+ return bitcoin_builtin_bswap64(x);
+#else
return (((x & 0xff00000000000000ull) >> 56)
| ((x & 0x00ff000000000000ull) >> 40)
| ((x & 0x0000ff0000000000ull) >> 24)
@@ -51,9 +73,7 @@ inline uint64_t bswap_64(uint64_t x)
| ((x & 0x0000000000ff0000ull) << 24)
| ((x & 0x000000000000ff00ull) << 40)
| ((x & 0x00000000000000ffull) << 56));
+#endif
}
-#endif // HAVE_DECL_BSWAP64 == 0
-
-#endif // defined(MAC_OSX)
#endif // BITCOIN_COMPAT_BYTESWAP_H
diff --git a/src/compat/compat.h b/src/compat/compat.h
index 435a403552..9ff9a335f8 100644
--- a/src/compat/compat.h
+++ b/src/compat/compat.h
@@ -6,10 +6,6 @@
#ifndef BITCOIN_COMPAT_COMPAT_H
#define BITCOIN_COMPAT_COMPAT_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
// Windows defines FD_SETSIZE to 64 (see _fd_types.h in mingw-w64),
// which is too small for our usage, but allows us to redefine it safely.
// We redefine it to be 1024, to match glibc, see typesizes.h.
diff --git a/src/compat/endian.h b/src/compat/endian.h
index 882de2dbf0..4f58428153 100644
--- a/src/compat/endian.h
+++ b/src/compat/endian.h
@@ -5,237 +5,70 @@
#ifndef BITCOIN_COMPAT_ENDIAN_H
#define BITCOIN_COMPAT_ENDIAN_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <compat/byteswap.h>
+#include <bit>
#include <cstdint>
-#if defined(HAVE_ENDIAN_H)
-#include <endian.h>
-#elif defined(HAVE_SYS_ENDIAN_H)
-#include <sys/endian.h>
-#endif
-
-#ifndef HAVE_CONFIG_H
-// While not technically a supported configuration, defaulting to defining these
-// DECLs when we were compiled without autotools makes it easier for other build
-// systems to build things like libbitcoinconsensus for strange targets.
-#ifdef htobe16
-#define HAVE_DECL_HTOBE16 1
-#endif
-#ifdef htole16
-#define HAVE_DECL_HTOLE16 1
-#endif
-#ifdef be16toh
-#define HAVE_DECL_BE16TOH 1
-#endif
-#ifdef le16toh
-#define HAVE_DECL_LE16TOH 1
-#endif
-
-#ifdef htobe32
-#define HAVE_DECL_HTOBE32 1
-#endif
-#ifdef htole32
-#define HAVE_DECL_HTOLE32 1
-#endif
-#ifdef be32toh
-#define HAVE_DECL_BE32TOH 1
-#endif
-#ifdef le32toh
-#define HAVE_DECL_LE32TOH 1
-#endif
-
-#ifdef htobe64
-#define HAVE_DECL_HTOBE64 1
-#endif
-#ifdef htole64
-#define HAVE_DECL_HTOLE64 1
-#endif
-#ifdef be64toh
-#define HAVE_DECL_BE64TOH 1
-#endif
-#ifdef le64toh
-#define HAVE_DECL_LE64TOH 1
-#endif
-
-#endif // HAVE_CONFIG_H
-
-#if defined(WORDS_BIGENDIAN)
-
-#if HAVE_DECL_HTOBE16 == 0
-inline uint16_t htobe16(uint16_t host_16bits)
-{
- return host_16bits;
-}
-#endif // HAVE_DECL_HTOBE16
-
-#if HAVE_DECL_HTOLE16 == 0
-inline uint16_t htole16(uint16_t host_16bits)
-{
- return bswap_16(host_16bits);
-}
-#endif // HAVE_DECL_HTOLE16
-
-#if HAVE_DECL_BE16TOH == 0
-inline uint16_t be16toh(uint16_t big_endian_16bits)
-{
- return big_endian_16bits;
-}
-#endif // HAVE_DECL_BE16TOH
-
-#if HAVE_DECL_LE16TOH == 0
-inline uint16_t le16toh(uint16_t little_endian_16bits)
-{
- return bswap_16(little_endian_16bits);
-}
-#endif // HAVE_DECL_LE16TOH
-
-#if HAVE_DECL_HTOBE32 == 0
-inline uint32_t htobe32(uint32_t host_32bits)
-{
- return host_32bits;
-}
-#endif // HAVE_DECL_HTOBE32
-
-#if HAVE_DECL_HTOLE32 == 0
-inline uint32_t htole32(uint32_t host_32bits)
-{
- return bswap_32(host_32bits);
-}
-#endif // HAVE_DECL_HTOLE32
-
-#if HAVE_DECL_BE32TOH == 0
-inline uint32_t be32toh(uint32_t big_endian_32bits)
-{
- return big_endian_32bits;
-}
-#endif // HAVE_DECL_BE32TOH
-
-#if HAVE_DECL_LE32TOH == 0
-inline uint32_t le32toh(uint32_t little_endian_32bits)
+inline BSWAP_CONSTEXPR uint16_t htobe16_internal(uint16_t host_16bits)
{
- return bswap_32(little_endian_32bits);
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_16(host_16bits);
+ else return host_16bits;
}
-#endif // HAVE_DECL_LE32TOH
-
-#if HAVE_DECL_HTOBE64 == 0
-inline uint64_t htobe64(uint64_t host_64bits)
-{
- return host_64bits;
-}
-#endif // HAVE_DECL_HTOBE64
-
-#if HAVE_DECL_HTOLE64 == 0
-inline uint64_t htole64(uint64_t host_64bits)
-{
- return bswap_64(host_64bits);
-}
-#endif // HAVE_DECL_HTOLE64
-
-#if HAVE_DECL_BE64TOH == 0
-inline uint64_t be64toh(uint64_t big_endian_64bits)
-{
- return big_endian_64bits;
-}
-#endif // HAVE_DECL_BE64TOH
-
-#if HAVE_DECL_LE64TOH == 0
-inline uint64_t le64toh(uint64_t little_endian_64bits)
-{
- return bswap_64(little_endian_64bits);
-}
-#endif // HAVE_DECL_LE64TOH
-
-#else // WORDS_BIGENDIAN
-
-#if HAVE_DECL_HTOBE16 == 0
-inline uint16_t htobe16(uint16_t host_16bits)
+inline BSWAP_CONSTEXPR uint16_t htole16_internal(uint16_t host_16bits)
{
- return bswap_16(host_16bits);
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_16(host_16bits);
+ else return host_16bits;
}
-#endif // HAVE_DECL_HTOBE16
-
-#if HAVE_DECL_HTOLE16 == 0
-inline uint16_t htole16(uint16_t host_16bits)
+inline BSWAP_CONSTEXPR uint16_t be16toh_internal(uint16_t big_endian_16bits)
{
- return host_16bits;
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_16(big_endian_16bits);
+ else return big_endian_16bits;
}
-#endif // HAVE_DECL_HTOLE16
-
-#if HAVE_DECL_BE16TOH == 0
-inline uint16_t be16toh(uint16_t big_endian_16bits)
+inline BSWAP_CONSTEXPR uint16_t le16toh_internal(uint16_t little_endian_16bits)
{
- return bswap_16(big_endian_16bits);
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_16(little_endian_16bits);
+ else return little_endian_16bits;
}
-#endif // HAVE_DECL_BE16TOH
-
-#if HAVE_DECL_LE16TOH == 0
-inline uint16_t le16toh(uint16_t little_endian_16bits)
+inline BSWAP_CONSTEXPR uint32_t htobe32_internal(uint32_t host_32bits)
{
- return little_endian_16bits;
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_32(host_32bits);
+ else return host_32bits;
}
-#endif // HAVE_DECL_LE16TOH
-
-#if HAVE_DECL_HTOBE32 == 0
-inline uint32_t htobe32(uint32_t host_32bits)
-{
- return bswap_32(host_32bits);
-}
-#endif // HAVE_DECL_HTOBE32
-
-#if HAVE_DECL_HTOLE32 == 0
-inline uint32_t htole32(uint32_t host_32bits)
+inline BSWAP_CONSTEXPR uint32_t htole32_internal(uint32_t host_32bits)
{
- return host_32bits;
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_32(host_32bits);
+ else return host_32bits;
}
-#endif // HAVE_DECL_HTOLE32
-
-#if HAVE_DECL_BE32TOH == 0
-inline uint32_t be32toh(uint32_t big_endian_32bits)
+inline BSWAP_CONSTEXPR uint32_t be32toh_internal(uint32_t big_endian_32bits)
{
- return bswap_32(big_endian_32bits);
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_32(big_endian_32bits);
+ else return big_endian_32bits;
}
-#endif // HAVE_DECL_BE32TOH
-
-#if HAVE_DECL_LE32TOH == 0
-inline uint32_t le32toh(uint32_t little_endian_32bits)
+inline BSWAP_CONSTEXPR uint32_t le32toh_internal(uint32_t little_endian_32bits)
{
- return little_endian_32bits;
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_32(little_endian_32bits);
+ else return little_endian_32bits;
}
-#endif // HAVE_DECL_LE32TOH
-
-#if HAVE_DECL_HTOBE64 == 0
-inline uint64_t htobe64(uint64_t host_64bits)
+inline BSWAP_CONSTEXPR uint64_t htobe64_internal(uint64_t host_64bits)
{
- return bswap_64(host_64bits);
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_64(host_64bits);
+ else return host_64bits;
}
-#endif // HAVE_DECL_HTOBE64
-
-#if HAVE_DECL_HTOLE64 == 0
-inline uint64_t htole64(uint64_t host_64bits)
+inline BSWAP_CONSTEXPR uint64_t htole64_internal(uint64_t host_64bits)
{
- return host_64bits;
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_64(host_64bits);
+ else return host_64bits;
}
-#endif // HAVE_DECL_HTOLE64
-
-#if HAVE_DECL_BE64TOH == 0
-inline uint64_t be64toh(uint64_t big_endian_64bits)
+inline BSWAP_CONSTEXPR uint64_t be64toh_internal(uint64_t big_endian_64bits)
{
- return bswap_64(big_endian_64bits);
+ if constexpr (std::endian::native == std::endian::little) return internal_bswap_64(big_endian_64bits);
+ else return big_endian_64bits;
}
-#endif // HAVE_DECL_BE64TOH
-
-#if HAVE_DECL_LE64TOH == 0
-inline uint64_t le64toh(uint64_t little_endian_64bits)
+inline BSWAP_CONSTEXPR uint64_t le64toh_internal(uint64_t little_endian_64bits)
{
- return little_endian_64bits;
+ if constexpr (std::endian::native == std::endian::big) return internal_bswap_64(little_endian_64bits);
+ else return little_endian_64bits;
}
-#endif // HAVE_DECL_LE64TOH
-
-#endif // WORDS_BIGENDIAN
#endif // BITCOIN_COMPAT_ENDIAN_H
diff --git a/src/core_io.h b/src/core_io.h
index a104f240c1..4405f5c8f8 100644
--- a/src/core_io.h
+++ b/src/core_io.h
@@ -51,9 +51,9 @@ bool ParseHashStr(const std::string& strHex, uint256& result);
// core_write.cpp
UniValue ValueFromAmount(const CAmount amount);
std::string FormatScript(const CScript& script);
-std::string EncodeHexTx(const CTransaction& tx, const bool without_witness = false);
+std::string EncodeHexTx(const CTransaction& tx);
std::string SighashToStr(unsigned char sighash_type);
void ScriptToUniv(const CScript& script, UniValue& out, bool include_hex = true, bool include_address = false, const SigningProvider* provider = nullptr);
-void TxToUniv(const CTransaction& tx, const uint256& block_hash, UniValue& entry, bool include_hex = true, bool without_witness = false, const CTxUndo* txundo = nullptr, TxVerbosity verbosity = TxVerbosity::SHOW_DETAILS);
+void TxToUniv(const CTransaction& tx, const uint256& block_hash, UniValue& entry, bool include_hex = true, const CTxUndo* txundo = nullptr, TxVerbosity verbosity = TxVerbosity::SHOW_DETAILS);
#endif // BITCOIN_CORE_IO_H
diff --git a/src/core_write.cpp b/src/core_write.cpp
index a2be17d1aa..63f2c36b5a 100644
--- a/src/core_write.cpp
+++ b/src/core_write.cpp
@@ -140,14 +140,10 @@ std::string ScriptToAsmStr(const CScript& script, const bool fAttemptSighashDeco
return str;
}
-std::string EncodeHexTx(const CTransaction& tx, const bool without_witness)
+std::string EncodeHexTx(const CTransaction& tx)
{
DataStream ssTx;
- if (without_witness) {
- ssTx << TX_NO_WITNESS(tx);
- } else {
- ssTx << TX_WITH_WITNESS(tx);
- }
+ ssTx << TX_WITH_WITNESS(tx);
return HexStr(ssTx);
}
@@ -172,7 +168,7 @@ void ScriptToUniv(const CScript& script, UniValue& out, bool include_hex, bool i
out.pushKV("type", GetTxnOutputType(type));
}
-void TxToUniv(const CTransaction& tx, const uint256& block_hash, UniValue& entry, bool include_hex, bool without_witness, const CTxUndo* txundo, TxVerbosity verbosity)
+void TxToUniv(const CTransaction& tx, const uint256& block_hash, UniValue& entry, bool include_hex, const CTxUndo* txundo, TxVerbosity verbosity)
{
CHECK_NONFATAL(verbosity >= TxVerbosity::SHOW_DETAILS);
@@ -268,6 +264,6 @@ void TxToUniv(const CTransaction& tx, const uint256& block_hash, UniValue& entry
}
if (include_hex) {
- entry.pushKV("hex", EncodeHexTx(tx, without_witness)); // The hex-encoded transaction. Used the name "hex" to be consistent with the verbose output of "getrawtransaction".
+ entry.pushKV("hex", EncodeHexTx(tx)); // The hex-encoded transaction. Used the name "hex" to be consistent with the verbose output of "getrawtransaction".
}
}
diff --git a/src/crc32c/src/crc32c_arm64.cc b/src/crc32c/src/crc32c_arm64.cc
index 1da04ed34a..711616cd2f 100644
--- a/src/crc32c/src/crc32c_arm64.cc
+++ b/src/crc32c/src/crc32c_arm64.cc
@@ -12,6 +12,7 @@
#include <cstddef>
#include <cstdint>
+#include <cstring>
#include "./crc32c_internal.h"
#ifdef CRC32C_HAVE_CONFIG_H
@@ -29,14 +30,14 @@
// compute 8bytes for each segment parallelly
#define CRC32C32BYTES(P, IND) \
do { \
- crc1 = __crc32cd( \
- crc1, *((const uint64_t *)(P) + (SEGMENTBYTES / 8) * 1 + (IND))); \
- crc2 = __crc32cd( \
- crc2, *((const uint64_t *)(P) + (SEGMENTBYTES / 8) * 2 + (IND))); \
- crc3 = __crc32cd( \
- crc3, *((const uint64_t *)(P) + (SEGMENTBYTES / 8) * 3 + (IND))); \
- crc0 = __crc32cd( \
- crc0, *((const uint64_t *)(P) + (SEGMENTBYTES / 8) * 0 + (IND))); \
+ std::memcpy(&d64, (P) + SEGMENTBYTES * 1 + (IND) * 8, sizeof(d64)); \
+ crc1 = __crc32cd(crc1, d64); \
+ std::memcpy(&d64, (P) + SEGMENTBYTES * 2 + (IND) * 8, sizeof(d64)); \
+ crc2 = __crc32cd(crc2, d64); \
+ std::memcpy(&d64, (P) + SEGMENTBYTES * 3 + (IND) * 8, sizeof(d64)); \
+ crc3 = __crc32cd(crc3, d64); \
+ std::memcpy(&d64, (P) + SEGMENTBYTES * 0 + (IND) * 8, sizeof(d64)); \
+ crc0 = __crc32cd(crc0, d64); \
} while (0);
// compute 8*8 bytes for each segment parallelly
@@ -68,6 +69,9 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *data, size_t size) {
int64_t length = size;
uint32_t crc0, crc1, crc2, crc3;
uint64_t t0, t1, t2;
+ uint16_t d16;
+ uint32_t d32;
+ uint64_t d64;
// k0=CRC(x^(3*SEGMENTBYTES*8)), k1=CRC(x^(2*SEGMENTBYTES*8)),
// k2=CRC(x^(SEGMENTBYTES*8))
@@ -88,7 +92,8 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *data, size_t size) {
t2 = (uint64_t)vmull_p64(crc2, k2);
t1 = (uint64_t)vmull_p64(crc1, k1);
t0 = (uint64_t)vmull_p64(crc0, k0);
- crc = __crc32cd(crc3, *(uint64_t *)data);
+ std::memcpy(&d64, data, sizeof(d64));
+ crc = __crc32cd(crc3, d64);
data += sizeof(uint64_t);
crc ^= __crc32cd(0, t2);
crc ^= __crc32cd(0, t1);
@@ -98,18 +103,21 @@ uint32_t ExtendArm64(uint32_t crc, const uint8_t *data, size_t size) {
}
while (length >= 8) {
- crc = __crc32cd(crc, *(uint64_t *)data);
+ std::memcpy(&d64, data, sizeof(d64));
+ crc = __crc32cd(crc, d64);
data += 8;
length -= 8;
}
if (length & 4) {
- crc = __crc32cw(crc, *(uint32_t *)data);
+ std::memcpy(&d32, data, sizeof(d32));
+ crc = __crc32cw(crc, d32);
data += 4;
}
if (length & 2) {
- crc = __crc32ch(crc, *(uint16_t *)data);
+ std::memcpy(&d16, data, sizeof(d16));
+ crc = __crc32ch(crc, d16);
data += 2;
}
diff --git a/src/crypto/chacha20.cpp b/src/crypto/chacha20.cpp
index a3cc87e81b..4feed862cb 100644
--- a/src/crypto/chacha20.cpp
+++ b/src/crypto/chacha20.cpp
@@ -11,15 +11,14 @@
#include <span.h>
#include <algorithm>
+#include <bit>
#include <string.h>
-constexpr static inline uint32_t rotl32(uint32_t v, int c) { return (v << c) | (v >> (32 - c)); }
-
#define QUARTERROUND(a,b,c,d) \
- a += b; d = rotl32(d ^ a, 16); \
- c += d; b = rotl32(b ^ c, 12); \
- a += b; d = rotl32(d ^ a, 8); \
- c += d; b = rotl32(b ^ c, 7);
+ a += b; d = std::rotl(d ^ a, 16); \
+ c += d; b = std::rotl(b ^ c, 12); \
+ a += b; d = std::rotl(d ^ a, 8); \
+ c += d; b = std::rotl(b ^ c, 7);
#define REPEAT10(a) do { {a}; {a}; {a}; {a}; {a}; {a}; {a}; {a}; {a}; {a}; } while(0)
diff --git a/src/crypto/chacha20poly1305.cpp b/src/crypto/chacha20poly1305.cpp
index 59671d304c..3e8051c2dc 100644
--- a/src/crypto/chacha20poly1305.cpp
+++ b/src/crypto/chacha20poly1305.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <crypto/chacha20poly1305.h>
#include <crypto/common.h>
diff --git a/src/crypto/common.h b/src/crypto/common.h
index 6ae5d4cd24..1dc4f3f55c 100644
--- a/src/crypto/common.h
+++ b/src/crypto/common.h
@@ -5,51 +5,47 @@
#ifndef BITCOIN_CRYPTO_COMMON_H
#define BITCOIN_CRYPTO_COMMON_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
-#include <stdint.h>
-#include <string.h>
-
#include <compat/endian.h>
+#include <cstdint>
+#include <cstring>
+
uint16_t static inline ReadLE16(const unsigned char* ptr)
{
uint16_t x;
memcpy(&x, ptr, 2);
- return le16toh(x);
+ return le16toh_internal(x);
}
uint32_t static inline ReadLE32(const unsigned char* ptr)
{
uint32_t x;
memcpy(&x, ptr, 4);
- return le32toh(x);
+ return le32toh_internal(x);
}
uint64_t static inline ReadLE64(const unsigned char* ptr)
{
uint64_t x;
memcpy(&x, ptr, 8);
- return le64toh(x);
+ return le64toh_internal(x);
}
void static inline WriteLE16(unsigned char* ptr, uint16_t x)
{
- uint16_t v = htole16(x);
+ uint16_t v = htole16_internal(x);
memcpy(ptr, &v, 2);
}
void static inline WriteLE32(unsigned char* ptr, uint32_t x)
{
- uint32_t v = htole32(x);
+ uint32_t v = htole32_internal(x);
memcpy(ptr, &v, 4);
}
void static inline WriteLE64(unsigned char* ptr, uint64_t x)
{
- uint64_t v = htole64(x);
+ uint64_t v = htole64_internal(x);
memcpy(ptr, &v, 8);
}
@@ -57,54 +53,33 @@ uint16_t static inline ReadBE16(const unsigned char* ptr)
{
uint16_t x;
memcpy(&x, ptr, 2);
- return be16toh(x);
+ return be16toh_internal(x);
}
uint32_t static inline ReadBE32(const unsigned char* ptr)
{
uint32_t x;
memcpy(&x, ptr, 4);
- return be32toh(x);
+ return be32toh_internal(x);
}
uint64_t static inline ReadBE64(const unsigned char* ptr)
{
uint64_t x;
memcpy(&x, ptr, 8);
- return be64toh(x);
+ return be64toh_internal(x);
}
void static inline WriteBE32(unsigned char* ptr, uint32_t x)
{
- uint32_t v = htobe32(x);
+ uint32_t v = htobe32_internal(x);
memcpy(ptr, &v, 4);
}
void static inline WriteBE64(unsigned char* ptr, uint64_t x)
{
- uint64_t v = htobe64(x);
+ uint64_t v = htobe64_internal(x);
memcpy(ptr, &v, 8);
}
-/** Return the smallest number n such that (x >> n) == 0 (or 64 if the highest bit in x is set. */
-uint64_t static inline CountBits(uint64_t x)
-{
-#if HAVE_BUILTIN_CLZL
- if (sizeof(unsigned long) >= sizeof(uint64_t)) {
- return x ? 8 * sizeof(unsigned long) - __builtin_clzl(x) : 0;
- }
-#endif
-#if HAVE_BUILTIN_CLZLL
- if (sizeof(unsigned long long) >= sizeof(uint64_t)) {
- return x ? 8 * sizeof(unsigned long long) - __builtin_clzll(x) : 0;
- }
-#endif
- int ret = 0;
- while (x) {
- x >>= 1;
- ++ret;
- }
- return ret;
-}
-
#endif // BITCOIN_CRYPTO_COMMON_H
diff --git a/src/crypto/muhash.h b/src/crypto/muhash.h
index 53c5a91a03..cb53e1743e 100644
--- a/src/crypto/muhash.h
+++ b/src/crypto/muhash.h
@@ -5,10 +5,6 @@
#ifndef BITCOIN_CRYPTO_MUHASH_H
#define BITCOIN_CRYPTO_MUHASH_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <serialize.h>
#include <uint256.h>
diff --git a/src/crypto/sha256.cpp b/src/crypto/sha256.cpp
index 5eacaa44e1..4c7bb6f20f 100644
--- a/src/crypto/sha256.cpp
+++ b/src/crypto/sha256.cpp
@@ -2,32 +2,35 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <crypto/sha256.h>
#include <crypto/common.h>
#include <assert.h>
#include <string.h>
+#if !defined(DISABLE_OPTIMIZED_SHA256)
#include <compat/cpuid.h>
-#if defined(__linux__) && defined(ENABLE_ARM_SHANI) && !defined(BUILD_BITCOIN_INTERNAL)
+#if defined(__linux__) && defined(ENABLE_ARM_SHANI)
#include <sys/auxv.h>
#include <asm/hwcap.h>
#endif
-#if defined(MAC_OSX) && defined(ENABLE_ARM_SHANI) && !defined(BUILD_BITCOIN_INTERNAL)
+#if defined(MAC_OSX) && defined(ENABLE_ARM_SHANI)
#include <sys/types.h>
#include <sys/sysctl.h>
#endif
#if defined(__x86_64__) || defined(__amd64__) || defined(__i386__)
-#if defined(USE_ASM)
namespace sha256_sse4
{
void Transform(uint32_t* s, const unsigned char* chunk, size_t blocks);
}
#endif
-#endif
namespace sha256d64_sse41
{
@@ -58,6 +61,7 @@ namespace sha256d64_arm_shani
{
void Transform_2way(unsigned char* out, const unsigned char* in);
}
+#endif // DISABLE_OPTIMIZED_SHA256
// Internal implementation code.
namespace
@@ -567,7 +571,8 @@ bool SelfTest() {
return true;
}
-#if defined(USE_ASM) && (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
+#if !defined(DISABLE_OPTIMIZED_SHA256)
+#if (defined(__x86_64__) || defined(__amd64__) || defined(__i386__))
/** Check whether the OS has enabled AVX registers. */
bool AVXEnabled()
{
@@ -576,6 +581,7 @@ bool AVXEnabled()
return (a & 6) == 6;
}
#endif
+#endif // DISABLE_OPTIMIZED_SHA256
} // namespace
@@ -588,7 +594,8 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem
TransformD64_4way = nullptr;
TransformD64_8way = nullptr;
-#if defined(USE_ASM) && defined(HAVE_GETCPUID)
+#if !defined(DISABLE_OPTIMIZED_SHA256)
+#if defined(HAVE_GETCPUID)
bool have_sse4 = false;
bool have_xsave = false;
bool have_avx = false;
@@ -616,7 +623,7 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem
}
}
-#if defined(ENABLE_X86_SHANI) && !defined(BUILD_BITCOIN_INTERNAL)
+#if defined(ENABLE_X86_SHANI)
if (have_x86_shani) {
Transform = sha256_x86_shani::Transform;
TransformD64 = TransformD64Wrapper<sha256_x86_shani::Transform>;
@@ -633,21 +640,21 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem
TransformD64 = TransformD64Wrapper<sha256_sse4::Transform>;
ret = "sse4(1way)";
#endif
-#if defined(ENABLE_SSE41) && !defined(BUILD_BITCOIN_INTERNAL)
+#if defined(ENABLE_SSE41)
TransformD64_4way = sha256d64_sse41::Transform_4way;
ret += ",sse41(4way)";
#endif
}
-#if defined(ENABLE_AVX2) && !defined(BUILD_BITCOIN_INTERNAL)
+#if defined(ENABLE_AVX2)
if (have_avx2 && have_avx && enabled_avx) {
TransformD64_8way = sha256d64_avx2::Transform_8way;
ret += ",avx2(8way)";
}
#endif
-#endif // defined(USE_ASM) && defined(HAVE_GETCPUID)
+#endif // defined(HAVE_GETCPUID)
-#if defined(ENABLE_ARM_SHANI) && !defined(BUILD_BITCOIN_INTERNAL)
+#if defined(ENABLE_ARM_SHANI)
bool have_arm_shani = false;
if (use_implementation & sha256_implementation::USE_SHANI) {
#if defined(__linux__)
@@ -679,6 +686,7 @@ std::string SHA256AutoDetect(sha256_implementation::UseImplementation use_implem
ret = "arm_shani(1way,2way)";
}
#endif
+#endif // DISABLE_OPTIMIZED_SHA256
assert(SelfTest());
return ret;
diff --git a/src/crypto/sha3.cpp b/src/crypto/sha3.cpp
index 9c0c42fa77..770500bfe2 100644
--- a/src/crypto/sha3.cpp
+++ b/src/crypto/sha3.cpp
@@ -11,15 +11,10 @@
#include <algorithm>
#include <array> // For std::begin and std::end.
+#include <bit>
#include <stdint.h>
-// Internal implementation code.
-namespace
-{
-uint64_t Rotl(uint64_t x, int n) { return (x << n) | (x >> (64 - n)); }
-} // namespace
-
void KeccakF(uint64_t (&st)[25])
{
static constexpr uint64_t RNDC[24] = {
@@ -41,38 +36,38 @@ void KeccakF(uint64_t (&st)[25])
bc2 = st[2] ^ st[7] ^ st[12] ^ st[17] ^ st[22];
bc3 = st[3] ^ st[8] ^ st[13] ^ st[18] ^ st[23];
bc4 = st[4] ^ st[9] ^ st[14] ^ st[19] ^ st[24];
- t = bc4 ^ Rotl(bc1, 1); st[0] ^= t; st[5] ^= t; st[10] ^= t; st[15] ^= t; st[20] ^= t;
- t = bc0 ^ Rotl(bc2, 1); st[1] ^= t; st[6] ^= t; st[11] ^= t; st[16] ^= t; st[21] ^= t;
- t = bc1 ^ Rotl(bc3, 1); st[2] ^= t; st[7] ^= t; st[12] ^= t; st[17] ^= t; st[22] ^= t;
- t = bc2 ^ Rotl(bc4, 1); st[3] ^= t; st[8] ^= t; st[13] ^= t; st[18] ^= t; st[23] ^= t;
- t = bc3 ^ Rotl(bc0, 1); st[4] ^= t; st[9] ^= t; st[14] ^= t; st[19] ^= t; st[24] ^= t;
+ t = bc4 ^ std::rotl(bc1, 1); st[0] ^= t; st[5] ^= t; st[10] ^= t; st[15] ^= t; st[20] ^= t;
+ t = bc0 ^ std::rotl(bc2, 1); st[1] ^= t; st[6] ^= t; st[11] ^= t; st[16] ^= t; st[21] ^= t;
+ t = bc1 ^ std::rotl(bc3, 1); st[2] ^= t; st[7] ^= t; st[12] ^= t; st[17] ^= t; st[22] ^= t;
+ t = bc2 ^ std::rotl(bc4, 1); st[3] ^= t; st[8] ^= t; st[13] ^= t; st[18] ^= t; st[23] ^= t;
+ t = bc3 ^ std::rotl(bc0, 1); st[4] ^= t; st[9] ^= t; st[14] ^= t; st[19] ^= t; st[24] ^= t;
// Rho Pi
t = st[1];
- bc0 = st[10]; st[10] = Rotl(t, 1); t = bc0;
- bc0 = st[7]; st[7] = Rotl(t, 3); t = bc0;
- bc0 = st[11]; st[11] = Rotl(t, 6); t = bc0;
- bc0 = st[17]; st[17] = Rotl(t, 10); t = bc0;
- bc0 = st[18]; st[18] = Rotl(t, 15); t = bc0;
- bc0 = st[3]; st[3] = Rotl(t, 21); t = bc0;
- bc0 = st[5]; st[5] = Rotl(t, 28); t = bc0;
- bc0 = st[16]; st[16] = Rotl(t, 36); t = bc0;
- bc0 = st[8]; st[8] = Rotl(t, 45); t = bc0;
- bc0 = st[21]; st[21] = Rotl(t, 55); t = bc0;
- bc0 = st[24]; st[24] = Rotl(t, 2); t = bc0;
- bc0 = st[4]; st[4] = Rotl(t, 14); t = bc0;
- bc0 = st[15]; st[15] = Rotl(t, 27); t = bc0;
- bc0 = st[23]; st[23] = Rotl(t, 41); t = bc0;
- bc0 = st[19]; st[19] = Rotl(t, 56); t = bc0;
- bc0 = st[13]; st[13] = Rotl(t, 8); t = bc0;
- bc0 = st[12]; st[12] = Rotl(t, 25); t = bc0;
- bc0 = st[2]; st[2] = Rotl(t, 43); t = bc0;
- bc0 = st[20]; st[20] = Rotl(t, 62); t = bc0;
- bc0 = st[14]; st[14] = Rotl(t, 18); t = bc0;
- bc0 = st[22]; st[22] = Rotl(t, 39); t = bc0;
- bc0 = st[9]; st[9] = Rotl(t, 61); t = bc0;
- bc0 = st[6]; st[6] = Rotl(t, 20); t = bc0;
- st[1] = Rotl(t, 44);
+ bc0 = st[10]; st[10] = std::rotl(t, 1); t = bc0;
+ bc0 = st[7]; st[7] = std::rotl(t, 3); t = bc0;
+ bc0 = st[11]; st[11] = std::rotl(t, 6); t = bc0;
+ bc0 = st[17]; st[17] = std::rotl(t, 10); t = bc0;
+ bc0 = st[18]; st[18] = std::rotl(t, 15); t = bc0;
+ bc0 = st[3]; st[3] = std::rotl(t, 21); t = bc0;
+ bc0 = st[5]; st[5] = std::rotl(t, 28); t = bc0;
+ bc0 = st[16]; st[16] = std::rotl(t, 36); t = bc0;
+ bc0 = st[8]; st[8] = std::rotl(t, 45); t = bc0;
+ bc0 = st[21]; st[21] = std::rotl(t, 55); t = bc0;
+ bc0 = st[24]; st[24] = std::rotl(t, 2); t = bc0;
+ bc0 = st[4]; st[4] = std::rotl(t, 14); t = bc0;
+ bc0 = st[15]; st[15] = std::rotl(t, 27); t = bc0;
+ bc0 = st[23]; st[23] = std::rotl(t, 41); t = bc0;
+ bc0 = st[19]; st[19] = std::rotl(t, 56); t = bc0;
+ bc0 = st[13]; st[13] = std::rotl(t, 8); t = bc0;
+ bc0 = st[12]; st[12] = std::rotl(t, 25); t = bc0;
+ bc0 = st[2]; st[2] = std::rotl(t, 43); t = bc0;
+ bc0 = st[20]; st[20] = std::rotl(t, 62); t = bc0;
+ bc0 = st[14]; st[14] = std::rotl(t, 18); t = bc0;
+ bc0 = st[22]; st[22] = std::rotl(t, 39); t = bc0;
+ bc0 = st[9]; st[9] = std::rotl(t, 61); t = bc0;
+ bc0 = st[6]; st[6] = std::rotl(t, 20); t = bc0;
+ st[1] = std::rotl(t, 44);
// Chi Iota
bc0 = st[0]; bc1 = st[1]; bc2 = st[2]; bc3 = st[3]; bc4 = st[4];
diff --git a/src/crypto/siphash.cpp b/src/crypto/siphash.cpp
index 2c328d0840..8004a0548e 100644
--- a/src/crypto/siphash.cpp
+++ b/src/crypto/siphash.cpp
@@ -4,15 +4,15 @@
#include <crypto/siphash.h>
-#define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (b))))
+#include <bit>
#define SIPROUND do { \
- v0 += v1; v1 = ROTL(v1, 13); v1 ^= v0; \
- v0 = ROTL(v0, 32); \
- v2 += v3; v3 = ROTL(v3, 16); v3 ^= v2; \
- v0 += v3; v3 = ROTL(v3, 21); v3 ^= v0; \
- v2 += v1; v1 = ROTL(v1, 17); v1 ^= v2; \
- v2 = ROTL(v2, 32); \
+ v0 += v1; v1 = std::rotl(v1, 13); v1 ^= v0; \
+ v0 = std::rotl(v0, 32); \
+ v2 += v3; v3 = std::rotl(v3, 16); v3 ^= v2; \
+ v0 += v3; v3 = std::rotl(v3, 21); v3 ^= v0; \
+ v2 += v1; v1 = std::rotl(v1, 17); v1 ^= v2; \
+ v2 = std::rotl(v2, 32); \
} while (0)
CSipHasher::CSipHasher(uint64_t k0, uint64_t k1)
diff --git a/src/hash.cpp b/src/hash.cpp
index 1ece8c5a79..78a969ecd3 100644
--- a/src/hash.cpp
+++ b/src/hash.cpp
@@ -7,13 +7,9 @@
#include <crypto/common.h>
#include <crypto/hmac_sha512.h>
+#include <bit>
#include <string>
-inline uint32_t ROTL32(uint32_t x, int8_t r)
-{
- return (x << r) | (x >> (32 - r));
-}
-
unsigned int MurmurHash3(unsigned int nHashSeed, Span<const unsigned char> vDataToHash)
{
// The following is MurmurHash3 (x86_32), see https://github.com/aappleby/smhasher/blob/master/src/MurmurHash3.cpp
@@ -31,11 +27,11 @@ unsigned int MurmurHash3(unsigned int nHashSeed, Span<const unsigned char> vData
uint32_t k1 = ReadLE32(blocks + i*4);
k1 *= c1;
- k1 = ROTL32(k1, 15);
+ k1 = std::rotl(k1, 15);
k1 *= c2;
h1 ^= k1;
- h1 = ROTL32(h1, 13);
+ h1 = std::rotl(h1, 13);
h1 = h1 * 5 + 0xe6546b64;
}
@@ -55,7 +51,7 @@ unsigned int MurmurHash3(unsigned int nHashSeed, Span<const unsigned char> vData
case 1:
k1 ^= tail[0];
k1 *= c1;
- k1 = ROTL32(k1, 15);
+ k1 = std::rotl(k1, 15);
k1 *= c2;
h1 ^= k1;
}
diff --git a/src/headerssync.cpp b/src/headerssync.cpp
index 234fc8da60..e14de004f5 100644
--- a/src/headerssync.cpp
+++ b/src/headerssync.cpp
@@ -5,8 +5,8 @@
#include <headerssync.h>
#include <logging.h>
#include <pow.h>
-#include <timedata.h>
#include <util/check.h>
+#include <util/time.h>
#include <util/vector.h>
// The two constants below are computed using the simulation script in
@@ -41,7 +41,7 @@ HeadersSyncState::HeadersSyncState(NodeId id, const Consensus::Params& consensus
// exceeds this bound, because it's not possible for a consensus-valid
// chain to be longer than this (at the current time -- in the future we
// could try again, if necessary, to sync a longer chain).
- m_max_commitments = 6*(Ticks<std::chrono::seconds>(GetAdjustedTime() - NodeSeconds{std::chrono::seconds{chain_start->GetMedianTimePast()}}) + MAX_FUTURE_BLOCK_TIME) / HEADER_COMMITMENT_PERIOD;
+ m_max_commitments = 6*(Ticks<std::chrono::seconds>(NodeClock::now() - NodeSeconds{std::chrono::seconds{chain_start->GetMedianTimePast()}}) + MAX_FUTURE_BLOCK_TIME) / HEADER_COMMITMENT_PERIOD;
LogPrint(BCLog::NET, "Initial headers sync started with peer=%d: height=%i, max_commitments=%i, min_work=%s\n", m_id, m_current_height, m_max_commitments, m_minimum_required_work.ToString());
}
diff --git a/src/httpserver.cpp b/src/httpserver.cpp
index e26ea6a596..71134d442f 100644
--- a/src/httpserver.cpp
+++ b/src/httpserver.cpp
@@ -463,7 +463,7 @@ bool InitHTTPServer(const util::SignalInterrupt& interrupt)
LogPrint(BCLog::HTTP, "Initialized HTTP server\n");
int workQueueDepth = std::max((long)gArgs.GetIntArg("-rpcworkqueue", DEFAULT_HTTP_WORKQUEUE), 1L);
- LogPrintfCategory(BCLog::HTTP, "creating work queue of depth %d\n", workQueueDepth);
+ LogDebug(BCLog::HTTP, "creating work queue of depth %d\n", workQueueDepth);
g_work_queue = std::make_unique<WorkQueue<HTTPClosure>>(workQueueDepth);
// transfer ownership to eventBase/HTTP via .release()
@@ -485,9 +485,8 @@ static std::vector<std::thread> g_thread_http_workers;
void StartHTTPServer()
{
- LogPrint(BCLog::HTTP, "Starting HTTP server\n");
int rpcThreads = std::max((long)gArgs.GetIntArg("-rpcthreads", DEFAULT_HTTP_THREADS), 1L);
- LogPrintfCategory(BCLog::HTTP, "starting %d worker threads\n", rpcThreads);
+ LogInfo("Starting HTTP server with %d worker threads\n", rpcThreads);
g_thread_http = std::thread(ThreadHTTP, eventBase);
for (int i = 0; i < rpcThreads; i++) {
diff --git a/src/i2p.cpp b/src/i2p.cpp
index 685b43ba18..02f2c1cea2 100644
--- a/src/i2p.cpp
+++ b/src/i2p.cpp
@@ -217,6 +217,7 @@ bool Session::Connect(const CService& to, Connection& conn, bool& proxy_error)
// Refuse connecting to arbitrary ports. We don't specify any destination port to the SAM proxy
// when connecting (SAM 3.1 does not use ports) and it forces/defaults it to I2P_SAM31_PORT.
if (to.GetPort() != I2P_SAM31_PORT) {
+ Log("Error connecting to %s, connection refused due to arbitrary port %s", to.ToStringAddrPort(), to.GetPort());
proxy_error = false;
return false;
}
@@ -392,7 +393,7 @@ Binary Session::MyDestination() const
}
memcpy(&cert_len, &m_private_key.at(CERT_LEN_POS), sizeof(cert_len));
- cert_len = be16toh(cert_len);
+ cert_len = be16toh_internal(cert_len);
const size_t dest_len = DEST_LEN_BASE + cert_len;
@@ -427,7 +428,7 @@ void Session::CreateIfNotCreatedAlready()
const Reply& reply = SendRequestAndGetReply(
*sock,
strprintf("SESSION CREATE STYLE=STREAM ID=%s DESTINATION=TRANSIENT SIGNATURE_TYPE=7 "
- "inbound.quantity=1 outbound.quantity=1",
+ "i2cp.leaseSetEncType=4,0 inbound.quantity=1 outbound.quantity=1",
session_id));
m_private_key = DecodeI2PBase64(reply.Get("DESTINATION"));
@@ -445,7 +446,7 @@ void Session::CreateIfNotCreatedAlready()
SendRequestAndGetReply(*sock,
strprintf("SESSION CREATE STYLE=STREAM ID=%s DESTINATION=%s "
- "inbound.quantity=3 outbound.quantity=3",
+ "i2cp.leaseSetEncType=4,0 inbound.quantity=3 outbound.quantity=3",
session_id,
private_key_b64));
}
diff --git a/src/index/base.cpp b/src/index/base.cpp
index bcfe7215be..2287437f8f 100644
--- a/src/index/base.cpp
+++ b/src/index/base.cpp
@@ -89,7 +89,7 @@ bool BaseIndex::Init()
return &m_chain->context()->chainman->GetChainstateForIndexing());
// Register to validation interface before setting the 'm_synced' flag, so that
// callbacks are not missed once m_synced is true.
- RegisterValidationInterface(this);
+ m_chain->context()->validation_signals->RegisterValidationInterface(this);
CBlockLocator locator;
if (!GetDB().ReadBestBlock(locator)) {
@@ -380,7 +380,7 @@ bool BaseIndex::BlockUntilSyncedToCurrentChain() const
}
LogPrintf("%s: %s is catching up on block notifications\n", __func__, GetName());
- SyncWithValidationInterfaceQueue();
+ m_chain->context()->validation_signals->SyncWithValidationInterfaceQueue();
return true;
}
@@ -399,7 +399,9 @@ bool BaseIndex::StartBackgroundSync()
void BaseIndex::Stop()
{
- UnregisterValidationInterface(this);
+ if (m_chain->context()->validation_signals) {
+ m_chain->context()->validation_signals->UnregisterValidationInterface(this);
+ }
if (m_thread_sync.joinable()) {
m_thread_sync.join();
diff --git a/src/init.cpp b/src/init.cpp
index 481d5d398d..9ea7b881cb 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -291,7 +291,7 @@ void Shutdown(NodeContext& node)
// Because these depend on each-other, we make sure that neither can be
// using the other before destroying them.
- if (node.peerman) UnregisterValidationInterface(node.peerman.get());
+ if (node.peerman && node.validation_signals) node.validation_signals->UnregisterValidationInterface(node.peerman.get());
if (node.connman) node.connman->Stop();
StopTorControl();
@@ -313,11 +313,13 @@ void Shutdown(NodeContext& node)
DumpMempool(*node.mempool, MempoolPath(*node.args));
}
- // Drop transactions we were still watching, record fee estimations and Unregister
+ // Drop transactions we were still watching, record fee estimations and unregister
// fee estimator from validation interface.
if (node.fee_estimator) {
node.fee_estimator->Flush();
- UnregisterValidationInterface(node.fee_estimator.get());
+ if (node.validation_signals) {
+ node.validation_signals->UnregisterValidationInterface(node.fee_estimator.get());
+ }
}
// FlushStateToDisk generates a ChainStateFlushed callback, which we should avoid missing
@@ -332,7 +334,7 @@ void Shutdown(NodeContext& node)
// After there are no more peers/RPC left to give us new data which may generate
// CValidationInterface callbacks, flush them...
- GetMainSignals().FlushBackgroundCallbacks();
+ if (node.validation_signals) node.validation_signals->FlushBackgroundCallbacks();
// Stop and delete all indexes only after flushing background callbacks.
if (g_txindex) {
@@ -367,17 +369,19 @@ void Shutdown(NodeContext& node)
#if ENABLE_ZMQ
if (g_zmq_notification_interface) {
- UnregisterValidationInterface(g_zmq_notification_interface.get());
+ if (node.validation_signals) node.validation_signals->UnregisterValidationInterface(g_zmq_notification_interface.get());
g_zmq_notification_interface.reset();
}
#endif
node.chain_clients.clear();
- UnregisterAllValidationInterfaces();
- GetMainSignals().UnregisterBackgroundSignalScheduler();
+ if (node.validation_signals) {
+ node.validation_signals->UnregisterAllValidationInterfaces();
+ }
node.mempool.reset();
node.fee_estimator.reset();
node.chainman.reset();
+ node.validation_signals.reset();
node.scheduler.reset();
node.kernel.reset();
@@ -655,7 +659,6 @@ void SetupServerArgs(ArgsManager& argsman)
argsman.AddArg("-rpccookiefile=<loc>", "Location of the auth cookie. Relative paths will be prefixed by a net-specific datadir location. (default: data dir)", ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
argsman.AddArg("-rpcpassword=<pw>", "Password for JSON-RPC connections", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::RPC);
argsman.AddArg("-rpcport=<port>", strprintf("Listen for JSON-RPC connections on <port> (default: %u, testnet: %u, signet: %u, regtest: %u)", defaultBaseParams->RPCPort(), testnetBaseParams->RPCPort(), signetBaseParams->RPCPort(), regtestBaseParams->RPCPort()), ArgsManager::ALLOW_ANY | ArgsManager::NETWORK_ONLY, OptionsCategory::RPC);
- argsman.AddArg("-rpcserialversion", strprintf("Sets the serialization of raw transaction or block hex returned in non-verbose mode, non-segwit(0) (DEPRECATED) or segwit(1) (default: %d)", DEFAULT_RPC_SERIALIZE_VERSION), ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
argsman.AddArg("-rpcservertimeout=<n>", strprintf("Timeout during HTTP requests (default: %d)", DEFAULT_HTTP_SERVER_TIMEOUT), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::RPC);
argsman.AddArg("-rpcthreads=<n>", strprintf("Set the number of threads to service RPC calls (default: %d)", DEFAULT_HTTP_THREADS), ArgsManager::ALLOW_ANY, OptionsCategory::RPC);
argsman.AddArg("-rpcuser=<user>", "Username for JSON-RPC connections", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE, OptionsCategory::RPC);
@@ -1025,16 +1028,6 @@ bool AppInitParameterInteraction(const ArgsManager& args)
if (args.GetBoolArg("-peerbloomfilters", DEFAULT_PEERBLOOMFILTERS))
nLocalServices = ServiceFlags(nLocalServices | NODE_BLOOM);
- if (args.GetIntArg("-rpcserialversion", DEFAULT_RPC_SERIALIZE_VERSION) < 0)
- return InitError(Untranslated("rpcserialversion must be non-negative."));
-
- if (args.GetIntArg("-rpcserialversion", DEFAULT_RPC_SERIALIZE_VERSION) > 1)
- return InitError(Untranslated("Unknown rpcserialversion requested."));
-
- if (args.GetIntArg("-rpcserialversion", DEFAULT_RPC_SERIALIZE_VERSION) == 0 && !IsDeprecatedRPCEnabled("serialversion")) {
- return InitError(Untranslated("-rpcserialversion=0 is deprecated and will be removed in the future. Specify -deprecatedrpc=serialversion to allow anyway."));
- }
-
// Also report errors from parsing before daemonization
{
kernel::Notifications notifications{};
@@ -1149,17 +1142,18 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
assert(!node.scheduler);
node.scheduler = std::make_unique<CScheduler>();
+ auto& scheduler = *node.scheduler;
// Start the lightweight task scheduler thread
- node.scheduler->m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { node.scheduler->serviceQueue(); });
+ scheduler.m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { scheduler.serviceQueue(); });
// Gather some entropy once per minute.
- node.scheduler->scheduleEvery([]{
+ scheduler.scheduleEvery([]{
RandAddPeriodic();
}, std::chrono::minutes{1});
// Check disk space every 5 minutes to avoid db corruption.
- node.scheduler->scheduleEvery([&args, &node]{
+ scheduler.scheduleEvery([&args, &node]{
constexpr uint64_t min_disk_space = 50 << 20; // 50 MB
if (!CheckDiskSpace(args.GetBlocksDirPath(), min_disk_space)) {
LogPrintf("Shutting down due to lack of disk space!\n");
@@ -1169,7 +1163,9 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
}
}, std::chrono::minutes{5});
- GetMainSignals().RegisterBackgroundSignalScheduler(*node.scheduler);
+ assert(!node.validation_signals);
+ node.validation_signals = std::make_unique<ValidationSignals>(std::make_unique<SerialTaskRunner>(scheduler));
+ auto& validation_signals = *node.validation_signals;
// Create client interfaces for wallets that are supposed to be loaded
// according to -wallet and -disablewallet options. This only constructs
@@ -1274,8 +1270,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// Flush estimates to disk periodically
CBlockPolicyEstimator* fee_estimator = node.fee_estimator.get();
- node.scheduler->scheduleEvery([fee_estimator] { fee_estimator->FlushFeeEstimates(); }, FEE_FLUSH_INTERVAL);
- RegisterValidationInterface(fee_estimator);
+ scheduler.scheduleEvery([fee_estimator] { fee_estimator->FlushFeeEstimates(); }, FEE_FLUSH_INTERVAL);
+ validation_signals.RegisterValidationInterface(fee_estimator);
}
// Check port numbers
@@ -1446,7 +1442,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
});
if (g_zmq_notification_interface) {
- RegisterValidationInterface(g_zmq_notification_interface.get());
+ validation_signals.RegisterValidationInterface(g_zmq_notification_interface.get());
}
#endif
@@ -1459,8 +1455,8 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
ChainstateManager::Options chainman_opts{
.chainparams = chainparams,
.datadir = args.GetDataDirNet(),
- .adjusted_time_callback = GetAdjustedTime,
.notifications = *node.notifications,
+ .signals = &validation_signals,
};
Assert(ApplyArgsManOptions(args, chainman_opts)); // no error can happen, already checked in AppInitParameterInteraction
@@ -1490,6 +1486,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
CTxMemPool::Options mempool_opts{
.check_ratio = chainparams.DefaultConsistencyChecks() ? 1 : 0,
+ .signals = &validation_signals,
};
auto result{ApplyArgsManOptions(args, chainparams, mempool_opts)};
if (!result) {
@@ -1517,7 +1514,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// Drain the validation interface queue to ensure that the old indexes
// don't have any pending work.
- SyncWithValidationInterfaceQueue();
+ Assert(node.validation_signals)->SyncWithValidationInterfaceQueue();
for (auto* index : node.indexes) {
index->Interrupt();
@@ -1556,7 +1553,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
if (status == node::ChainstateLoadStatus::SUCCESS) {
uiInterface.InitMessage(_("Verifying blocks…").translated);
if (chainman.m_blockman.m_have_pruned && options.check_blocks > MIN_BLOCKS_TO_KEEP) {
- LogPrintfCategory(BCLog::PRUNE, "pruned datadir may not have more than %d blocks; only checking available blocks\n",
+ LogWarning("pruned datadir may not have more than %d blocks; only checking available blocks\n",
MIN_BLOCKS_TO_KEEP);
}
std::tie(status, error) = catch_exceptions([&]{ return VerifyLoadedChainstate(chainman, options);});
@@ -1606,7 +1603,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
node.peerman = PeerManager::make(*node.connman, *node.addrman,
node.banman.get(), chainman,
*node.mempool, peerman_opts);
- RegisterValidationInterface(node.peerman.get());
+ validation_signals.RegisterValidationInterface(node.peerman.get());
// ********************************************************* Step 8: start indexers
@@ -1754,13 +1751,15 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
// ********************************************************* Step 12: start node
//// debug print
+ int64_t best_block_time{};
{
LOCK(cs_main);
LogPrintf("block tree size = %u\n", chainman.BlockIndex().size());
chain_active_height = chainman.ActiveChain().Height();
+ best_block_time = chainman.ActiveChain().Tip() ? chainman.ActiveChain().Tip()->GetBlockTime() : chainman.GetParams().GenesisBlock().GetBlockTime();
if (tip_info) {
tip_info->block_height = chain_active_height;
- tip_info->block_time = chainman.ActiveChain().Tip() ? chainman.ActiveChain().Tip()->GetBlockTime() : chainman.GetParams().GenesisBlock().GetBlockTime();
+ tip_info->block_time = best_block_time;
tip_info->verification_progress = GuessVerificationProgress(chainman.GetParams().TxData(), chainman.ActiveChain().Tip());
}
if (tip_info && chainman.m_best_header) {
@@ -1769,7 +1768,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
}
}
LogPrintf("nBestHeight = %d\n", chain_active_height);
- if (node.peerman) node.peerman->SetBestHeight(chain_active_height);
+ if (node.peerman) node.peerman->SetBestBlock(chain_active_height, std::chrono::seconds{best_block_time});
// Map ports with UPnP or NAT-PMP.
StartMapPort(args.GetBoolArg("-upnp", DEFAULT_UPNP), args.GetBoolArg("-natpmp", DEFAULT_NATPMP));
@@ -1910,7 +1909,7 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
connOptions.m_i2p_accept_incoming = args.GetBoolArg("-i2pacceptincoming", DEFAULT_I2P_ACCEPT_INCOMING);
- if (!node.connman->Start(*node.scheduler, connOptions)) {
+ if (!node.connman->Start(scheduler, connOptions)) {
return false;
}
@@ -1930,15 +1929,15 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
uiInterface.InitMessage(_("Done loading").translated);
for (const auto& client : node.chain_clients) {
- client->start(*node.scheduler);
+ client->start(scheduler);
}
BanMan* banman = node.banman.get();
- node.scheduler->scheduleEvery([banman]{
+ scheduler.scheduleEvery([banman]{
banman->DumpBanlist();
}, DUMP_BANS_INTERVAL);
- if (node.peerman) node.peerman->StartScheduledTasks(*node.scheduler);
+ if (node.peerman) node.peerman->StartScheduledTasks(scheduler);
#if HAVE_SYSTEM
StartupNotify(args);
diff --git a/src/init/common.cpp b/src/init/common.cpp
index f3f7c696c5..0800cd93d8 100644
--- a/src/init/common.cpp
+++ b/src/init/common.cpp
@@ -31,7 +31,7 @@ void AddLoggingArgs(ArgsManager& argsman)
ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-debugexclude=<category>", "Exclude debug and trace logging for a category. Can be used in conjunction with -debug=1 to output debug and trace logging for all categories except the specified category. This option can be specified multiple times to exclude multiple categories.", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-logips", strprintf("Include IP addresses in debug output (default: %u)", DEFAULT_LOGIPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
- argsman.AddArg("-loglevel=<level>|<category>:<level>", strprintf("Set the global or per-category severity level for logging categories enabled with the -debug configuration option or the logging RPC: %s (default=%s); warning and error levels are always logged. If <category>:<level> is supplied, the setting will override the global one and may be specified multiple times to set multiple category-specific levels. <category> can be: %s.", LogInstance().LogLevelsString(), LogInstance().LogLevelToStr(BCLog::DEFAULT_LOG_LEVEL), LogInstance().LogCategoriesString()), ArgsManager::DISALLOW_NEGATION | ArgsManager::DISALLOW_ELISION | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
+ argsman.AddArg("-loglevel=<level>|<category>:<level>", strprintf("Set the global or per-category severity level for logging categories enabled with the -debug configuration option or the logging RPC. Possible values are %s (default=%s). The following levels are always logged: error, warning, info. If <category>:<level> is supplied, the setting will override the global one and may be specified multiple times to set multiple category-specific levels. <category> can be: %s.", LogInstance().LogLevelsString(), LogInstance().LogLevelToStr(BCLog::DEFAULT_LOG_LEVEL), LogInstance().LogCategoriesString()), ArgsManager::DISALLOW_NEGATION | ArgsManager::DISALLOW_ELISION | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-logtimestamps", strprintf("Prepend debug output with timestamp (default: %u)", DEFAULT_LOGTIMESTAMPS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
#ifdef HAVE_THREAD_LOCAL
argsman.AddArg("-logthreadnames", strprintf("Prepend debug output with name of the originating thread (only available on platforms supporting thread_local) (default: %u)", DEFAULT_LOGTHREADNAMES), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
@@ -40,6 +40,7 @@ void AddLoggingArgs(ArgsManager& argsman)
#endif
argsman.AddArg("-logsourcelocations", strprintf("Prepend debug output with name of the originating source location (source file, line number and function name) (default: %u)", DEFAULT_LOGSOURCELOCATIONS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-logtimemicros", strprintf("Add microsecond precision to debug timestamps (default: %u)", DEFAULT_LOGTIMEMICROS), ArgsManager::ALLOW_ANY | ArgsManager::DEBUG_ONLY, OptionsCategory::DEBUG_TEST);
+ argsman.AddArg("-loglevelalways", strprintf("Always prepend a category and level (default: %u)", DEFAULT_LOGLEVELALWAYS), ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-printtoconsole", "Send trace/debug info to console (default: 1 when no -daemon. To disable logging to file, set -nodebuglogfile)", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
argsman.AddArg("-shrinkdebugfile", "Shrink debug.log file on client startup (default: 1 when no -debug)", ArgsManager::ALLOW_ANY, OptionsCategory::DEBUG_TEST);
}
@@ -55,6 +56,7 @@ void SetLoggingOptions(const ArgsManager& args)
LogInstance().m_log_threadnames = args.GetBoolArg("-logthreadnames", DEFAULT_LOGTHREADNAMES);
#endif
LogInstance().m_log_sourcelocations = args.GetBoolArg("-logsourcelocations", DEFAULT_LOGSOURCELOCATIONS);
+ LogInstance().m_always_print_category_level = args.GetBoolArg("-loglevelalways", DEFAULT_LOGLEVELALWAYS);
fLogIPs = args.GetBoolArg("-logips", DEFAULT_LOGIPS);
}
diff --git a/src/interfaces/chain.h b/src/interfaces/chain.h
index 328399c4ad..9da5cb9637 100644
--- a/src/interfaces/chain.h
+++ b/src/interfaces/chain.h
@@ -335,9 +335,6 @@ public:
//! Run function after given number of seconds. Cancel any previous calls with same name.
virtual void rpcRunLater(const std::string& name, std::function<void()> fn, int64_t seconds) = 0;
- //! Current RPC serialization flags.
- virtual bool rpcSerializationWithoutWitness() = 0;
-
//! Get settings value.
virtual common::SettingsValue getSetting(const std::string& arg) = 0;
diff --git a/src/ipc/capnp/common-types.h b/src/ipc/capnp/common-types.h
new file mode 100644
index 0000000000..39e368491b
--- /dev/null
+++ b/src/ipc/capnp/common-types.h
@@ -0,0 +1,108 @@
+// Copyright (c) 2023 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_IPC_CAPNP_COMMON_TYPES_H
+#define BITCOIN_IPC_CAPNP_COMMON_TYPES_H
+
+#include <clientversion.h>
+#include <streams.h>
+#include <univalue.h>
+
+#include <cstddef>
+#include <mp/proxy-types.h>
+#include <type_traits>
+#include <utility>
+
+namespace ipc {
+namespace capnp {
+//! Use SFINAE to define Serializeable<T> trait which is true if type T has a
+//! Serialize(stream) method, false otherwise.
+template <typename T>
+struct Serializable {
+private:
+ template <typename C>
+ static std::true_type test(decltype(std::declval<C>().Serialize(std::declval<std::nullptr_t&>()))*);
+ template <typename>
+ static std::false_type test(...);
+
+public:
+ static constexpr bool value = decltype(test<T>(nullptr))::value;
+};
+
+//! Use SFINAE to define Unserializeable<T> trait which is true if type T has
+//! an Unserialize(stream) method, false otherwise.
+template <typename T>
+struct Unserializable {
+private:
+ template <typename C>
+ static std::true_type test(decltype(std::declval<C>().Unserialize(std::declval<std::nullptr_t&>()))*);
+ template <typename>
+ static std::false_type test(...);
+
+public:
+ static constexpr bool value = decltype(test<T>(nullptr))::value;
+};
+} // namespace capnp
+} // namespace ipc
+
+//! Functions to serialize / deserialize common bitcoin types.
+namespace mp {
+//! Overload multiprocess library's CustomBuildField hook to allow any
+//! serializable object to be stored in a capnproto Data field or passed to a
+//! canproto interface. Use Priority<1> so this hook has medium priority, and
+//! higher priority hooks could take precedence over this one.
+template <typename LocalType, typename Value, typename Output>
+void CustomBuildField(
+ TypeList<LocalType>, Priority<1>, InvokeContext& invoke_context, Value&& value, Output&& output,
+ // Enable if serializeable and if LocalType is not cv or reference
+ // qualified. If LocalType is cv or reference qualified, it is important to
+ // fall back to lower-priority Priority<0> implementation of this function
+ // that strips cv references, to prevent this CustomBuildField overload from
+ // taking precedence over more narrow overloads for specific LocalTypes.
+ std::enable_if_t<ipc::capnp::Serializable<LocalType>::value &&
+ std::is_same_v<LocalType, std::remove_cv_t<std::remove_reference_t<LocalType>>>>* enable = nullptr)
+{
+ DataStream stream;
+ value.Serialize(stream);
+ auto result = output.init(stream.size());
+ memcpy(result.begin(), stream.data(), stream.size());
+}
+
+//! Overload multiprocess library's CustomReadField hook to allow any object
+//! with an Unserialize method to be read from a capnproto Data field or
+//! returned from canproto interface. Use Priority<1> so this hook has medium
+//! priority, and higher priority hooks could take precedence over this one.
+template <typename LocalType, typename Input, typename ReadDest>
+decltype(auto)
+CustomReadField(TypeList<LocalType>, Priority<1>, InvokeContext& invoke_context, Input&& input, ReadDest&& read_dest,
+ std::enable_if_t<ipc::capnp::Unserializable<LocalType>::value>* enable = nullptr)
+{
+ return read_dest.update([&](auto& value) {
+ if (!input.has()) return;
+ auto data = input.get();
+ SpanReader stream({data.begin(), data.end()});
+ value.Unserialize(stream);
+ });
+}
+
+template <typename Value, typename Output>
+void CustomBuildField(TypeList<UniValue>, Priority<1>, InvokeContext& invoke_context, Value&& value, Output&& output)
+{
+ std::string str = value.write();
+ auto result = output.init(str.size());
+ memcpy(result.begin(), str.data(), str.size());
+}
+
+template <typename Input, typename ReadDest>
+decltype(auto) CustomReadField(TypeList<UniValue>, Priority<1>, InvokeContext& invoke_context, Input&& input,
+ ReadDest&& read_dest)
+{
+ return read_dest.update([&](auto& value) {
+ auto data = input.get();
+ value.read(std::string_view{data.begin(), data.size()});
+ });
+}
+} // namespace mp
+
+#endif // BITCOIN_IPC_CAPNP_COMMON_TYPES_H
diff --git a/src/kernel/chainparams.cpp b/src/kernel/chainparams.cpp
index 56cb3a63a0..264a2fd681 100644
--- a/src/kernel/chainparams.cpp
+++ b/src/kernel/chainparams.cpp
@@ -104,8 +104,8 @@ public:
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1628640000; // August 11th, 2021
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 709632; // Approximately November 12th, 2021
- consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000052b2559353df4117b7348b64");
- consensus.defaultAssumeValid = uint256S("0x00000000000000000001a0a448d6cf2546b06801389cc030b2b18c6491266815"); // 804000
+ consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000063c4ebd298db40af57541800");
+ consensus.defaultAssumeValid = uint256S("0x000000000000000000026811d149d4d261995ec5b3f64f439a0a10e1a464af9a"); // 824000
/**
* The message start string is designed to be unlikely to occur in normal data.
@@ -118,8 +118,8 @@ public:
pchMessageStart[3] = 0xd9;
nDefaultPort = 8333;
nPruneAfterHeight = 100000;
- m_assumed_blockchain_size = 590;
- m_assumed_chain_state_size = 9;
+ m_assumed_blockchain_size = 600;
+ m_assumed_chain_state_size = 10;
genesis = CreateGenesisBlock(1231006505, 2083236893, 0x1d00ffff, 1, 50 * COIN);
consensus.hashGenesisBlock = genesis.GetHash();
@@ -177,10 +177,10 @@ public:
};
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 00000000000000000001a0a448d6cf2546b06801389cc030b2b18c6491266815
- .nTime = 1692502494,
- .nTxCount = 881818374,
- .dTxRate = 5.521964628130412,
+ // Data from RPC: getchaintxstats 4096 000000000000000000026811d149d4d261995ec5b3f64f439a0a10e1a464af9a
+ .nTime = 1704194835,
+ .nTxCount = 946728933,
+ .dTxRate = 6.569290261471664,
};
}
};
@@ -222,8 +222,8 @@ public:
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].nTimeout = 1628640000; // August 11th, 2021
consensus.vDeployments[Consensus::DEPLOYMENT_TAPROOT].min_activation_height = 0; // No activation delay
- consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000b6a51f415a67c0da307");
- consensus.defaultAssumeValid = uint256S("0x0000000000000093bcb68c03a9a168ae252572d348a2eaeba2cdf9231d73206f"); // 2500000
+ consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000c59b14e264ba6c15db9");
+ consensus.defaultAssumeValid = uint256S("0x000000000001323071f38f21ea5aae529ece491eadaccce506a59bcc2d968917"); // 2550000
pchMessageStart[0] = 0x0b;
pchMessageStart[1] = 0x11;
@@ -276,10 +276,10 @@ public:
};
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 0000000000000093bcb68c03a9a168ae252572d348a2eaeba2cdf9231d73206f
- .nTime = 1694733634,
- .nTxCount = 66484552,
- .dTxRate = 0.1804908356632494,
+ // Data from RPC: getchaintxstats 4096 000000000001323071f38f21ea5aae529ece491eadaccce506a59bcc2d968917
+ .nTime = 1703579240,
+ .nTxCount = 67845391,
+ .dTxRate = 1.464436832560951,
};
}
};
@@ -302,15 +302,15 @@ public:
vSeeds.emplace_back("178.128.221.177");
vSeeds.emplace_back("v7ajjeirttkbnt32wpy3c6w3emwnfr3fkla7hpxcfokr3ysd3kqtzmqd.onion:38333");
- consensus.nMinimumChainWork = uint256S("0x000000000000000000000000000000000000000000000000000001ad46be4862");
- consensus.defaultAssumeValid = uint256S("0x0000013d778ba3f914530f11f6b69869c9fab54acff85acd7b8201d111f19b7f"); // 150000
+ consensus.nMinimumChainWork = uint256S("0x00000000000000000000000000000000000000000000000000000206e86f08e8");
+ consensus.defaultAssumeValid = uint256S("0x0000000870f15246ba23c16e370a7ffb1fc8a3dcf8cb4492882ed4b0e3d4cd26"); // 180000
m_assumed_blockchain_size = 1;
m_assumed_chain_state_size = 0;
chainTxData = ChainTxData{
- // Data from RPC: getchaintxstats 4096 0000013d778ba3f914530f11f6b69869c9fab54acff85acd7b8201d111f19b7f
- .nTime = 1688366339,
- .nTxCount = 2262750,
- .dTxRate = 0.003414084572046456,
+ // Data from RPC: getchaintxstats 4096 0000000870f15246ba23c16e370a7ffb1fc8a3dcf8cb4492882ed4b0e3d4cd26
+ .nTime = 1706331472,
+ .nTxCount = 2425380,
+ .dTxRate = 0.008277759863833788,
};
} else {
bin = *options.challenge;
@@ -501,9 +501,9 @@ public:
{
// For use by test/functional/feature_assumeutxo.py
.height = 299,
- .hash_serialized = AssumeutxoHash{uint256S("0x61d9c2b29a2571a5fe285fe2d8554f91f93309666fc9b8223ee96338de25ff53")},
- .nChainTx = 300,
- .blockhash = uint256S("0x7e0517ef3ea6ecbed9117858e42eedc8eb39e8698a38dcbd1b3962a283233f4c")
+ .hash_serialized = AssumeutxoHash{uint256S("0xa4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27")},
+ .nChainTx = 334,
+ .blockhash = uint256S("0x3bb7ce5eba0be48939b7a521ac1ba9316afee2c7bada3a0cca24188e6d7d96c0")
},
};
diff --git a/src/kernel/chainstatemanager_opts.h b/src/kernel/chainstatemanager_opts.h
index ee20eabd79..de5f78494a 100644
--- a/src/kernel/chainstatemanager_opts.h
+++ b/src/kernel/chainstatemanager_opts.h
@@ -18,6 +18,7 @@
#include <optional>
class CChainParams;
+class ValidationSignals;
static constexpr bool DEFAULT_CHECKPOINTS_ENABLED{true};
static constexpr auto DEFAULT_MAX_TIP_AGE{24h};
@@ -32,7 +33,6 @@ namespace kernel {
struct ChainstateManagerOpts {
const CChainParams& chainparams;
fs::path datadir;
- const std::function<NodeClock::time_point()> adjusted_time_callback{nullptr};
std::optional<bool> check_block_index{};
bool checkpoints_enabled{DEFAULT_CHECKPOINTS_ENABLED};
//! If set, it will override the minimum work we will assume exists on some valid chain.
@@ -45,6 +45,7 @@ struct ChainstateManagerOpts {
DBOptions coins_db{};
CoinsViewOptions coins_view{};
Notifications& notifications;
+ ValidationSignals* signals{nullptr};
//! Number of script check worker threads. Zero means no parallel verification.
int worker_threads_num{0};
};
diff --git a/src/kernel/mempool_entry.h b/src/kernel/mempool_entry.h
index bd39c9cc5f..2adeaea652 100644
--- a/src/kernel/mempool_entry.h
+++ b/src/kernel/mempool_entry.h
@@ -226,7 +226,7 @@ struct NewMempoolTransactionInfo {
* This boolean indicates whether the transaction was added
* without enforcing mempool fee limits.
*/
- const bool m_from_disconnected_block;
+ const bool m_mempool_limit_bypassed;
/* This boolean indicates whether the transaction is part of a package. */
const bool m_submitted_in_package;
/*
@@ -239,11 +239,11 @@ struct NewMempoolTransactionInfo {
explicit NewMempoolTransactionInfo(const CTransactionRef& tx, const CAmount& fee,
const int64_t vsize, const unsigned int height,
- const bool from_disconnected_block, const bool submitted_in_package,
+ const bool mempool_limit_bypassed, const bool submitted_in_package,
const bool chainstate_is_current,
const bool has_no_mempool_parents)
: info{tx, fee, vsize, height},
- m_from_disconnected_block{from_disconnected_block},
+ m_mempool_limit_bypassed{mempool_limit_bypassed},
m_submitted_in_package{submitted_in_package},
m_chainstate_is_current{chainstate_is_current},
m_has_no_mempool_parents{has_no_mempool_parents} {}
diff --git a/src/kernel/mempool_options.h b/src/kernel/mempool_options.h
index 753aebd455..0850b2e60e 100644
--- a/src/kernel/mempool_options.h
+++ b/src/kernel/mempool_options.h
@@ -13,6 +13,8 @@
#include <cstdint>
#include <optional>
+class ValidationSignals;
+
/** Default for -maxmempool, maximum megabytes of mempool memory usage */
static constexpr unsigned int DEFAULT_MAX_MEMPOOL_SIZE_MB{300};
/** Default for -maxmempool when blocksonly is set */
@@ -56,6 +58,8 @@ struct MemPoolOptions {
bool full_rbf{DEFAULT_MEMPOOL_FULL_RBF};
bool persist_v1_dat{DEFAULT_PERSIST_V1_DAT};
MemPoolLimits limits{};
+
+ ValidationSignals* signals{nullptr};
};
} // namespace kernel
diff --git a/src/kernel/mempool_persist.cpp b/src/kernel/mempool_persist.cpp
index 0808d42452..57c5168e9f 100644
--- a/src/kernel/mempool_persist.cpp
+++ b/src/kernel/mempool_persist.cpp
@@ -67,10 +67,20 @@ bool LoadMempool(CTxMemPool& pool, const fs::path& load_path, Chainstate& active
return false;
}
file.SetXor(xor_key);
- uint64_t num;
- file >> num;
- while (num) {
- --num;
+ uint64_t total_txns_to_load;
+ file >> total_txns_to_load;
+ uint64_t txns_tried = 0;
+ LogInfo("Loading %u mempool transactions from disk...\n", total_txns_to_load);
+ int next_tenth_to_report = 0;
+ while (txns_tried < total_txns_to_load) {
+ const int percentage_done(100.0 * txns_tried / total_txns_to_load);
+ if (next_tenth_to_report < percentage_done / 10) {
+ LogInfo("Progress loading mempool transactions from disk: %d%% (tried %u, %u remaining)\n",
+ percentage_done, txns_tried, total_txns_to_load - txns_tried);
+ next_tenth_to_report = percentage_done / 10;
+ }
+ ++txns_tried;
+
CTransactionRef tx;
int64_t nTime;
int64_t nFeeDelta;
@@ -195,7 +205,7 @@ bool DumpMempool(const CTxMemPool& pool, const fs::path& dump_path, FopenFn mock
}
auto last = SteadyClock::now();
- LogPrintf("Dumped mempool: %gs to copy, %gs to dump\n",
+ LogPrintf("Dumped mempool: %.3fs to copy, %.3fs to dump\n",
Ticks<SecondsDouble>(mid - start),
Ticks<SecondsDouble>(last - mid));
} catch (const std::exception& e) {
diff --git a/src/key.cpp b/src/key.cpp
index 0f283ca3e3..2bd6396298 100644
--- a/src/key.cpp
+++ b/src/key.cpp
@@ -179,7 +179,7 @@ CPrivKey CKey::GetPrivKey() const {
size_t seckeylen;
seckey.resize(SIZE);
seckeylen = SIZE;
- ret = ec_seckey_export_der(secp256k1_context_sign, seckey.data(), &seckeylen, begin(), fCompressed);
+ ret = ec_seckey_export_der(secp256k1_context_sign, seckey.data(), &seckeylen, UCharCast(begin()), fCompressed);
assert(ret);
seckey.resize(seckeylen);
return seckey;
@@ -190,7 +190,7 @@ CPubKey CKey::GetPubKey() const {
secp256k1_pubkey pubkey;
size_t clen = CPubKey::SIZE;
CPubKey result;
- int ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &pubkey, begin());
+ int ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &pubkey, UCharCast(begin()));
assert(ret);
secp256k1_ec_pubkey_serialize(secp256k1_context_sign, (unsigned char*)result.begin(), &clen, &pubkey, fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED);
assert(result.size() == clen);
@@ -220,19 +220,19 @@ bool CKey::Sign(const uint256 &hash, std::vector<unsigned char>& vchSig, bool gr
WriteLE32(extra_entropy, test_case);
secp256k1_ecdsa_signature sig;
uint32_t counter = 0;
- int ret = secp256k1_ecdsa_sign(secp256k1_context_sign, &sig, hash.begin(), begin(), secp256k1_nonce_function_rfc6979, (!grind && test_case) ? extra_entropy : nullptr);
+ int ret = secp256k1_ecdsa_sign(secp256k1_context_sign, &sig, hash.begin(), UCharCast(begin()), secp256k1_nonce_function_rfc6979, (!grind && test_case) ? extra_entropy : nullptr);
// Grind for low R
while (ret && !SigHasLowR(&sig) && grind) {
WriteLE32(extra_entropy, ++counter);
- ret = secp256k1_ecdsa_sign(secp256k1_context_sign, &sig, hash.begin(), begin(), secp256k1_nonce_function_rfc6979, extra_entropy);
+ ret = secp256k1_ecdsa_sign(secp256k1_context_sign, &sig, hash.begin(), UCharCast(begin()), secp256k1_nonce_function_rfc6979, extra_entropy);
}
assert(ret);
secp256k1_ecdsa_signature_serialize_der(secp256k1_context_sign, vchSig.data(), &nSigLen, &sig);
vchSig.resize(nSigLen);
// Additional verification step to prevent using a potentially corrupted signature
secp256k1_pubkey pk;
- ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &pk, begin());
+ ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &pk, UCharCast(begin()));
assert(ret);
ret = secp256k1_ecdsa_verify(secp256k1_context_static, &sig, hash.begin(), &pk);
assert(ret);
@@ -258,7 +258,7 @@ bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig)
vchSig.resize(CPubKey::COMPACT_SIGNATURE_SIZE);
int rec = -1;
secp256k1_ecdsa_recoverable_signature rsig;
- int ret = secp256k1_ecdsa_sign_recoverable(secp256k1_context_sign, &rsig, hash.begin(), begin(), secp256k1_nonce_function_rfc6979, nullptr);
+ int ret = secp256k1_ecdsa_sign_recoverable(secp256k1_context_sign, &rsig, hash.begin(), UCharCast(begin()), secp256k1_nonce_function_rfc6979, nullptr);
assert(ret);
ret = secp256k1_ecdsa_recoverable_signature_serialize_compact(secp256k1_context_sign, &vchSig[1], &rec, &rsig);
assert(ret);
@@ -266,7 +266,7 @@ bool CKey::SignCompact(const uint256 &hash, std::vector<unsigned char>& vchSig)
vchSig[0] = 27 + rec + (fCompressed ? 4 : 0);
// Additional verification step to prevent using a potentially corrupted signature
secp256k1_pubkey epk, rpk;
- ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &epk, begin());
+ ret = secp256k1_ec_pubkey_create(secp256k1_context_sign, &epk, UCharCast(begin()));
assert(ret);
ret = secp256k1_ecdsa_recover(secp256k1_context_static, &rpk, &rsig, hash.begin());
assert(ret);
@@ -279,7 +279,7 @@ bool CKey::SignSchnorr(const uint256& hash, Span<unsigned char> sig, const uint2
{
assert(sig.size() == 64);
secp256k1_keypair keypair;
- if (!secp256k1_keypair_create(secp256k1_context_sign, &keypair, begin())) return false;
+ if (!secp256k1_keypair_create(secp256k1_context_sign, &keypair, UCharCast(begin()))) return false;
if (merkle_root) {
secp256k1_xonly_pubkey pubkey;
if (!secp256k1_keypair_xonly_pub(secp256k1_context_sign, &pubkey, nullptr, &keypair)) return false;
@@ -324,7 +324,7 @@ bool CKey::Derive(CKey& keyChild, ChainCode &ccChild, unsigned int nChild, const
BIP32Hash(cc, nChild, *pubkey.begin(), pubkey.begin()+1, vout.data());
} else {
assert(size() == 32);
- BIP32Hash(cc, nChild, 0, begin(), vout.data());
+ BIP32Hash(cc, nChild, 0, UCharCast(begin()), vout.data());
}
memcpy(ccChild.begin(), vout.data()+32, 32);
keyChild.Set(begin(), begin() + 32, true);
@@ -369,6 +369,13 @@ ECDHSecret CKey::ComputeBIP324ECDHSecret(const EllSwiftPubKey& their_ellswift, c
return output;
}
+CKey GenerateRandomKey(bool compressed) noexcept
+{
+ CKey key;
+ key.MakeNewKey(/*fCompressed=*/compressed);
+ return key;
+}
+
bool CExtKey::Derive(CExtKey &out, unsigned int _nChild) const {
if (nDepth == std::numeric_limits<unsigned char>::max()) return false;
out.nDepth = nDepth + 1;
@@ -420,8 +427,7 @@ void CExtKey::Decode(const unsigned char code[BIP32_EXTKEY_SIZE]) {
}
bool ECC_InitSanityCheck() {
- CKey key;
- key.MakeNewKey(true);
+ CKey key = GenerateRandomKey();
CPubKey pubkey = key.GetPubKey();
return key.VerifyPubKey(pubkey);
}
diff --git a/src/key.h b/src/key.h
index 785059da02..d6b26f891d 100644
--- a/src/key.h
+++ b/src/key.h
@@ -100,7 +100,7 @@ public:
{
if (size_t(pend - pbegin) != std::tuple_size_v<KeyType>) {
ClearKeyData();
- } else if (Check(&pbegin[0])) {
+ } else if (Check(UCharCast(&pbegin[0]))) {
MakeKeyData();
memcpy(keydata->data(), (unsigned char*)&pbegin[0], keydata->size());
fCompressed = fCompressedIn;
@@ -112,8 +112,8 @@ public:
//! Simple read-only vector-like interface.
unsigned int size() const { return keydata ? keydata->size() : 0; }
const std::byte* data() const { return keydata ? reinterpret_cast<const std::byte*>(keydata->data()) : nullptr; }
- const unsigned char* begin() const { return keydata ? keydata->data() : nullptr; }
- const unsigned char* end() const { return begin() + size(); }
+ const std::byte* begin() const { return data(); }
+ const std::byte* end() const { return data() + size(); }
//! Check whether this private key is valid.
bool IsValid() const { return !!keydata; }
@@ -205,6 +205,8 @@ public:
bool initiating) const;
};
+CKey GenerateRandomKey(bool compressed = true) noexcept;
+
struct CExtKey {
unsigned char nDepth;
unsigned char vchFingerprint[4];
diff --git a/src/key_io.cpp b/src/key_io.cpp
index 5bcbb8a069..a373a2201d 100644
--- a/src/key_io.cpp
+++ b/src/key_io.cpp
@@ -228,7 +228,7 @@ std::string EncodeSecret(const CKey& key)
{
assert(key.IsValid());
std::vector<unsigned char> data = Params().Base58Prefix(CChainParams::SECRET_KEY);
- data.insert(data.end(), key.begin(), key.end());
+ data.insert(data.end(), UCharCast(key.begin()), UCharCast(key.end()));
if (key.IsCompressed()) {
data.push_back(1);
}
diff --git a/src/logging.cpp b/src/logging.cpp
index 08bfa1f7a4..42f100ded6 100644
--- a/src/logging.cpp
+++ b/src/logging.cpp
@@ -126,9 +126,9 @@ bool BCLog::Logger::WillLogCategory(BCLog::LogFlags category) const
bool BCLog::Logger::WillLogCategoryLevel(BCLog::LogFlags category, BCLog::Level level) const
{
- // Log messages at Warning and Error level unconditionally, so that
+ // Log messages at Info, Warning and Error level unconditionally, so that
// important troubleshooting information doesn't get lost.
- if (level >= BCLog::Level::Warning) return true;
+ if (level >= BCLog::Level::Info) return true;
if (!WillLogCategory(category)) return false;
@@ -202,7 +202,7 @@ bool GetLogCategory(BCLog::LogFlags& flag, const std::string& str)
return false;
}
-std::string BCLog::Logger::LogLevelToStr(BCLog::Level level) const
+std::string BCLog::Logger::LogLevelToStr(BCLog::Level level)
{
switch (level) {
case BCLog::Level::Trace:
@@ -215,8 +215,6 @@ std::string BCLog::Logger::LogLevelToStr(BCLog::Level level) const
return "warning";
case BCLog::Level::Error:
return "error";
- case BCLog::Level::None:
- return "";
}
assert(false);
}
@@ -307,8 +305,6 @@ static std::optional<BCLog::Level> GetLogLevel(const std::string& level_str)
return BCLog::Level::Warning;
} else if (level_str == "error") {
return BCLog::Level::Error;
- } else if (level_str == "none") {
- return BCLog::Level::None;
} else {
return std::nullopt;
}
@@ -341,7 +337,7 @@ static constexpr std::array<BCLog::Level, 3> LogLevelsList()
std::string BCLog::Logger::LogLevelsString() const
{
const auto& levels = LogLevelsList();
- return Join(std::vector<BCLog::Level>{levels.begin(), levels.end()}, ", ", [this](BCLog::Level level) { return LogLevelToStr(level); });
+ return Join(std::vector<BCLog::Level>{levels.begin(), levels.end()}, ", ", [](BCLog::Level level) { return LogLevelToStr(level); });
}
std::string BCLog::Logger::LogTimestampStr(const std::string& str)
@@ -392,29 +388,39 @@ namespace BCLog {
}
} // namespace BCLog
-void BCLog::Logger::LogPrintStr(const std::string& str, const std::string& logging_function, const std::string& source_file, int source_line, BCLog::LogFlags category, BCLog::Level level)
+std::string BCLog::Logger::GetLogPrefix(BCLog::LogFlags category, BCLog::Level level) const
{
- StdLockGuard scoped_lock(m_cs);
- std::string str_prefixed = LogEscapeMessage(str);
+ if (category == LogFlags::NONE) category = LogFlags::ALL;
- if ((category != LogFlags::NONE || level != Level::None) && m_started_new_line) {
- std::string s{"["};
+ const bool has_category{m_always_print_category_level || category != LogFlags::ALL};
- if (category != LogFlags::NONE) {
- s += LogCategoryToStr(category);
- }
+ // If there is no category, Info is implied
+ if (!has_category && level == Level::Info) return {};
- if (category != LogFlags::NONE && level != Level::None) {
- // Only add separator if both flag and level are not NONE
- s += ":";
- }
+ std::string s{"["};
+ if (has_category) {
+ s += LogCategoryToStr(category);
+ }
- if (level != Level::None) {
- s += LogLevelToStr(level);
- }
+ if (m_always_print_category_level || !has_category || level != Level::Debug) {
+ // If there is a category, Debug is implied, so don't add the level
+
+ // Only add separator if we have a category
+ if (has_category) s += ":";
+ s += Logger::LogLevelToStr(level);
+ }
+
+ s += "] ";
+ return s;
+}
- s += "] ";
- str_prefixed.insert(0, s);
+void BCLog::Logger::LogPrintStr(const std::string& str, const std::string& logging_function, const std::string& source_file, int source_line, BCLog::LogFlags category, BCLog::Level level)
+{
+ StdLockGuard scoped_lock(m_cs);
+ std::string str_prefixed = LogEscapeMessage(str);
+
+ if (m_started_new_line) {
+ str_prefixed.insert(0, GetLogPrefix(category, level));
}
if (m_log_sourcelocations && m_started_new_line) {
diff --git a/src/logging.h b/src/logging.h
index f7380d8928..525e0aec6d 100644
--- a/src/logging.h
+++ b/src/logging.h
@@ -25,6 +25,7 @@ static const bool DEFAULT_LOGIPS = false;
static const bool DEFAULT_LOGTIMESTAMPS = true;
static const bool DEFAULT_LOGTHREADNAMES = false;
static const bool DEFAULT_LOGSOURCELOCATIONS = false;
+static constexpr bool DEFAULT_LOGLEVELALWAYS = false;
extern const char * const DEFAULT_DEBUGLOGFILE;
extern bool fLogIPs;
@@ -77,7 +78,6 @@ namespace BCLog {
Info, // Default
Warning,
Error,
- None, // Internal use only
};
constexpr auto DEFAULT_LOG_LEVEL{Level::Debug};
@@ -120,10 +120,13 @@ namespace BCLog {
bool m_log_time_micros = DEFAULT_LOGTIMEMICROS;
bool m_log_threadnames = DEFAULT_LOGTHREADNAMES;
bool m_log_sourcelocations = DEFAULT_LOGSOURCELOCATIONS;
+ bool m_always_print_category_level = DEFAULT_LOGLEVELALWAYS;
fs::path m_file_path;
std::atomic<bool> m_reopen_file{false};
+ std::string GetLogPrefix(LogFlags category, Level level) const;
+
/** Send a string to the log output */
void LogPrintStr(const std::string& str, const std::string& logging_function, const std::string& source_file, int source_line, BCLog::LogFlags category, BCLog::Level level);
@@ -194,7 +197,7 @@ namespace BCLog {
std::string LogLevelsString() const;
//! Returns the string representation of a log level.
- std::string LogLevelToStr(BCLog::Level level) const;
+ static std::string LogLevelToStr(BCLog::Level level);
bool DefaultShrinkDebugFile() const;
};
@@ -234,22 +237,17 @@ static inline void LogPrintf_(const std::string& logging_function, const std::st
#define LogPrintLevel_(category, level, ...) LogPrintf_(__func__, __FILE__, __LINE__, category, level, __VA_ARGS__)
// Log unconditionally.
-#define LogPrintf(...) LogPrintLevel_(BCLog::LogFlags::NONE, BCLog::Level::None, __VA_ARGS__)
+#define LogInfo(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Info, __VA_ARGS__)
+#define LogWarning(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Warning, __VA_ARGS__)
+#define LogError(...) LogPrintLevel_(BCLog::LogFlags::ALL, BCLog::Level::Error, __VA_ARGS__)
-// Log unconditionally, prefixing the output with the passed category name.
-#define LogPrintfCategory(category, ...) LogPrintLevel_(category, BCLog::Level::None, __VA_ARGS__)
+// Deprecated unconditional logging.
+#define LogPrintf(...) LogInfo(__VA_ARGS__)
+#define LogPrintfCategory(category, ...) LogPrintLevel_(category, BCLog::Level::Info, __VA_ARGS__)
// Use a macro instead of a function for conditional logging to prevent
// evaluating arguments when logging for the category is not enabled.
-// Log conditionally, prefixing the output with the passed category name.
-#define LogPrint(category, ...) \
- do { \
- if (LogAcceptCategory((category), BCLog::Level::Debug)) { \
- LogPrintLevel_(category, BCLog::Level::None, __VA_ARGS__); \
- } \
- } while (0)
-
// Log conditionally, prefixing the output with the passed category name and severity level.
#define LogPrintLevel(category, level, ...) \
do { \
@@ -258,6 +256,13 @@ static inline void LogPrintf_(const std::string& logging_function, const std::st
} \
} while (0)
+// Log conditionally, prefixing the output with the passed category name.
+#define LogDebug(category, ...) LogPrintLevel(category, BCLog::Level::Debug, __VA_ARGS__)
+#define LogTrace(category, ...) LogPrintLevel(category, BCLog::Level::Trace, __VA_ARGS__)
+
+// Deprecated conditional logging
+#define LogPrint(category, ...) LogDebug(category, __VA_ARGS__)
+
template <typename... Args>
bool error(const char* fmt, const Args&... args)
{
diff --git a/src/net.cpp b/src/net.cpp
index 102d81579f..7c82f01d75 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -18,6 +18,7 @@
#include <consensus/consensus.h>
#include <crypto/sha256.h>
#include <i2p.h>
+#include <key.h>
#include <logging.h>
#include <memusage.h>
#include <net_permissions.h>
@@ -202,7 +203,7 @@ static std::vector<CAddress> ConvertSeeds(const std::vector<uint8_t> &vSeedsIn)
while (!s.eof()) {
CService endpoint;
s >> endpoint;
- CAddress addr{endpoint, GetDesirableServiceFlags(NODE_NONE)};
+ CAddress addr{endpoint, SeedsServiceFlags()};
addr.nTime = rng.rand_uniform_delay(Now<NodeSeconds>() - one_week, -one_week);
LogPrint(BCLog::NET, "Added hardcoded seed: %s\n", addr.ToStringAddrPort());
vSeedsOut.push_back(addr);
@@ -938,13 +939,6 @@ public:
const V2MessageMap V2_MESSAGE_MAP;
-CKey GenerateRandomKey() noexcept
-{
- CKey key;
- key.MakeNewKey(/*fCompressed=*/true);
- return key;
-}
-
std::vector<uint8_t> GenerateRandomGarbage() noexcept
{
std::vector<uint8_t> ret;
@@ -1833,7 +1827,7 @@ void CConnman::CreateNodeFromAcceptedSocket(std::unique_ptr<Sock>&& sock,
RandAddEvent((uint32_t)id);
}
-bool CConnman::AddConnection(const std::string& address, ConnectionType conn_type)
+bool CConnman::AddConnection(const std::string& address, ConnectionType conn_type, bool use_v2transport = false)
{
AssertLockNotHeld(m_unused_i2p_sessions_mutex);
std::optional<int> max_connections;
@@ -1866,7 +1860,7 @@ bool CConnman::AddConnection(const std::string& address, ConnectionType conn_typ
CSemaphoreGrant grant(*semOutbound, true);
if (!grant) return false;
- OpenNetworkConnection(CAddress(), false, std::move(grant), address.c_str(), conn_type, /*use_v2transport=*/false);
+ OpenNetworkConnection(CAddress(), false, std::move(grant), address.c_str(), conn_type, /*use_v2transport=*/use_v2transport);
return true;
}
@@ -2273,7 +2267,7 @@ void CConnman::ThreadDNSAddressSeed()
AddAddrFetch(seed);
} else {
std::vector<CAddress> vAdd;
- ServiceFlags requiredServiceBits = GetDesirableServiceFlags(NODE_NONE);
+ constexpr ServiceFlags requiredServiceBits{SeedsServiceFlags()};
std::string host = strprintf("x%x.%s", requiredServiceBits, seed);
CNetAddr resolveSource;
if (!resolveSource.SetInternal(host)) {
@@ -2322,10 +2316,13 @@ void CConnman::ProcessAddrFetch()
strDest = m_addr_fetches.front();
m_addr_fetches.pop_front();
}
+ // Attempt v2 connection if we support v2 - we'll reconnect with v1 if our
+ // peer doesn't support it or immediately disconnects us for another reason.
+ const bool use_v2transport(GetLocalServices() & NODE_P2P_V2);
CAddress addr;
CSemaphoreGrant grant(*semOutbound, /*fTry=*/true);
if (grant) {
- OpenNetworkConnection(addr, false, std::move(grant), strDest.c_str(), ConnectionType::ADDR_FETCH, /*use_v2transport=*/false);
+ OpenNetworkConnection(addr, false, std::move(grant), strDest.c_str(), ConnectionType::ADDR_FETCH, use_v2transport);
}
}
@@ -2423,12 +2420,15 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
// Connect to specific addresses
if (!connect.empty())
{
+ // Attempt v2 connection if we support v2 - we'll reconnect with v1 if our
+ // peer doesn't support it or immediately disconnects us for another reason.
+ const bool use_v2transport(GetLocalServices() & NODE_P2P_V2);
for (int64_t nLoop = 0;; nLoop++)
{
for (const std::string& strAddr : connect)
{
CAddress addr(CService(), NODE_NONE);
- OpenNetworkConnection(addr, false, {}, strAddr.c_str(), ConnectionType::MANUAL, /*use_v2transport=*/false);
+ OpenNetworkConnection(addr, false, {}, strAddr.c_str(), ConnectionType::MANUAL, /*use_v2transport=*/use_v2transport);
for (int i = 0; i < 10 && i < nLoop; i++)
{
if (!interruptNet.sleep_for(std::chrono::milliseconds(500)))
@@ -2437,6 +2437,7 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
}
if (!interruptNet.sleep_for(std::chrono::milliseconds(500)))
return;
+ PerformReconnections();
}
}
@@ -2637,7 +2638,7 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
const CAddress addr = m_anchors.back();
m_anchors.pop_back();
if (!addr.IsValid() || IsLocal(addr) || !g_reachable_nets.Contains(addr) ||
- !HasAllDesirableServiceFlags(addr.nServices) ||
+ !m_msgproc->HasAllDesirableServiceFlags(addr.nServices) ||
outbound_ipv46_peer_netgroups.count(m_netgroupman.GetGroup(addr))) continue;
addrConnect = addr;
LogPrint(BCLog::NET, "Trying to make an anchor connection to %s\n", addrConnect.ToStringAddrPort());
@@ -2703,7 +2704,7 @@ void CConnman::ThreadOpenConnections(const std::vector<std::string> connect)
// for non-feelers, require all the services we'll want,
// for feelers, only require they be a full node (only because most
// SPV clients don't have a good address DB available)
- if (!fFeeler && !HasAllDesirableServiceFlags(addr.nServices)) {
+ if (!fFeeler && !m_msgproc->HasAllDesirableServiceFlags(addr.nServices)) {
continue;
} else if (fFeeler && !MayHaveUsefulAddressDB(addr.nServices)) {
continue;
@@ -2846,11 +2847,11 @@ void CConnman::ThreadOpenAddedConnections()
if (!interruptNet.sleep_for(std::chrono::milliseconds(500))) return;
grant = CSemaphoreGrant(*semAddnode, /*fTry=*/true);
}
+ // See if any reconnections are desired.
+ PerformReconnections();
// Retry every 60 seconds if a connection was attempted, otherwise two seconds
if (!interruptNet.sleep_for(std::chrono::seconds(tried ? 60 : 2)))
return;
- // See if any reconnections are desired.
- PerformReconnections();
}
}
diff --git a/src/net.h b/src/net.h
index 547e032ba6..e78e122c44 100644
--- a/src/net.h
+++ b/src/net.h
@@ -97,7 +97,7 @@ static constexpr bool DEFAULT_FIXEDSEEDS{true};
static const size_t DEFAULT_MAXRECEIVEBUFFER = 5 * 1000;
static const size_t DEFAULT_MAXSENDBUFFER = 1 * 1000;
-static constexpr bool DEFAULT_V2_TRANSPORT{false};
+static constexpr bool DEFAULT_V2_TRANSPORT{true};
typedef int64_t NodeId;
@@ -1006,6 +1006,12 @@ public:
virtual void FinalizeNode(const CNode& node) = 0;
/**
+ * Callback to determine whether the given set of service flags are sufficient
+ * for a peer to be "relevant".
+ */
+ virtual bool HasAllDesirableServiceFlags(ServiceFlags services) const = 0;
+
+ /**
* Process protocol messages received from a given node
*
* @param[in] pnode The node which we have received messages from.
@@ -1084,10 +1090,11 @@ public:
vWhitelistedRange = connOptions.vWhitelistedRange;
{
LOCK(m_added_nodes_mutex);
-
+ // Attempt v2 connection if we support v2 - we'll reconnect with v1 if our
+ // peer doesn't support it or immediately disconnects us for another reason.
+ const bool use_v2transport(GetLocalServices() & NODE_P2P_V2);
for (const std::string& added_node : connOptions.m_added_nodes) {
- // -addnode cli arg does not currently have a way to signal BIP324 support
- m_added_node_params.push_back({added_node, false});
+ m_added_node_params.push_back({added_node, use_v2transport});
}
}
m_onion_binds = connOptions.onion_binds;
@@ -1188,13 +1195,14 @@ public:
* @param[in] address Address of node to try connecting to
* @param[in] conn_type ConnectionType::OUTBOUND, ConnectionType::BLOCK_RELAY,
* ConnectionType::ADDR_FETCH or ConnectionType::FEELER
+ * @param[in] use_v2transport Set to true if node attempts to connect using BIP 324 v2 transport protocol.
* @return bool Returns false if there are no available
* slots for this connection:
* - conn_type not a supported ConnectionType
* - Max total outbound connection capacity filled
* - Max connection capacity for type is filled
*/
- bool AddConnection(const std::string& address, ConnectionType conn_type) EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex);
+ bool AddConnection(const std::string& address, ConnectionType conn_type, bool use_v2transport) EXCLUSIVE_LOCKS_REQUIRED(!m_unused_i2p_sessions_mutex);
size_t GetNodeCount(ConnectionDirection) const;
uint32_t GetMappedAS(const CNetAddr& addr) const;
diff --git a/src/net_processing.cpp b/src/net_processing.cpp
index df54a62f28..30d2d43e58 100644
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -41,12 +41,12 @@
#include <txrequest.h>
#include <util/check.h>
#include <util/strencodings.h>
+#include <util/time.h>
#include <util/trace.h>
#include <validation.h>
#include <algorithm>
#include <atomic>
-#include <chrono>
#include <future>
#include <memory>
#include <optional>
@@ -133,6 +133,8 @@ static const unsigned int MAX_BLOCKS_TO_ANNOUNCE = 8;
static const int MAX_NUM_UNCONNECTING_HEADERS_MSGS = 10;
/** Minimum blocks required to signal NODE_NETWORK_LIMITED */
static const unsigned int NODE_NETWORK_LIMITED_MIN_BLOCKS = 288;
+/** Window, in blocks, for connecting to NODE_NETWORK_LIMITED peers */
+static const unsigned int NODE_NETWORK_LIMITED_ALLOW_CONN_BLOCKS = 144;
/** Average delay between local address broadcasts */
static constexpr auto AVG_LOCAL_ADDRESS_BROADCAST_INTERVAL{24h};
/** Average delay between peer address broadcasts */
@@ -499,6 +501,7 @@ public:
/** Implement NetEventsInterface */
void InitializeNode(CNode& node, ServiceFlags our_services) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void FinalizeNode(const CNode& node) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_headers_presync_mutex);
+ bool HasAllDesirableServiceFlags(ServiceFlags services) const override;
bool ProcessMessages(CNode* pfrom, std::atomic<bool>& interrupt) override
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_recent_confirmed_transactions_mutex, !m_most_recent_block_mutex, !m_headers_presync_mutex, g_msgproc_mutex);
bool SendMessages(CNode* pto) override
@@ -513,12 +516,17 @@ public:
bool IgnoresIncomingTxs() override { return m_opts.ignore_incoming_txs; }
void SendPings() override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
void RelayTransaction(const uint256& txid, const uint256& wtxid) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex);
- void SetBestHeight(int height) override { m_best_height = height; };
+ void SetBestBlock(int height, std::chrono::seconds time) override
+ {
+ m_best_height = height;
+ m_best_block_time = time;
+ };
void UnitTestMisbehaving(NodeId peer_id, int howmuch) override EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex) { Misbehaving(*Assert(GetPeerRef(peer_id)), howmuch, ""); };
void ProcessMessage(CNode& pfrom, const std::string& msg_type, DataStream& vRecv,
const std::chrono::microseconds time_received, const std::atomic<bool>& interruptMsgProc) override
EXCLUSIVE_LOCKS_REQUIRED(!m_peer_mutex, !m_recent_confirmed_transactions_mutex, !m_most_recent_block_mutex, !m_headers_presync_mutex, g_msgproc_mutex);
void UpdateLastBlockAnnounceTime(NodeId node, int64_t time_in_seconds) override;
+ ServiceFlags GetDesirableServiceFlags(ServiceFlags services) const override;
private:
/** Consider evicting an outbound peer based on the amount of time they've been behind our tip */
@@ -721,6 +729,8 @@ private:
/** The height of the best chain */
std::atomic<int> m_best_height{-1};
+ /** The time of the best chain tip block */
+ std::atomic<std::chrono::seconds> m_best_block_time{0s};
/** Next time to check for stale tip */
std::chrono::seconds m_stale_tip_check_time GUARDED_BY(cs_main){0s};
@@ -993,6 +1003,12 @@ private:
bool CanDirectFetch() EXCLUSIVE_LOCKS_REQUIRED(cs_main);
/**
+ * Estimates the distance, in blocks, between the best-known block and the network chain tip.
+ * Utilizes the best-block time and the chainparams blocks spacing to approximate it.
+ */
+ int64_t ApproximateBestBlockDepth() const;
+
+ /**
* To prevent fingerprinting attacks, only send blocks/headers outside of
* the active chain if they are no more than a month older (both in time,
* and in best equivalent proof of work) than the best header chain we know
@@ -1311,9 +1327,14 @@ bool PeerManagerImpl::TipMayBeStale()
return m_last_tip_update.load() < GetTime<std::chrono::seconds>() - std::chrono::seconds{consensusParams.nPowTargetSpacing * 3} && mapBlocksInFlight.empty();
}
+int64_t PeerManagerImpl::ApproximateBestBlockDepth() const
+{
+ return (GetTime<std::chrono::seconds>() - m_best_block_time.load()).count() / m_chainparams.GetConsensus().nPowTargetSpacing;
+}
+
bool PeerManagerImpl::CanDirectFetch()
{
- return m_chainman.ActiveChain().Tip()->Time() > GetAdjustedTime() - m_chainparams.GetConsensus().PowTargetSpacing() * 20;
+ return m_chainman.ActiveChain().Tip()->Time() > NodeClock::now() - m_chainparams.GetConsensus().PowTargetSpacing() * 20;
}
static bool PeerHasHeader(CNodeState *state, const CBlockIndex *pindex) EXCLUSIVE_LOCKS_REQUIRED(cs_main)
@@ -1651,6 +1672,23 @@ void PeerManagerImpl::FinalizeNode(const CNode& node)
LogPrint(BCLog::NET, "Cleared nodestate for peer=%d\n", nodeid);
}
+bool PeerManagerImpl::HasAllDesirableServiceFlags(ServiceFlags services) const
+{
+ // Shortcut for (services & GetDesirableServiceFlags(services)) == GetDesirableServiceFlags(services)
+ return !(GetDesirableServiceFlags(services) & (~services));
+}
+
+ServiceFlags PeerManagerImpl::GetDesirableServiceFlags(ServiceFlags services) const
+{
+ if (services & NODE_NETWORK_LIMITED) {
+ // Limited peers are desirable when we are close to the tip.
+ if (ApproximateBestBlockDepth() < NODE_NETWORK_LIMITED_ALLOW_CONN_BLOCKS) {
+ return ServiceFlags(NODE_NETWORK_LIMITED | NODE_WITNESS);
+ }
+ }
+ return ServiceFlags(NODE_NETWORK | NODE_WITNESS);
+}
+
PeerRef PeerManagerImpl::GetPeerRef(NodeId id) const
{
LOCK(m_peer_mutex);
@@ -2047,8 +2085,7 @@ void PeerManagerImpl::NewPoWValidBlock(const CBlockIndex *pindex, const std::sha
*/
void PeerManagerImpl::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload)
{
- SetBestHeight(pindexNew->nHeight);
- SetServiceFlagsIBDCache(!fInitialDownload);
+ SetBestBlock(pindexNew->nHeight, std::chrono::seconds{pindexNew->GetBlockTime()});
// Don't relay inventory during initial block download.
if (fInitialDownload) return;
@@ -2653,8 +2690,8 @@ bool PeerManagerImpl::IsContinuationOfLowWorkHeadersSync(Peer& peer, CNode& pfro
bool PeerManagerImpl::TryLowWorkHeadersSync(Peer& peer, CNode& pfrom, const CBlockIndex* chain_start_header, std::vector<CBlockHeader>& headers)
{
- // Calculate the total work on this chain.
- arith_uint256 total_work = chain_start_header->nChainWork + CalculateHeadersWork(headers);
+ // Calculate the claimed total work on this chain.
+ arith_uint256 total_work = chain_start_header->nChainWork + CalculateClaimedHeadersWork(headers);
// Our dynamic anti-DoS threshold (minimum work required on a headers chain
// before we'll store it)
@@ -3376,6 +3413,9 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
vRecv >> CNetAddr::V1(addrMe);
if (!pfrom.IsInboundConn())
{
+ // Overwrites potentially existing services. In contrast to this,
+ // unvalidated services received via gossip relay in ADDR/ADDRV2
+ // messages are only ever added but cannot replace existing ones.
m_addrman.SetServices(pfrom.addr, nServices);
}
if (pfrom.ExpectServicesFromConn() && !HasAllDesirableServiceFlags(nServices))
@@ -4384,7 +4424,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
MaybeSendGetHeaders(pfrom, GetLocator(m_chainman.m_best_header), *peer);
}
return;
- } else if (prev_block->nChainWork + CalculateHeadersWork({cmpctblock.header}) < GetAntiDoSWorkThreshold()) {
+ } else if (prev_block->nChainWork + CalculateClaimedHeadersWork({cmpctblock.header}) < GetAntiDoSWorkThreshold()) {
// If we get a low-work header in a compact block, we can ignore it.
LogPrint(BCLog::NET, "Ignoring low-work compact block from peer %d\n", pfrom.GetId());
return;
@@ -4405,7 +4445,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
}
if (received_new_header) {
- LogPrintfCategory(BCLog::NET, "Saw new cmpctblock header hash=%s peer=%d\n",
+ LogInfo("Saw new cmpctblock header hash=%s peer=%d\n",
blockhash.ToString(), pfrom.GetId());
}
@@ -4679,6 +4719,17 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
LogPrint(BCLog::NET, "received block %s peer=%d\n", pblock->GetHash().ToString(), pfrom.GetId());
+ const CBlockIndex* prev_block{WITH_LOCK(m_chainman.GetMutex(), return m_chainman.m_blockman.LookupBlockIndex(pblock->hashPrevBlock))};
+
+ // Check for possible mutation if it connects to something we know so we can check for DEPLOYMENT_SEGWIT being active
+ if (prev_block && IsBlockMutated(/*block=*/*pblock,
+ /*check_witness_root=*/DeploymentActiveAfter(prev_block, m_chainman, Consensus::DEPLOYMENT_SEGWIT))) {
+ LogDebug(BCLog::NET, "Received mutated block from peer=%d\n", peer->m_id);
+ Misbehaving(*peer, 100, "mutated block");
+ WITH_LOCK(cs_main, RemoveBlockRequest(pblock->GetHash(), peer->m_id));
+ return;
+ }
+
bool forceProcessing = false;
const uint256 hash(pblock->GetHash());
bool min_pow_checked = false;
@@ -4693,9 +4744,8 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
// cs_main in ProcessNewBlock is fine.
mapBlockSource.emplace(hash, std::make_pair(pfrom.GetId(), true));
- // Check work on this block against our anti-dos thresholds.
- const CBlockIndex* prev_block = m_chainman.m_blockman.LookupBlockIndex(pblock->hashPrevBlock);
- if (prev_block && prev_block->nChainWork + CalculateHeadersWork({pblock->GetBlockHeader()}) >= GetAntiDoSWorkThreshold()) {
+ // Check claimed work on this block against our anti-dos thresholds.
+ if (prev_block && prev_block->nChainWork + CalculateClaimedHeadersWork({pblock->GetBlockHeader()}) >= GetAntiDoSWorkThreshold()) {
min_pow_checked = true;
}
}
@@ -5552,7 +5602,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
if (!state.fSyncStarted && CanServeBlocks(*peer) && !m_chainman.m_blockman.LoadingBlocks()) {
// Only actively request headers from a single peer, unless we're close to today.
- if ((nSyncStarted == 0 && sync_blocks_and_headers_from_peer) || m_chainman.m_best_header->Time() > GetAdjustedTime() - 24h) {
+ if ((nSyncStarted == 0 && sync_blocks_and_headers_from_peer) || m_chainman.m_best_header->Time() > NodeClock::now() - 24h) {
const CBlockIndex* pindexStart = m_chainman.m_best_header;
/* If possible, start at the block preceding the currently
best known header. This ensures that we always get a
@@ -5572,7 +5622,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
// Convert HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER to microseconds before scaling
// to maintain precision
std::chrono::microseconds{HEADERS_DOWNLOAD_TIMEOUT_PER_HEADER} *
- Ticks<std::chrono::seconds>(GetAdjustedTime() - m_chainman.m_best_header->Time()) / consensusParams.nPowTargetSpacing
+ Ticks<std::chrono::seconds>(NodeClock::now() - m_chainman.m_best_header->Time()) / consensusParams.nPowTargetSpacing
);
nSyncStarted++;
}
@@ -5876,7 +5926,7 @@ bool PeerManagerImpl::SendMessages(CNode* pto)
// Check for headers sync timeouts
if (state.fSyncStarted && peer->m_headers_sync_timeout < std::chrono::microseconds::max()) {
// Detect whether this is a stalling initial-headers-sync peer
- if (m_chainman.m_best_header->Time() <= GetAdjustedTime() - 24h) {
+ if (m_chainman.m_best_header->Time() <= NodeClock::now() - 24h) {
if (current_time > peer->m_headers_sync_timeout && nSyncStarted == 1 && (m_num_preferred_download_peers - state.fPreferredDownload >= 1)) {
// Disconnect a peer (without NetPermissionFlags::NoBan permission) if it is our only sync peer,
// and we have others we could be using instead.
diff --git a/src/net_processing.h b/src/net_processing.h
index afdef00067..f8d7a8f511 100644
--- a/src/net_processing.h
+++ b/src/net_processing.h
@@ -92,8 +92,8 @@ public:
/** Send ping message to all peers */
virtual void SendPings() = 0;
- /** Set the best height */
- virtual void SetBestHeight(int height) = 0;
+ /** Set the height of the best block and its time (seconds since epoch). */
+ virtual void SetBestBlock(int height, std::chrono::seconds time) = 0;
/* Public for unit testing. */
virtual void UnitTestMisbehaving(NodeId peer_id, int howmuch) = 0;
@@ -110,6 +110,29 @@ public:
/** This function is used for testing the stale tip eviction logic, see denialofservice_tests.cpp */
virtual void UpdateLastBlockAnnounceTime(NodeId node, int64_t time_in_seconds) = 0;
+
+ /**
+ * Gets the set of service flags which are "desirable" for a given peer.
+ *
+ * These are the flags which are required for a peer to support for them
+ * to be "interesting" to us, ie for us to wish to use one of our few
+ * outbound connection slots for or for us to wish to prioritize keeping
+ * their connection around.
+ *
+ * Relevant service flags may be peer- and state-specific in that the
+ * version of the peer may determine which flags are required (eg in the
+ * case of NODE_NETWORK_LIMITED where we seek out NODE_NETWORK peers
+ * unless they set NODE_NETWORK_LIMITED and we are out of IBD, in which
+ * case NODE_NETWORK_LIMITED suffices).
+ *
+ * Thus, generally, avoid calling with 'services' == NODE_NONE, unless
+ * state-specific flags must absolutely be avoided. When called with
+ * 'services' == NODE_NONE, the returned desirable service flags are
+ * guaranteed to not change dependent on state - ie they are suitable for
+ * use when describing peers which we know to be desirable, but for which
+ * we do not have a confirmed set of service flags.
+ */
+ virtual ServiceFlags GetDesirableServiceFlags(ServiceFlags services) const = 0;
};
#endif // BITCOIN_NET_PROCESSING_H
diff --git a/src/netaddress.h b/src/netaddress.h
index 08dd77c0ff..c697b7e0a3 100644
--- a/src/netaddress.h
+++ b/src/netaddress.h
@@ -5,10 +5,6 @@
#ifndef BITCOIN_NETADDRESS_H
#define BITCOIN_NETADDRESS_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <compat/compat.h>
#include <crypto/siphash.h>
#include <prevector.h>
@@ -261,6 +257,18 @@ public:
}
}
+ /**
+ * BIP155 network ids recognized by this software.
+ */
+ enum BIP155Network : uint8_t {
+ IPV4 = 1,
+ IPV6 = 2,
+ TORV2 = 3,
+ TORV3 = 4,
+ I2P = 5,
+ CJDNS = 6,
+ };
+
friend class CSubNet;
private:
@@ -283,18 +291,6 @@ private:
bool SetI2P(const std::string& addr);
/**
- * BIP155 network ids recognized by this software.
- */
- enum BIP155Network : uint8_t {
- IPV4 = 1,
- IPV6 = 2,
- TORV2 = 3,
- TORV3 = 4,
- I2P = 5,
- CJDNS = 6,
- };
-
- /**
* Size of CNetAddr when serialized as ADDRv1 (pre-BIP155) (in bytes).
*/
static constexpr size_t V1_SERIALIZATION_SIZE = ADDR_IPV6_SIZE;
diff --git a/src/netbase.h b/src/netbase.h
index 8523f59b4d..1bd95ba0d9 100644
--- a/src/netbase.h
+++ b/src/netbase.h
@@ -5,10 +5,6 @@
#ifndef BITCOIN_NETBASE_H
#define BITCOIN_NETBASE_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <compat/compat.h>
#include <netaddress.h>
#include <serialize.h>
diff --git a/src/node/blockstorage.cpp b/src/node/blockstorage.cpp
index e6164c2e59..c499bbfa6a 100644
--- a/src/node/blockstorage.cpp
+++ b/src/node/blockstorage.cpp
@@ -307,6 +307,7 @@ void BlockManager::FindFilesToPrune(
// Distribute our -prune budget over all chainstates.
const auto target = std::max(
MIN_DISK_SPACE_FOR_BLOCK_FILES, GetPruneTarget() / chainman.GetAll().size());
+ const uint64_t target_sync_height = chainman.m_best_header->nHeight;
if (chain.m_chain.Height() < 0 || target == 0) {
return;
@@ -329,10 +330,13 @@ void BlockManager::FindFilesToPrune(
// On a prune event, the chainstate DB is flushed.
// To avoid excessive prune events negating the benefit of high dbcache
// values, we should not prune too rapidly.
- // So when pruning in IBD, increase the buffer a bit to avoid a re-prune too soon.
- if (chainman.IsInitialBlockDownload()) {
- // Since this is only relevant during IBD, we use a fixed 10%
- nBuffer += target / 10;
+ // So when pruning in IBD, increase the buffer to avoid a re-prune too soon.
+ const auto chain_tip_height = chain.m_chain.Height();
+ if (chainman.IsInitialBlockDownload() && target_sync_height > (uint64_t)chain_tip_height) {
+ // Since this is only relevant during IBD, we assume blocks are at least 1 MB on average
+ static constexpr uint64_t average_block_size = 1000000; /* 1 MB */
+ const uint64_t remaining_blocks = target_sync_height - chain_tip_height;
+ nBuffer += average_block_size * remaining_blocks;
}
for (int fileNumber = 0; fileNumber < this->MaxBlockfileNum(); fileNumber++) {
diff --git a/src/node/context.h b/src/node/context.h
index 4f3b640b2d..245f230aec 100644
--- a/src/node/context.h
+++ b/src/node/context.h
@@ -20,6 +20,7 @@ class BanMan;
class BaseIndex;
class CBlockPolicyEstimator;
class CConnman;
+class ValidationSignals;
class CScheduler;
class CTxMemPool;
class ChainstateManager;
@@ -70,7 +71,10 @@ struct NodeContext {
interfaces::WalletLoader* wallet_loader{nullptr};
std::unique_ptr<CScheduler> scheduler;
std::function<void()> rpc_interruption_point = [] {};
+ //! Issues blocking calls about sync status, errors and warnings
std::unique_ptr<KernelNotifications> notifications;
+ //! Issues calls about blocks and transactions
+ std::unique_ptr<ValidationSignals> validation_signals;
std::atomic<int> exit_status{EXIT_SUCCESS};
//! Declare default constructor and destructor that are not inline, so code
diff --git a/src/node/interfaces.cpp b/src/node/interfaces.cpp
index 6963e928fe..f9a372e3de 100644
--- a/src/node/interfaces.cpp
+++ b/src/node/interfaces.cpp
@@ -460,19 +460,20 @@ public:
class NotificationsHandlerImpl : public Handler
{
public:
- explicit NotificationsHandlerImpl(std::shared_ptr<Chain::Notifications> notifications)
- : m_proxy(std::make_shared<NotificationsProxy>(std::move(notifications)))
+ explicit NotificationsHandlerImpl(ValidationSignals& signals, std::shared_ptr<Chain::Notifications> notifications)
+ : m_signals{signals}, m_proxy{std::make_shared<NotificationsProxy>(std::move(notifications))}
{
- RegisterSharedValidationInterface(m_proxy);
+ m_signals.RegisterSharedValidationInterface(m_proxy);
}
~NotificationsHandlerImpl() override { disconnect(); }
void disconnect() override
{
if (m_proxy) {
- UnregisterSharedValidationInterface(m_proxy);
+ m_signals.UnregisterSharedValidationInterface(m_proxy);
m_proxy.reset();
}
}
+ ValidationSignals& m_signals;
std::shared_ptr<NotificationsProxy> m_proxy;
};
@@ -761,12 +762,12 @@ public:
}
std::unique_ptr<Handler> handleNotifications(std::shared_ptr<Notifications> notifications) override
{
- return std::make_unique<NotificationsHandlerImpl>(std::move(notifications));
+ return std::make_unique<NotificationsHandlerImpl>(validation_signals(), std::move(notifications));
}
void waitForNotificationsIfTipChanged(const uint256& old_tip) override
{
if (!old_tip.IsNull() && old_tip == WITH_LOCK(::cs_main, return chainman().ActiveChain().Tip()->GetBlockHash())) return;
- SyncWithValidationInterfaceQueue();
+ validation_signals().SyncWithValidationInterfaceQueue();
}
std::unique_ptr<Handler> handleRpc(const CRPCCommand& command) override
{
@@ -777,7 +778,6 @@ public:
{
RPCRunLater(name, std::move(fn), seconds);
}
- bool rpcSerializationWithoutWitness() override { return RPCSerializationWithoutWitness(); }
common::SettingsValue getSetting(const std::string& name) override
{
return args().GetSetting(name);
@@ -823,6 +823,7 @@ public:
NodeContext* context() override { return &m_node; }
ArgsManager& args() { return *Assert(m_node.args); }
ChainstateManager& chainman() { return *Assert(m_node.chainman); }
+ ValidationSignals& validation_signals() { return *Assert(m_node.validation_signals); }
NodeContext& m_node;
};
} // namespace
diff --git a/src/node/miner.cpp b/src/node/miner.cpp
index ce5452d1f9..87f40e993f 100644
--- a/src/node/miner.cpp
+++ b/src/node/miner.cpp
@@ -20,8 +20,8 @@
#include <policy/policy.h>
#include <pow.h>
#include <primitives/transaction.h>
-#include <timedata.h>
#include <util/moneystr.h>
+#include <util/time.h>
#include <validation.h>
#include <algorithm>
@@ -31,7 +31,7 @@ namespace node {
int64_t UpdateTime(CBlockHeader* pblock, const Consensus::Params& consensusParams, const CBlockIndex* pindexPrev)
{
int64_t nOldTime = pblock->nTime;
- int64_t nNewTime{std::max<int64_t>(pindexPrev->GetMedianTimePast() + 1, TicksSinceEpoch<std::chrono::seconds>(GetAdjustedTime()))};
+ int64_t nNewTime{std::max<int64_t>(pindexPrev->GetMedianTimePast() + 1, TicksSinceEpoch<std::chrono::seconds>(NodeClock::now()))};
if (nOldTime < nNewTime) {
pblock->nTime = nNewTime;
@@ -133,7 +133,7 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
pblock->nVersion = gArgs.GetIntArg("-blockversion", pblock->nVersion);
}
- pblock->nTime = TicksSinceEpoch<std::chrono::seconds>(GetAdjustedTime());
+ pblock->nTime = TicksSinceEpoch<std::chrono::seconds>(NodeClock::now());
m_lock_time_cutoff = pindexPrev->GetMedianTimePast();
int nPackagesSelected = 0;
@@ -171,7 +171,7 @@ std::unique_ptr<CBlockTemplate> BlockAssembler::CreateNewBlock(const CScript& sc
BlockValidationState state;
if (m_options.test_block_validity && !TestBlockValidity(state, chainparams, m_chainstate, *pblock, pindexPrev,
- GetAdjustedTime, /*fCheckPOW=*/false, /*fCheckMerkleRoot=*/false)) {
+ /*fCheckPOW=*/false, /*fCheckMerkleRoot=*/false)) {
throw std::runtime_error(strprintf("%s: TestBlockValidity failed: %s", __func__, state.ToString()));
}
const auto time_2{SteadyClock::now()};
diff --git a/src/node/transaction.cpp b/src/node/transaction.cpp
index e8ab2326c1..b66a4f2f39 100644
--- a/src/node/transaction.cpp
+++ b/src/node/transaction.cpp
@@ -32,7 +32,7 @@ static TransactionError HandleATMPError(const TxValidationState& state, std::str
TransactionError BroadcastTransaction(NodeContext& node, const CTransactionRef tx, std::string& err_string, const CAmount& max_tx_fee, bool relay, bool wait_callback)
{
- // BroadcastTransaction can be called by either sendrawtransaction RPC or the wallet.
+ // BroadcastTransaction can be called by RPC or by the wallet.
// chainman, mempool and peerman are initialized before the RPC server and wallet are started
// and reset after the RPC sever and wallet are stopped.
assert(node.chainman);
@@ -92,7 +92,7 @@ TransactionError BroadcastTransaction(NodeContext& node, const CTransactionRef t
node.mempool->AddUnbroadcastTx(txid);
}
- if (wait_callback) {
+ if (wait_callback && node.validation_signals) {
// For transactions broadcast from outside the wallet, make sure
// that the wallet has been notified of the transaction before
// continuing.
@@ -101,7 +101,7 @@ TransactionError BroadcastTransaction(NodeContext& node, const CTransactionRef t
// with a transaction to/from their wallet, immediately call some
// wallet RPC, and get a stale result because callbacks have not
// yet been processed.
- CallFunctionInValidationInterfaceQueue([&promise] {
+ node.validation_signals->CallFunctionInValidationInterfaceQueue([&promise] {
promise.set_value();
});
callback_set = true;
diff --git a/src/policy/fees.cpp b/src/policy/fees.cpp
index 74c688060d..5f1d15c5f2 100644
--- a/src/policy/fees.cpp
+++ b/src/policy/fees.cpp
@@ -612,7 +612,7 @@ void CBlockPolicyEstimator::processTransaction(const NewMempoolTransactionInfo&
// - the node is not behind
// - the transaction is not dependent on any other transactions in the mempool
// - it's not part of a package.
- const bool validForFeeEstimation = !tx.m_from_disconnected_block && !tx.m_submitted_in_package && tx.m_chainstate_is_current && tx.m_has_no_mempool_parents;
+ const bool validForFeeEstimation = !tx.m_mempool_limit_bypassed && !tx.m_submitted_in_package && tx.m_chainstate_is_current && tx.m_has_no_mempool_parents;
// Only want to be updating estimates when our blockchain is synced,
// otherwise we'll miscalculate how many blocks its taking to get included.
@@ -1055,7 +1055,7 @@ void CBlockPolicyEstimator::FlushUnconfirmed()
_removeTx(mi->first, false); // this calls erase() on mapMemPoolTxs
}
const auto endclear{SteadyClock::now()};
- LogPrint(BCLog::ESTIMATEFEE, "Recorded %u unconfirmed txs from mempool in %gs\n", num_entries, Ticks<SecondsDouble>(endclear - startclear));
+ LogPrint(BCLog::ESTIMATEFEE, "Recorded %u unconfirmed txs from mempool in %.3fs\n", num_entries, Ticks<SecondsDouble>(endclear - startclear));
}
std::chrono::hours CBlockPolicyEstimator::GetFeeEstimatorFileAge()
diff --git a/src/policy/rbf.cpp b/src/policy/rbf.cpp
index 76ab2b1a96..f0830d8f22 100644
--- a/src/policy/rbf.cpp
+++ b/src/policy/rbf.cpp
@@ -115,11 +115,11 @@ std::optional<std::string> HasNoNewUnconfirmed(const CTransaction& tx,
}
std::optional<std::string> EntriesAndTxidsDisjoint(const CTxMemPool::setEntries& ancestors,
- const std::set<uint256>& direct_conflicts,
+ const std::set<Txid>& direct_conflicts,
const uint256& txid)
{
for (CTxMemPool::txiter ancestorIt : ancestors) {
- const uint256& hashAncestor = ancestorIt->GetTx().GetHash();
+ const Txid& hashAncestor = ancestorIt->GetTx().GetHash();
if (direct_conflicts.count(hashAncestor)) {
return strprintf("%s spends conflicting transaction %s",
txid.ToString(),
diff --git a/src/policy/rbf.h b/src/policy/rbf.h
index fff9828482..5a33ed64a3 100644
--- a/src/policy/rbf.h
+++ b/src/policy/rbf.h
@@ -80,7 +80,7 @@ std::optional<std::string> HasNoNewUnconfirmed(const CTransaction& tx, const CTx
* @returns error message if the sets intersect, std::nullopt if they are disjoint.
*/
std::optional<std::string> EntriesAndTxidsDisjoint(const CTxMemPool::setEntries& ancestors,
- const std::set<uint256>& direct_conflicts,
+ const std::set<Txid>& direct_conflicts,
const uint256& txid);
/** Check that the feerate of the replacement transaction(s) is higher than the feerate of each
diff --git a/src/policy/v3_policy.cpp b/src/policy/v3_policy.cpp
new file mode 100644
index 0000000000..f838dc6c0f
--- /dev/null
+++ b/src/policy/v3_policy.cpp
@@ -0,0 +1,219 @@
+// Copyright (c) 2022 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <policy/v3_policy.h>
+
+#include <coins.h>
+#include <consensus/amount.h>
+#include <logging.h>
+#include <tinyformat.h>
+#include <util/check.h>
+
+#include <algorithm>
+#include <numeric>
+#include <vector>
+
+/** Helper for PackageV3Checks: Returns a vector containing the indices of transactions (within
+ * package) that are direct parents of ptx. */
+std::vector<size_t> FindInPackageParents(const Package& package, const CTransactionRef& ptx)
+{
+ std::vector<size_t> in_package_parents;
+
+ std::set<Txid> possible_parents;
+ for (auto &input : ptx->vin) {
+ possible_parents.insert(input.prevout.hash);
+ }
+
+ for (size_t i{0}; i < package.size(); ++i) {
+ const auto& tx = package.at(i);
+ // We assume the package is sorted, so that we don't need to continue
+ // looking past the transaction itself.
+ if (&(*tx) == &(*ptx)) break;
+ if (possible_parents.count(tx->GetHash())) {
+ in_package_parents.push_back(i);
+ }
+ }
+ return in_package_parents;
+}
+
+/** Helper for PackageV3Checks, storing info for a mempool or package parent. */
+struct ParentInfo {
+ /** Txid used to identify this parent by prevout */
+ const Txid& m_txid;
+ /** Wtxid used for debug string */
+ const Wtxid& m_wtxid;
+ /** nVersion used to check inheritance of v3 and non-v3 */
+ decltype(CTransaction::nVersion) m_version;
+ /** If parent is in mempool, whether it has any descendants in mempool. */
+ bool m_has_mempool_descendant;
+
+ ParentInfo() = delete;
+ ParentInfo(const Txid& txid, const Wtxid& wtxid, decltype(CTransaction::nVersion) version, bool has_mempool_descendant) :
+ m_txid{txid}, m_wtxid{wtxid}, m_version{version},
+ m_has_mempool_descendant{has_mempool_descendant}
+ {}
+};
+
+std::optional<std::string> PackageV3Checks(const CTransactionRef& ptx, int64_t vsize,
+ const Package& package,
+ const CTxMemPool::setEntries& mempool_ancestors)
+{
+ // This function is specialized for these limits, and must be reimplemented if they ever change.
+ static_assert(V3_ANCESTOR_LIMIT == 2);
+ static_assert(V3_DESCENDANT_LIMIT == 2);
+
+ const auto in_package_parents{FindInPackageParents(package, ptx)};
+
+ // Now we have all ancestors, so we can start checking v3 rules.
+ if (ptx->nVersion == 3) {
+ if (mempool_ancestors.size() + in_package_parents.size() + 1 > V3_ANCESTOR_LIMIT) {
+ return strprintf("tx %s (wtxid=%s) would have too many ancestors",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString());
+ }
+
+ const bool has_parent{mempool_ancestors.size() + in_package_parents.size() > 0};
+ if (has_parent) {
+ // A v3 child cannot be too large.
+ if (vsize > V3_CHILD_MAX_VSIZE) {
+ return strprintf("v3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(),
+ vsize, V3_CHILD_MAX_VSIZE);
+ }
+
+ // Exactly 1 parent exists, either in mempool or package. Find it.
+ const auto parent_info = [&] {
+ if (mempool_ancestors.size() > 0) {
+ auto& mempool_parent = *mempool_ancestors.begin();
+ Assume(mempool_parent->GetCountWithDescendants() == 1);
+ return ParentInfo{mempool_parent->GetTx().GetHash(),
+ mempool_parent->GetTx().GetWitnessHash(),
+ mempool_parent->GetTx().nVersion,
+ /*has_mempool_descendant=*/mempool_parent->GetCountWithDescendants() > 1};
+ } else {
+ auto& parent_index = in_package_parents.front();
+ auto& package_parent = package.at(parent_index);
+ return ParentInfo{package_parent->GetHash(),
+ package_parent->GetWitnessHash(),
+ package_parent->nVersion,
+ /*has_mempool_descendant=*/false};
+ }
+ }();
+
+ // If there is a parent, it must have the right version.
+ if (parent_info.m_version != 3) {
+ return strprintf("v3 tx %s (wtxid=%s) cannot spend from non-v3 tx %s (wtxid=%s)",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(),
+ parent_info.m_txid.ToString(), parent_info.m_wtxid.ToString());
+ }
+
+ for (const auto& package_tx : package) {
+ // Skip same tx.
+ if (&(*package_tx) == &(*ptx)) continue;
+
+ for (auto& input : package_tx->vin) {
+ // Fail if we find another tx with the same parent. We don't check whether the
+ // sibling is to-be-replaced (done in SingleV3Checks) because these transactions
+ // are within the same package.
+ if (input.prevout.hash == parent_info.m_txid) {
+ return strprintf("tx %s (wtxid=%s) would exceed descendant count limit",
+ parent_info.m_txid.ToString(),
+ parent_info.m_wtxid.ToString());
+ }
+
+ // This tx can't have both a parent and an in-package child.
+ if (input.prevout.hash == ptx->GetHash()) {
+ return strprintf("tx %s (wtxid=%s) would have too many ancestors",
+ package_tx->GetHash().ToString(), package_tx->GetWitnessHash().ToString());
+ }
+ }
+ }
+
+ // It shouldn't be possible to have any mempool siblings at this point. SingleV3Checks
+ // catches mempool siblings. Also, if the package consists of connected transactions,
+ // any tx having a mempool ancestor would mean the package exceeds ancestor limits.
+ if (!Assume(!parent_info.m_has_mempool_descendant)) {
+ return strprintf("tx %u would exceed descendant count limit", parent_info.m_wtxid.ToString());
+ }
+ }
+ } else {
+ // Non-v3 transactions cannot have v3 parents.
+ for (auto it : mempool_ancestors) {
+ if (it->GetTx().nVersion == 3) {
+ return strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(),
+ it->GetSharedTx()->GetHash().ToString(), it->GetSharedTx()->GetWitnessHash().ToString());
+ }
+ }
+ for (const auto& index: in_package_parents) {
+ if (package.at(index)->nVersion == 3) {
+ return strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
+ ptx->GetHash().ToString(),
+ ptx->GetWitnessHash().ToString(),
+ package.at(index)->GetHash().ToString(),
+ package.at(index)->GetWitnessHash().ToString());
+ }
+ }
+ }
+ return std::nullopt;
+}
+
+std::optional<std::string> SingleV3Checks(const CTransactionRef& ptx,
+ const CTxMemPool::setEntries& mempool_ancestors,
+ const std::set<Txid>& direct_conflicts,
+ int64_t vsize)
+{
+ // Check v3 and non-v3 inheritance.
+ for (const auto& entry : mempool_ancestors) {
+ if (ptx->nVersion != 3 && entry->GetTx().nVersion == 3) {
+ return strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(),
+ entry->GetSharedTx()->GetHash().ToString(), entry->GetSharedTx()->GetWitnessHash().ToString());
+ } else if (ptx->nVersion == 3 && entry->GetTx().nVersion != 3) {
+ return strprintf("v3 tx %s (wtxid=%s) cannot spend from non-v3 tx %s (wtxid=%s)",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(),
+ entry->GetSharedTx()->GetHash().ToString(), entry->GetSharedTx()->GetWitnessHash().ToString());
+ }
+ }
+
+ // This function is specialized for these limits, and must be reimplemented if they ever change.
+ static_assert(V3_ANCESTOR_LIMIT == 2);
+ static_assert(V3_DESCENDANT_LIMIT == 2);
+
+ // The rest of the rules only apply to transactions with nVersion=3.
+ if (ptx->nVersion != 3) return std::nullopt;
+
+ // Check that V3_ANCESTOR_LIMIT would not be violated.
+ if (mempool_ancestors.size() + 1 > V3_ANCESTOR_LIMIT) {
+ return strprintf("tx %s (wtxid=%s) would have too many ancestors",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString());
+ }
+
+ // Remaining checks only pertain to transactions with unconfirmed ancestors.
+ if (mempool_ancestors.size() > 0) {
+ // If this transaction spends V3 parents, it cannot be too large.
+ if (vsize > V3_CHILD_MAX_VSIZE) {
+ return strprintf("v3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
+ ptx->GetHash().ToString(), ptx->GetWitnessHash().ToString(), vsize, V3_CHILD_MAX_VSIZE);
+ }
+
+ // Check the descendant counts of in-mempool ancestors.
+ const auto& parent_entry = *mempool_ancestors.begin();
+ // If there are any ancestors, this is the only child allowed. The parent cannot have any
+ // other descendants. We handle the possibility of multiple children as that case is
+ // possible through a reorg.
+ const auto& children = parent_entry->GetMemPoolChildrenConst();
+ // Don't double-count a transaction that is going to be replaced. This logic assumes that
+ // any descendant of the V3 transaction is a direct child, which makes sense because a V3
+ // transaction can only have 1 descendant.
+ const bool child_will_be_replaced = !children.empty() &&
+ std::any_of(children.cbegin(), children.cend(),
+ [&direct_conflicts](const CTxMemPoolEntry& child){return direct_conflicts.count(child.GetTx().GetHash()) > 0;});
+ if (parent_entry->GetCountWithDescendants() + 1 > V3_DESCENDANT_LIMIT && !child_will_be_replaced) {
+ return strprintf("tx %u (wtxid=%s) would exceed descendant count limit",
+ parent_entry->GetSharedTx()->GetHash().ToString(),
+ parent_entry->GetSharedTx()->GetWitnessHash().ToString());
+ }
+ }
+ return std::nullopt;
+}
diff --git a/src/policy/v3_policy.h b/src/policy/v3_policy.h
new file mode 100644
index 0000000000..9e871915e5
--- /dev/null
+++ b/src/policy/v3_policy.h
@@ -0,0 +1,83 @@
+// Copyright (c) 2022 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_POLICY_V3_POLICY_H
+#define BITCOIN_POLICY_V3_POLICY_H
+
+#include <consensus/amount.h>
+#include <policy/packages.h>
+#include <policy/policy.h>
+#include <primitives/transaction.h>
+#include <txmempool.h>
+#include <util/result.h>
+
+#include <set>
+#include <string>
+
+// This module enforces rules for transactions with nVersion=3 ("v3 transactions") which help make
+// RBF abilities more robust.
+
+// v3 only allows 1 parent and 1 child when unconfirmed.
+/** Maximum number of transactions including an unconfirmed tx and its descendants. */
+static constexpr unsigned int V3_DESCENDANT_LIMIT{2};
+/** Maximum number of transactions including a V3 tx and all its mempool ancestors. */
+static constexpr unsigned int V3_ANCESTOR_LIMIT{2};
+
+/** Maximum sigop-adjusted virtual size of a tx which spends from an unconfirmed v3 transaction. */
+static constexpr int64_t V3_CHILD_MAX_VSIZE{1000};
+// These limits are within the default ancestor/descendant limits.
+static_assert(V3_CHILD_MAX_VSIZE + MAX_STANDARD_TX_WEIGHT / WITNESS_SCALE_FACTOR <= DEFAULT_ANCESTOR_SIZE_LIMIT_KVB * 1000);
+static_assert(V3_CHILD_MAX_VSIZE + MAX_STANDARD_TX_WEIGHT / WITNESS_SCALE_FACTOR <= DEFAULT_DESCENDANT_SIZE_LIMIT_KVB * 1000);
+
+/** Must be called for every transaction, even if not v3. Not strictly necessary for transactions
+ * accepted through AcceptMultipleTransactions.
+ *
+ * Checks the following rules:
+ * 1. A v3 tx must only have v3 unconfirmed ancestors.
+ * 2. A non-v3 tx must only have non-v3 unconfirmed ancestors.
+ * 3. A v3's ancestor set, including itself, must be within V3_ANCESTOR_LIMIT.
+ * 4. A v3's descendant set, including itself, must be within V3_DESCENDANT_LIMIT.
+ * 5. If a v3 tx has any unconfirmed ancestors, the tx's sigop-adjusted vsize must be within
+ * V3_CHILD_MAX_VSIZE.
+ *
+ *
+ * @param[in] mempool_ancestors The in-mempool ancestors of ptx.
+ * @param[in] direct_conflicts In-mempool transactions this tx conflicts with. These conflicts
+ * are used to more accurately calculate the resulting descendant
+ * count of in-mempool ancestors.
+ * @param[in] vsize The sigop-adjusted virtual size of ptx.
+ *
+ * @returns debug string if an error occurs, std::nullopt otherwise.
+ */
+std::optional<std::string> SingleV3Checks(const CTransactionRef& ptx,
+ const CTxMemPool::setEntries& mempool_ancestors,
+ const std::set<Txid>& direct_conflicts,
+ int64_t vsize);
+
+/** Must be called for every transaction that is submitted within a package, even if not v3.
+ *
+ * For each transaction in a package:
+ * If it's not a v3 transaction, verify it has no direct v3 parents in the mempool or the package.
+
+ * If it is a v3 transaction, verify that any direct parents in the mempool or the package are v3.
+ * If such a parent exists, verify that parent has no other children in the package or the mempool,
+ * and that the transaction itself has no children in the package.
+ *
+ * If any v3 violations in the package exist, this test will fail for one of them:
+ * - if a v3 transaction T has a parent in the mempool and a child in the package, then PV3C(T) will fail
+ * - if a v3 transaction T has a parent in the package and a child in the package, then PV3C(T) will fail
+ * - if a v3 transaction T and a v3 (sibling) transaction U have some parent in the mempool,
+ * then PV3C(T) and PV3C(U) will fail
+ * - if a v3 transaction T and a v3 (sibling) transaction U have some parent in the package,
+ * then PV3C(T) and PV3C(U) will fail
+ * - if a v3 transaction T has a parent P and a grandparent G in the package, then
+ * PV3C(P) will fail (though PV3C(G) and PV3C(T) might succeed).
+ *
+ * @returns debug string if an error occurs, std::nullopt otherwise.
+ * */
+std::optional<std::string> PackageV3Checks(const CTransactionRef& ptx, int64_t vsize,
+ const Package& package,
+ const CTxMemPool::setEntries& mempool_ancestors);
+
+#endif // BITCOIN_POLICY_V3_POLICY_H
diff --git a/src/prevector.h b/src/prevector.h
index bcab1ff00c..4776db789b 100644
--- a/src/prevector.h
+++ b/src/prevector.h
@@ -47,26 +47,28 @@ public:
typedef const value_type* const_pointer;
class iterator {
- T* ptr;
+ T* ptr{};
public:
typedef Diff difference_type;
typedef T value_type;
typedef T* pointer;
typedef T& reference;
- typedef std::random_access_iterator_tag iterator_category;
+ using element_type = T;
+ using iterator_category = std::contiguous_iterator_tag;
+ iterator() = default;
iterator(T* ptr_) : ptr(ptr_) {}
T& operator*() const { return *ptr; }
T* operator->() const { return ptr; }
- T& operator[](size_type pos) { return ptr[pos]; }
- const T& operator[](size_type pos) const { return ptr[pos]; }
+ T& operator[](size_type pos) const { return ptr[pos]; }
iterator& operator++() { ptr++; return *this; }
iterator& operator--() { ptr--; return *this; }
iterator operator++(int) { iterator copy(*this); ++(*this); return copy; }
iterator operator--(int) { iterator copy(*this); --(*this); return copy; }
difference_type friend operator-(iterator a, iterator b) { return (&(*a) - &(*b)); }
- iterator operator+(size_type n) { return iterator(ptr + n); }
+ iterator operator+(size_type n) const { return iterator(ptr + n); }
+ iterator friend operator+(size_type n, iterator x) { return x + n; }
iterator& operator+=(size_type n) { ptr += n; return *this; }
- iterator operator-(size_type n) { return iterator(ptr - n); }
+ iterator operator-(size_type n) const { return iterator(ptr - n); }
iterator& operator-=(size_type n) { ptr -= n; return *this; }
bool operator==(iterator x) const { return ptr == x.ptr; }
bool operator!=(iterator x) const { return ptr != x.ptr; }
@@ -77,18 +79,17 @@ public:
};
class reverse_iterator {
- T* ptr;
+ T* ptr{};
public:
typedef Diff difference_type;
typedef T value_type;
typedef T* pointer;
typedef T& reference;
typedef std::bidirectional_iterator_tag iterator_category;
+ reverse_iterator() = default;
reverse_iterator(T* ptr_) : ptr(ptr_) {}
- T& operator*() { return *ptr; }
- const T& operator*() const { return *ptr; }
- T* operator->() { return ptr; }
- const T* operator->() const { return ptr; }
+ T& operator*() const { return *ptr; }
+ T* operator->() const { return ptr; }
reverse_iterator& operator--() { ptr++; return *this; }
reverse_iterator& operator++() { ptr--; return *this; }
reverse_iterator operator++(int) { reverse_iterator copy(*this); ++(*this); return copy; }
@@ -98,13 +99,15 @@ public:
};
class const_iterator {
- const T* ptr;
+ const T* ptr{};
public:
typedef Diff difference_type;
typedef const T value_type;
typedef const T* pointer;
typedef const T& reference;
- typedef std::random_access_iterator_tag iterator_category;
+ using element_type = const T;
+ using iterator_category = std::contiguous_iterator_tag;
+ const_iterator() = default;
const_iterator(const T* ptr_) : ptr(ptr_) {}
const_iterator(iterator x) : ptr(&(*x)) {}
const T& operator*() const { return *ptr; }
@@ -115,9 +118,10 @@ public:
const_iterator operator++(int) { const_iterator copy(*this); ++(*this); return copy; }
const_iterator operator--(int) { const_iterator copy(*this); --(*this); return copy; }
difference_type friend operator-(const_iterator a, const_iterator b) { return (&(*a) - &(*b)); }
- const_iterator operator+(size_type n) { return const_iterator(ptr + n); }
+ const_iterator operator+(size_type n) const { return const_iterator(ptr + n); }
+ const_iterator friend operator+(size_type n, const_iterator x) { return x + n; }
const_iterator& operator+=(size_type n) { ptr += n; return *this; }
- const_iterator operator-(size_type n) { return const_iterator(ptr - n); }
+ const_iterator operator-(size_type n) const { return const_iterator(ptr - n); }
const_iterator& operator-=(size_type n) { ptr -= n; return *this; }
bool operator==(const_iterator x) const { return ptr == x.ptr; }
bool operator!=(const_iterator x) const { return ptr != x.ptr; }
@@ -128,13 +132,14 @@ public:
};
class const_reverse_iterator {
- const T* ptr;
+ const T* ptr{};
public:
typedef Diff difference_type;
typedef const T value_type;
typedef const T* pointer;
typedef const T& reference;
typedef std::bidirectional_iterator_tag iterator_category;
+ const_reverse_iterator() = default;
const_reverse_iterator(const T* ptr_) : ptr(ptr_) {}
const_reverse_iterator(reverse_iterator x) : ptr(&(*x)) {}
const T& operator*() const { return *ptr; }
diff --git a/src/primitives/block.h b/src/primitives/block.h
index 99accfc7dd..832f8a03f7 100644
--- a/src/primitives/block.h
+++ b/src/primitives/block.h
@@ -71,8 +71,10 @@ public:
// network and disk
std::vector<CTransactionRef> vtx;
- // memory only
- mutable bool fChecked;
+ // Memory-only flags for caching expensive checks
+ mutable bool fChecked; // CheckBlock()
+ mutable bool m_checked_witness_commitment{false}; // CheckWitnessCommitment()
+ mutable bool m_checked_merkle_root{false}; // CheckMerkleRoot()
CBlock()
{
@@ -95,6 +97,8 @@ public:
CBlockHeader::SetNull();
vtx.clear();
fChecked = false;
+ m_checked_witness_commitment = false;
+ m_checked_merkle_root = false;
}
CBlockHeader GetBlockHeader() const
diff --git a/src/protocol.cpp b/src/protocol.cpp
index 27a0a2ffc1..0da160768d 100644
--- a/src/protocol.cpp
+++ b/src/protocol.cpp
@@ -9,8 +9,6 @@
#include <atomic>
-static std::atomic<bool> g_initial_block_download_completed(false);
-
namespace NetMsgType {
const char* VERSION = "version";
const char* VERACK = "verack";
@@ -125,18 +123,6 @@ bool CMessageHeader::IsCommandValid() const
return true;
}
-
-ServiceFlags GetDesirableServiceFlags(ServiceFlags services) {
- if ((services & NODE_NETWORK_LIMITED) && g_initial_block_download_completed) {
- return ServiceFlags(NODE_NETWORK_LIMITED | NODE_WITNESS);
- }
- return ServiceFlags(NODE_NETWORK | NODE_WITNESS);
-}
-
-void SetServiceFlagsIBDCache(bool state) {
- g_initial_block_download_completed = state;
-}
-
CInv::CInv()
{
type = 0;
diff --git a/src/protocol.h b/src/protocol.h
index e405253632..243cd23e6e 100644
--- a/src/protocol.h
+++ b/src/protocol.h
@@ -311,43 +311,12 @@ enum ServiceFlags : uint64_t {
std::vector<std::string> serviceFlagsToStr(uint64_t flags);
/**
- * Gets the set of service flags which are "desirable" for a given peer.
- *
- * These are the flags which are required for a peer to support for them
- * to be "interesting" to us, ie for us to wish to use one of our few
- * outbound connection slots for or for us to wish to prioritize keeping
- * their connection around.
- *
- * Relevant service flags may be peer- and state-specific in that the
- * version of the peer may determine which flags are required (eg in the
- * case of NODE_NETWORK_LIMITED where we seek out NODE_NETWORK peers
- * unless they set NODE_NETWORK_LIMITED and we are out of IBD, in which
- * case NODE_NETWORK_LIMITED suffices).
- *
- * Thus, generally, avoid calling with peerServices == NODE_NONE, unless
- * state-specific flags must absolutely be avoided. When called with
- * peerServices == NODE_NONE, the returned desirable service flags are
- * guaranteed to not change dependent on state - ie they are suitable for
- * use when describing peers which we know to be desirable, but for which
- * we do not have a confirmed set of service flags.
- *
- * If the NODE_NONE return value is changed, contrib/seeds/makeseeds.py
- * should be updated appropriately to filter for the same nodes.
- */
-ServiceFlags GetDesirableServiceFlags(ServiceFlags services);
-
-/** Set the current IBD status in order to figure out the desirable service flags */
-void SetServiceFlagsIBDCache(bool status);
-
-/**
- * A shortcut for (services & GetDesirableServiceFlags(services))
- * == GetDesirableServiceFlags(services), ie determines whether the given
- * set of service flags are sufficient for a peer to be "relevant".
- */
-static inline bool HasAllDesirableServiceFlags(ServiceFlags services)
-{
- return !(GetDesirableServiceFlags(services) & (~services));
-}
+ * State independent service flags.
+ * If the return value is changed, contrib/seeds/makeseeds.py
+ * should be updated appropriately to filter for nodes with
+ * desired service flags (compatible with our new flags).
+ */
+constexpr ServiceFlags SeedsServiceFlags() { return ServiceFlags(NODE_NETWORK | NODE_WITNESS); }
/**
* Checks if a peer with the given service flags may be capable of having a
diff --git a/src/pubkey.h b/src/pubkey.h
index 2b655c3f73..15d7e7bc07 100644
--- a/src/pubkey.h
+++ b/src/pubkey.h
@@ -285,10 +285,11 @@ public:
CPubKey GetEvenCorrespondingCPubKey() const;
const unsigned char& operator[](int pos) const { return *(m_keydata.begin() + pos); }
- const unsigned char* data() const { return m_keydata.begin(); }
static constexpr size_t size() { return decltype(m_keydata)::size(); }
+ const unsigned char* data() const { return m_keydata.begin(); }
const unsigned char* begin() const { return m_keydata.begin(); }
const unsigned char* end() const { return m_keydata.end(); }
+ unsigned char* data() { return m_keydata.begin(); }
unsigned char* begin() { return m_keydata.begin(); }
unsigned char* end() { return m_keydata.end(); }
bool operator==(const XOnlyPubKey& other) const { return m_keydata == other.m_keydata; }
diff --git a/src/qt/addressbookpage.cpp b/src/qt/addressbookpage.cpp
index 05e58191fc..f2f9371c65 100644
--- a/src/qt/addressbookpage.cpp
+++ b/src/qt/addressbookpage.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/addressbookpage.h>
#include <qt/forms/ui_addressbookpage.h>
diff --git a/src/qt/askpassphrasedialog.cpp b/src/qt/askpassphrasedialog.cpp
index 246dff0069..a4771bbb82 100644
--- a/src/qt/askpassphrasedialog.cpp
+++ b/src/qt/askpassphrasedialog.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/askpassphrasedialog.h>
#include <qt/forms/ui_askpassphrasedialog.h>
diff --git a/src/qt/bitcoin.cpp b/src/qt/bitcoin.cpp
index 33c305f0d4..b1a8461d02 100644
--- a/src/qt/bitcoin.cpp
+++ b/src/qt/bitcoin.cpp
@@ -372,6 +372,11 @@ void BitcoinApplication::requestShutdown()
// Request node shutdown, which can interrupt long operations, like
// rescanning a wallet.
node().startShutdown();
+ // Prior to unsetting the client model, stop listening backend signals
+ if (clientModel) {
+ clientModel->stop();
+ }
+
// Unsetting the client model can cause the current thread to wait for node
// to complete an operation, like wait for a RPC execution to complete.
window->setClientModel(nullptr);
diff --git a/src/qt/bitcoin_locale.qrc b/src/qt/bitcoin_locale.qrc
index cdfa98acea..8883134b83 100644
--- a/src/qt/bitcoin_locale.qrc
+++ b/src/qt/bitcoin_locale.qrc
@@ -1,5 +1,6 @@
<!DOCTYPE RCC><RCC version="1.0">
<qresource prefix="/translations">
+ <file alias="af">locale/bitcoin_af.qm</file>
<file alias="am">locale/bitcoin_am.qm</file>
<file alias="ar">locale/bitcoin_ar.qm</file>
<file alias="az">locale/bitcoin_az.qm</file>
@@ -32,6 +33,7 @@
<file alias="fa">locale/bitcoin_fa.qm</file>
<file alias="fi">locale/bitcoin_fi.qm</file>
<file alias="fil">locale/bitcoin_fil.qm</file>
+ <file alias="fo">locale/bitcoin_fo.qm</file>
<file alias="fr">locale/bitcoin_fr.qm</file>
<file alias="fr_CM">locale/bitcoin_fr_CM.qm</file>
<file alias="fr_LU">locale/bitcoin_fr_LU.qm</file>
@@ -53,6 +55,7 @@
<file alias="ja">locale/bitcoin_ja.qm</file>
<file alias="ka">locale/bitcoin_ka.qm</file>
<file alias="kk">locale/bitcoin_kk.qm</file>
+ <file alias="kk@latin">locale/bitcoin_kk@latin.qm</file>
<file alias="kl">locale/bitcoin_kl.qm</file>
<file alias="km">locale/bitcoin_km.qm</file>
<file alias="kn">locale/bitcoin_kn.qm</file>
@@ -61,15 +64,18 @@
<file alias="ku_IQ">locale/bitcoin_ku_IQ.qm</file>
<file alias="ky">locale/bitcoin_ky.qm</file>
<file alias="la">locale/bitcoin_la.qm</file>
+ <file alias="lb">locale/bitcoin_lb.qm</file>
<file alias="lt">locale/bitcoin_lt.qm</file>
<file alias="lv">locale/bitcoin_lv.qm</file>
<file alias="mg">locale/bitcoin_mg.qm</file>
+ <file alias="mi">locale/bitcoin_mi.qm</file>
<file alias="mk">locale/bitcoin_mk.qm</file>
<file alias="ml">locale/bitcoin_ml.qm</file>
<file alias="mn">locale/bitcoin_mn.qm</file>
<file alias="mr">locale/bitcoin_mr.qm</file>
<file alias="mr_IN">locale/bitcoin_mr_IN.qm</file>
<file alias="ms">locale/bitcoin_ms.qm</file>
+ <file alias="mt">locale/bitcoin_mt.qm</file>
<file alias="my">locale/bitcoin_my.qm</file>
<file alias="nb">locale/bitcoin_nb.qm</file>
<file alias="ne">locale/bitcoin_ne.qm</file>
@@ -79,11 +85,11 @@
<file alias="pam">locale/bitcoin_pam.qm</file>
<file alias="pl">locale/bitcoin_pl.qm</file>
<file alias="pt">locale/bitcoin_pt.qm</file>
- <file alias="pt@qtfiletype">locale/bitcoin_pt@qtfiletype.qm</file>
<file alias="pt_BR">locale/bitcoin_pt_BR.qm</file>
<file alias="ro">locale/bitcoin_ro.qm</file>
<file alias="ru">locale/bitcoin_ru.qm</file>
<file alias="sc">locale/bitcoin_sc.qm</file>
+ <file alias="sd">locale/bitcoin_sd.qm</file>
<file alias="si">locale/bitcoin_si.qm</file>
<file alias="sk">locale/bitcoin_sk.qm</file>
<file alias="sl">locale/bitcoin_sl.qm</file>
@@ -98,7 +104,6 @@
<file alias="szl">locale/bitcoin_szl.qm</file>
<file alias="ta">locale/bitcoin_ta.qm</file>
<file alias="te">locale/bitcoin_te.qm</file>
- <file alias="th">locale/bitcoin_th.qm</file>
<file alias="tk">locale/bitcoin_tk.qm</file>
<file alias="tl">locale/bitcoin_tl.qm</file>
<file alias="tr">locale/bitcoin_tr.qm</file>
diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp
index fd71938b60..5f132b817e 100644
--- a/src/qt/bitcoingui.cpp
+++ b/src/qt/bitcoingui.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <qt/bitcoingui.h>
#include <qt/bitcoinunits.h>
@@ -673,8 +677,10 @@ void BitcoinGUI::setClientModel(ClientModel *_clientModel, interfaces::BlockAndH
#ifdef ENABLE_WALLET
void BitcoinGUI::enableHistoryAction(bool privacy)
{
- historyAction->setEnabled(!privacy);
- if (historyAction->isChecked()) gotoOverviewPage();
+ if (walletFrame->currentWalletModel()) {
+ historyAction->setEnabled(!privacy);
+ if (historyAction->isChecked()) gotoOverviewPage();
+ }
}
void BitcoinGUI::setWalletController(WalletController* wallet_controller, bool show_loading_minimized)
@@ -983,6 +989,7 @@ void BitcoinGUI::gotoLoadPSBT(bool from_clipboard)
void BitcoinGUI::updateNetworkState()
{
+ if (!clientModel) return;
int count = clientModel->getNumConnections();
QString icon;
switch(count)
diff --git a/src/qt/bitcoinstrings.cpp b/src/qt/bitcoinstrings.cpp
index d7b1c70c59..6035647f1c 100644
--- a/src/qt/bitcoinstrings.cpp
+++ b/src/qt/bitcoinstrings.cpp
@@ -258,6 +258,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Disk space is too low!"),
QT_TRANSLATE_NOOP("bitcoin-core", "Do you want to rebuild the block database now?"),
QT_TRANSLATE_NOOP("bitcoin-core", "Done loading"),
QT_TRANSLATE_NOOP("bitcoin-core", "Dump file %s does not exist."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error committing db txn for wallet transactions removal"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error creating %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error initializing block database"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error initializing wallet database environment %s!"),
@@ -270,9 +271,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Error opening block database"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error reading configuration file: %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error reading from database, shutting down."),
QT_TRANSLATE_NOOP("bitcoin-core", "Error reading next record from wallet database"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error starting db txn for wallet transactions removal"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Cannot extract destination from the generated scriptpubkey"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Error: Could not add watchonly tx to watchonly wallet"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Error: Could not delete watchonly transactions"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: Could not add watchonly tx %s to watchonly wallet"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: Could not delete watchonly transactions. "),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Couldn't create cursor into database"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Disk space is low for %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Dumpfile checksum does not match. Computed %s, expected %s"),
@@ -282,19 +284,24 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Error: Got value that was not hex: %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Keypool ran out, please call keypoolrefill first"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Missing checksum"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: No %s addresses available."),
-QT_TRANSLATE_NOOP("bitcoin-core", "Error: Not all watchonly txs could be deleted"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: This wallet already uses SQLite"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: This wallet is already a descriptor wallet"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to begin reading all records in the database"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to make a backup of your wallet"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to parse version %u as a uint32_t"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to read all records in the database"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to read wallet's best block locator record"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to remove watchonly address book data"),
QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to write record to new wallet"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to write solvable wallet best block locator record"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: Unable to write watchonly wallet best block locator record"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: address book copy failed for wallet %s"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Error: database transaction cannot be executed for wallet %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to listen on any port. Use -listen=0 if you want this."),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to rescan the wallet during initialization"),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to start indexes, shutting down.."),
QT_TRANSLATE_NOOP("bitcoin-core", "Failed to verify database"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Failure removing transaction: %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Fee rate (%s) is lower than the minimum fee rate setting (%s)"),
QT_TRANSLATE_NOOP("bitcoin-core", "Ignoring duplicate -wallet %s."),
QT_TRANSLATE_NOOP("bitcoin-core", "Importing…"),
@@ -352,10 +359,10 @@ QT_TRANSLATE_NOOP("bitcoin-core", "The wallet will avoid paying less than the mi
QT_TRANSLATE_NOOP("bitcoin-core", "This is experimental software."),
QT_TRANSLATE_NOOP("bitcoin-core", "This is the minimum transaction fee you pay on every transaction."),
QT_TRANSLATE_NOOP("bitcoin-core", "This is the transaction fee you will pay if you send a transaction."),
+QT_TRANSLATE_NOOP("bitcoin-core", "Transaction %s does not belong to this wallet"),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction amount too small"),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction amounts must not be negative"),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction change output index out of range"),
-QT_TRANSLATE_NOOP("bitcoin-core", "Transaction has too long of a mempool chain"),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction must have at least one recipient"),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction needs a change address, but we can't generate it."),
QT_TRANSLATE_NOOP("bitcoin-core", "Transaction too large"),
@@ -380,6 +387,7 @@ QT_TRANSLATE_NOOP("bitcoin-core", "Unsupported logging category %s=%s."),
QT_TRANSLATE_NOOP("bitcoin-core", "User Agent comment (%s) contains unsafe characters."),
QT_TRANSLATE_NOOP("bitcoin-core", "Verifying blocks…"),
QT_TRANSLATE_NOOP("bitcoin-core", "Verifying wallet(s)…"),
+QT_TRANSLATE_NOOP("bitcoin-core", "Wallet file creation failed: %s"),
QT_TRANSLATE_NOOP("bitcoin-core", "Wallet needed to be rewritten: restart %s to complete"),
QT_TRANSLATE_NOOP("bitcoin-core", "acceptstalefeeestimates is not supported on %s chain."),
};
diff --git a/src/qt/clientmodel.cpp b/src/qt/clientmodel.cpp
index ff7405d139..05172cfbd2 100644
--- a/src/qt/clientmodel.cpp
+++ b/src/qt/clientmodel.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <qt/clientmodel.h>
#include <qt/bantablemodel.h>
@@ -66,7 +70,7 @@ ClientModel::ClientModel(interfaces::Node& node, OptionsModel *_optionsModel, QO
subscribeToCoreSignals();
}
-ClientModel::~ClientModel()
+void ClientModel::stop()
{
unsubscribeFromCoreSignals();
@@ -74,6 +78,11 @@ ClientModel::~ClientModel()
m_thread->wait();
}
+ClientModel::~ClientModel()
+{
+ stop();
+}
+
int ClientModel::getNumConnections(unsigned int flags) const
{
ConnectionDirection connections = ConnectionDirection::None;
@@ -234,47 +243,41 @@ void ClientModel::TipChanged(SynchronizationState sync_state, interfaces::BlockT
void ClientModel::subscribeToCoreSignals()
{
- m_handler_show_progress = m_node.handleShowProgress(
+ m_event_handlers.emplace_back(m_node.handleShowProgress(
[this](const std::string& title, int progress, [[maybe_unused]] bool resume_possible) {
Q_EMIT showProgress(QString::fromStdString(title), progress);
- });
- m_handler_notify_num_connections_changed = m_node.handleNotifyNumConnectionsChanged(
+ }));
+ m_event_handlers.emplace_back(m_node.handleNotifyNumConnectionsChanged(
[this](int new_num_connections) {
Q_EMIT numConnectionsChanged(new_num_connections);
- });
- m_handler_notify_network_active_changed = m_node.handleNotifyNetworkActiveChanged(
+ }));
+ m_event_handlers.emplace_back(m_node.handleNotifyNetworkActiveChanged(
[this](bool network_active) {
Q_EMIT networkActiveChanged(network_active);
- });
- m_handler_notify_alert_changed = m_node.handleNotifyAlertChanged(
+ }));
+ m_event_handlers.emplace_back(m_node.handleNotifyAlertChanged(
[this]() {
qDebug() << "ClientModel: NotifyAlertChanged";
Q_EMIT alertsChanged(getStatusBarWarnings());
- });
- m_handler_banned_list_changed = m_node.handleBannedListChanged(
+ }));
+ m_event_handlers.emplace_back(m_node.handleBannedListChanged(
[this]() {
qDebug() << "ClienModel: Requesting update for peer banlist";
QMetaObject::invokeMethod(banTableModel, [this] { banTableModel->refresh(); });
- });
- m_handler_notify_block_tip = m_node.handleNotifyBlockTip(
+ }));
+ m_event_handlers.emplace_back(m_node.handleNotifyBlockTip(
[this](SynchronizationState sync_state, interfaces::BlockTip tip, double verification_progress) {
TipChanged(sync_state, tip, verification_progress, SyncType::BLOCK_SYNC);
- });
- m_handler_notify_header_tip = m_node.handleNotifyHeaderTip(
+ }));
+ m_event_handlers.emplace_back(m_node.handleNotifyHeaderTip(
[this](SynchronizationState sync_state, interfaces::BlockTip tip, bool presync) {
TipChanged(sync_state, tip, /*verification_progress=*/0.0, presync ? SyncType::HEADER_PRESYNC : SyncType::HEADER_SYNC);
- });
+ }));
}
void ClientModel::unsubscribeFromCoreSignals()
{
- m_handler_show_progress->disconnect();
- m_handler_notify_num_connections_changed->disconnect();
- m_handler_notify_network_active_changed->disconnect();
- m_handler_notify_alert_changed->disconnect();
- m_handler_banned_list_changed->disconnect();
- m_handler_notify_block_tip->disconnect();
- m_handler_notify_header_tip->disconnect();
+ m_event_handlers.clear();
}
bool ClientModel::getProxyInfo(std::string& ip_port) const
diff --git a/src/qt/clientmodel.h b/src/qt/clientmodel.h
index 493e18a07d..624056b5df 100644
--- a/src/qt/clientmodel.h
+++ b/src/qt/clientmodel.h
@@ -58,6 +58,8 @@ public:
explicit ClientModel(interfaces::Node& node, OptionsModel *optionsModel, QObject *parent = nullptr);
~ClientModel();
+ void stop();
+
interfaces::Node& node() const { return m_node; }
OptionsModel *getOptionsModel();
PeerTableModel *getPeerTableModel();
@@ -95,13 +97,7 @@ public:
private:
interfaces::Node& m_node;
- std::unique_ptr<interfaces::Handler> m_handler_show_progress;
- std::unique_ptr<interfaces::Handler> m_handler_notify_num_connections_changed;
- std::unique_ptr<interfaces::Handler> m_handler_notify_network_active_changed;
- std::unique_ptr<interfaces::Handler> m_handler_notify_alert_changed;
- std::unique_ptr<interfaces::Handler> m_handler_banned_list_changed;
- std::unique_ptr<interfaces::Handler> m_handler_notify_block_tip;
- std::unique_ptr<interfaces::Handler> m_handler_notify_header_tip;
+ std::vector<std::unique_ptr<interfaces::Handler>> m_event_handlers;
OptionsModel *optionsModel;
PeerTableModel* peerTableModel{nullptr};
PeerTableSortProxy* m_peer_table_sort_proxy{nullptr};
diff --git a/src/qt/coincontroldialog.cpp b/src/qt/coincontroldialog.cpp
index 9e49fd87fb..5e412bd6b1 100644
--- a/src/qt/coincontroldialog.cpp
+++ b/src/qt/coincontroldialog.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/coincontroldialog.h>
#include <qt/forms/ui_coincontroldialog.h>
diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui
index 6be47e94fe..99fb238772 100644
--- a/src/qt/forms/optionsdialog.ui
+++ b/src/qt/forms/optionsdialog.ui
@@ -772,104 +772,29 @@
</layout>
</item>
<item>
- <widget class="QGroupBox" name="font_groupBox">
- <property name="title">
- <string>Monospaced font in the Overview tab:</string>
- </property>
- <layout class="QVBoxLayout" name="font_verticalLayout">
- <item>
- <layout class="QHBoxLayout" name="embeddedFont_horizontalLayout">
- <item>
- <widget class="QRadioButton" name="embeddedFont_radioButton">
- <property name="text">
- <string>embedded &quot;%1&quot;</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="embeddedFont_horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <layout class="QVBoxLayout" name="embeddedFont_verticalLayout">
- <item>
- <widget class="QLabel" name="embeddedFont_label_1">
- <property name="text">
- <string notr="true">111.11111111 BTC</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="embeddedFont_label_9">
- <property name="text">
- <string notr="true">909.09090909 BTC</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </item>
- <item>
- <widget class="Line" name="font_line">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="systemFont_horizontalLayout">
- <item>
- <widget class="QRadioButton" name="systemFont_radioButton">
- <property name="text">
- <string>closest matching &quot;%1&quot;</string>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="systemFont_horizontalSpacer">
- <property name="orientation">
- <enum>Qt::Horizontal</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>40</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <layout class="QVBoxLayout" name="systemFont_verticalLayout">
- <item>
- <widget class="QLabel" name="systemFont_label_1">
- <property name="text">
- <string notr="true">111.11111111 BTC</string>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="systemFont_label_9">
- <property name="text">
- <string notr="true">909.09090909 BTC</string>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
+ <layout class="QHBoxLayout" name="horizontalLayout_4_Display">
+ <item>
+ <widget class="QLabel" name="moneyFontLabel">
+ <property name="text">
+ <string>Font in the Overview tab: </string>
+ </property>
+ <property name="buddy">
+ <cstring>moneyFont</cstring>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="moneyFont"/>
+ </item>
+ <item>
+ <widget class="QLabel" name="moneyFont_preview">
+ <property name="text">
+ <string notr="true">111.11111111 BTC
+909.09090909 BTC</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
</item>
<item>
<spacer name="verticalSpacer_Display">
diff --git a/src/qt/guiconstants.h b/src/qt/guiconstants.h
index 0f76770772..0386689baf 100644
--- a/src/qt/guiconstants.h
+++ b/src/qt/guiconstants.h
@@ -25,7 +25,7 @@ static const int STATUSBAR_ICONSIZE = 16;
static const bool DEFAULT_SPLASHSCREEN = true;
/* Invalid field background style */
-#define STYLE_INVALID "background:#FF8080"
+#define STYLE_INVALID "border: 3px solid #FF8080"
/* Transaction list -- unconfirmed transaction */
#define COLOR_UNCONFIRMED QColor(128, 128, 128)
diff --git a/src/qt/guiutil.cpp b/src/qt/guiutil.cpp
index ebfd14cc25..084b9a6615 100644
--- a/src/qt/guiutil.cpp
+++ b/src/qt/guiutil.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <qt/guiutil.h>
#include <qt/bitcoinaddressvalidator.h>
diff --git a/src/qt/intro.cpp b/src/qt/intro.cpp
index f86b167076..5371dbaa30 100644
--- a/src/qt/intro.cpp
+++ b/src/qt/intro.cpp
@@ -142,8 +142,9 @@ Intro::Intro(QWidget *parent, int64_t blockchain_size_gb, int64_t chain_state_si
const int min_prune_target_GB = std::ceil(MIN_DISK_SPACE_FOR_BLOCK_FILES / 1e9);
ui->pruneGB->setRange(min_prune_target_GB, std::numeric_limits<int>::max());
- if (gArgs.GetIntArg("-prune", 0) > 1) { // -prune=1 means enabled, above that it's a size in MiB
- ui->prune->setChecked(true);
+ if (gArgs.IsArgSet("-prune")) {
+ m_prune_checkbox_is_default = false;
+ ui->prune->setChecked(gArgs.GetIntArg("-prune", 0) >= 1);
ui->prune->setEnabled(false);
}
ui->pruneGB->setValue(m_prune_target_gb);
@@ -152,6 +153,7 @@ Intro::Intro(QWidget *parent, int64_t blockchain_size_gb, int64_t chain_state_si
UpdatePruneLabels(ui->prune->isChecked());
connect(ui->prune, &QCheckBox::toggled, [this](bool prune_checked) {
+ m_prune_checkbox_is_default = false;
UpdatePruneLabels(prune_checked);
UpdateFreeSpaceLabel();
});
@@ -287,7 +289,7 @@ void Intro::setStatus(int status, const QString &message, quint64 bytesAvailable
ui->freeSpace->setText("");
} else {
m_bytes_available = bytesAvailable;
- if (ui->prune->isEnabled() && !(gArgs.IsArgSet("-prune") && gArgs.GetIntArg("-prune", 0) == 0)) {
+ if (ui->prune->isEnabled() && m_prune_checkbox_is_default) {
ui->prune->setChecked(m_bytes_available < (m_blockchain_size_gb + m_chain_state_size_gb + 10) * GB_BYTES);
}
UpdateFreeSpaceLabel();
diff --git a/src/qt/intro.h b/src/qt/intro.h
index 900c657b27..7b34c73b02 100644
--- a/src/qt/intro.h
+++ b/src/qt/intro.h
@@ -64,6 +64,7 @@ private Q_SLOTS:
private:
Ui::Intro *ui;
+ bool m_prune_checkbox_is_default{true};
QThread* thread{nullptr};
QMutex mutex;
bool signalled{false};
diff --git a/src/qt/locale/bitcoin_af.ts b/src/qt/locale/bitcoin_af.ts
new file mode 100644
index 0000000000..cc4eefbe31
--- /dev/null
+++ b/src/qt/locale/bitcoin_af.ts
@@ -0,0 +1,315 @@
+<TS version="2.1" language="af">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">Regsklik om adres of etiket te verander</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation type="unfinished">Skep ’n nuwe adres</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
+Signing is only possible with addresses of the type 'legacy'.</source>
+ <translation type="unfinished">
+Hierdie is die adresse waar u Bitcoins sal ontvang. Ons beveel aan dat u 'n nuwe adres kies vir elke transaksie</translation>
+ </message>
+ <message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Stuur adresse -%1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Ontvangs van adresse - %1</translation>
+ </message>
+ </context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">Die wagwoordfrase wat vir die beursie-dekripsie ingevoer is, is verkeerd. Dit bevat 'n nulkarakter (dws - 'n nulgreep). As die wagwoordfrase gestel is met 'n weergawe van hierdie sagteware voor 25.0, probeer asseblief weer met slegs die karakters tot - maar nie ingesluit nie - die eerste nulkarakter. As dit suksesvol is, stel asseblief 'n nuwe wagwoordfrase in om hierdie probleem in die toekoms te vermy.</translation>
+ </message>
+ <message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Wagfraseverandering het misluk</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">Die ou wagwoordfrase wat vir die beursie-dekripsie ingevoer is, is verkeerd. Dit bevat 'n nulkarakter (dws - 'n nulgreep). As die wagwoordfrase gestel is met 'n weergawe van hierdie sagteware voor 25.0, probeer asseblief weer met slegs die karakters tot - maar nie ingesluit nie - die eerste nulkarakter.</translation>
+ </message>
+ </context>
+<context>
+ <name>BitcoinApplication</name>
+ <message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">Instellingslêer %1 kan korrup of ongeldig wees.</translation>
+ </message>
+ </context>
+<context>
+ <name>QObject</name>
+ <message numerus="yes">
+ <source>%n second(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n second(s)</numerusform>
+ <numerusform>%n second(s)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n minute(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n minute(s)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n hour(s)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n day(s)</numerusform>
+ <numerusform>%n day(s)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Stel beursie terug …</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Herstel 'n beursie vanaf 'n rugsteunlêer</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migreer Wallet</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migreer Wallet</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Laai Wallet-rugsteun</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Herstel beursie</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Voor-sinkroniseringsopskrifte (%1%)...</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Kon nie beursie skep nie</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Kan nie nuwe beursie skep nie, die sagteware is saamgestel sonder sqlite-ondersteuning (vereis vir beskrywer-beursies)</translation>
+ </message>
+ </context>
+<context>
+ <name>CreateWalletActivity</name>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">Te veel eksterne ondertekenaars gevind</translation>
+ </message>
+</context>
+<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migreer beursie</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Is jy seker jy wil die beursie migreer &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Om die beursie te migreer, sal hierdie beursie na een of meer beskrywer-beursies omskakel. 'n Nuwe beursie-rugsteun sal gemaak moet word.
+As hierdie beursie enige oplosbare maar nie gekykte skrifte bevat nie, sal 'n ander en nuwe beursie geskep word wat daardie skrifte bevat.
+As hierdie beursie enige oplosbare maar nie gekykte skrifte bevat nie, sal 'n ander en nuwe beursie geskep word wat daardie skrifte bevat.
+
+Die migrasieproses sal 'n rugsteun van die beursie skep voordat dit migreer. Hierdie rugsteunlêer sal 'n naam kry &lt;wallet name&gt;-&lt;timestamp&gt;. legacy.bak en kan gevind word in die gids vir hierdie beursie. In die geval van 'n verkeerde migrasie, kan die rugsteun met die "Herstel Wallet"-funksie herstel word.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migreer Wallet</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migreer Wallet &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Die beursie'%1' is suksesvol gemigreer.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migrasie het misluk</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migrasie suksesvol</translation>
+ </message>
+</context>
+<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Herstel beursie</translation>
+ </message>
+ <message>
+ <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
+ <translation type="unfinished">Herstel beursie &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>Restore wallet failed</source>
+ <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
+ <translation type="unfinished">Herstel beursie het misluk</translation>
+ </message>
+ <message>
+ <source>Restore wallet warning</source>
+ <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
+ <translation type="unfinished">Herstel beursie waarskuwing</translation>
+ </message>
+ <message>
+ <source>Restore wallet message</source>
+ <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
+ <translation type="unfinished">Herstel beursieboodskap</translation>
+ </message>
+</context>
+<context>
+ <name>CreateWalletDialog</name>
+ <message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Jy is een stap weg van die skep van jou nuwe beursie!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Verskaf asseblief 'n naam en, indien verlang, aktiveer enige gevorderde opsies</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message numerus="yes">
+ <source>%n GB of space available</source>
+ <translation type="unfinished">
+ <numerusform>%n GB of space available</numerusform>
+ <numerusform>%n GB of space available</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation type="unfinished">
+ <numerusform>(of %n GB needed)</numerusform>
+ <numerusform>(of %n GB needed)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(%n GB needed for full chain)</source>
+ <translation type="unfinished">
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(%n GB needed for full chain)</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">Kies datagids</translation>
+ </message>
+ <message numerus="yes">
+ <source>(sufficient to restore backups %n day(s) old)</source>
+ <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
+ <translation type="unfinished">
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
+ <translation type="unfinished">Wanneer jy OK klik, %1 sal begin om die volledige af te laai en te verwerk %4 blok ketting (%2GB) begin met die vroegste transaksies in %3 wanneer %4 aanvanklik van stapel gestuur.</translation>
+ </message>
+ </context>
+<context>
+ <name>ModalOverlay</name>
+ <message>
+ <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Onbekend. Voor-sinkronisering opskrifte (%1, %2%)...</translation>
+ </message>
+</context>
+<context>
+ <name>OptionsDialog</name>
+ <message>
+ <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
+ <translation type="unfinished">Volle pad na 'n%1 versoenbare skrip (bv. C:\Downloads\hwi.exe of /Users/you/Downloads/hwi.py). Pasop: wanware kan jou munte steel!</translation>
+ </message>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionDesc</name>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation type="unfinished">
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ </translation>
+ </message>
+ </context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_am.ts b/src/qt/locale/bitcoin_am.ts
index c9f6fb442a..502acb9879 100644
--- a/src/qt/locale/bitcoin_am.ts
+++ b/src/qt/locale/bitcoin_am.ts
@@ -7,7 +7,7 @@
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">አዲስ አድራሻ ፍጠር</translation>
+ <translation type="unfinished">አዲስ አድራሻ ይፍጠሩ</translation>
</message>
<message>
<source>&amp;New</source>
@@ -15,19 +15,19 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">አሁን የተመረጠውን አድራሻ ወደ ስርዓቱ ቅንጥብ ሰሌዳ ቅዳ</translation>
+ <translation type="unfinished">አሁን የተመረጠውን አድራሻ ወደ ስርዓቱ ቅንጥብ ሰሌዳ ይቅዱ</translation>
</message>
<message>
<source>&amp;Copy</source>
- <translation type="unfinished">&amp;ቅዳ</translation>
+ <translation type="unfinished">&amp;ይቅዱ</translation>
</message>
<message>
<source>C&amp;lose</source>
- <translation type="unfinished">ዝጋ</translation>
+ <translation type="unfinished">ይዝጉ</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">አሁን የተመረጠውን አድራሻ ከዝርዝሩ ውስጥ አጥፋ</translation>
+ <translation type="unfinished">አሁን የተመረጠውን አድራሻ ከዝርዝሩ ውስጥ ያጥፉ</translation>
</message>
<message>
<source>Enter address or label to search</source>
@@ -35,15 +35,15 @@
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">በዚህ ማውጫ ውስጥ ያለውን ውሂብ ወደ አንድ ፋይል ቀይረህ አስቀምጥ</translation>
+ <translation type="unfinished">በዚህ ማውጫ ውስጥ ያለውን ውሂብ ወደ ፋይል አዛውረው ያስቀምጡ</translation>
</message>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;ላክ</translation>
+ <translation type="unfinished">&amp;ይላኩ</translation>
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">&amp;ሰርዝ</translation>
+ <translation type="unfinished">&amp;ይሰርዙ</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
@@ -58,16 +58,8 @@
<translation type="unfinished">ምረጥ</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">የመላኪያ አድራሻዎች</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">የመቀበያ አድራሻዎች</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">እነኚህ የቢትኮይን ክፍያ የመላኪያ አድራሻዎችዎ ናቸው:: ገንዘብ/ኮይኖች ከመላክዎ በፊት መጠኑን እና የመቀበያ አድራሻውን ሁልጊዜ ያረጋግጡ::</translation>
+ <translation type="unfinished">ክፍያዎችን ለመላክ እነዚህ የእርስዎ ቢትኮይን አድራሻዎች ናቸው። ሳንቲሞችን/ኮይኖች ከመላክዎ በፊት ሁል ጊዜ መጠኑን እና የተቀባዩን አድራሻ ያረጋግጡ።</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">የአድራሻ ዝርዝሩን ወደ %1 ለማስቀመጥ ሲሞከር ስህተት አጋጥሟል:: እባክዎ መልሰው ይሞክሩ::</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">አድራሻዎችን በመላክ ላይ - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">አድራሻዎችን በማቀበል ላይ - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">ወደ ውጪ መላክ አልተሳካም</translation>
</message>
@@ -480,14 +480,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ክፍያው ቅዳ</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">አዎ</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">አይ</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(መለያ ስም የለም)</translation>
</message>
@@ -764,11 +756,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;ላክ</translation>
+ <translation type="unfinished">&amp;ይላኩ</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">በአሁኑ ማውጫ ውስጥ ያለውን መረጃ ወደ አንድ ፋይል ላክ</translation>
+ <translation type="unfinished">በዚህ ማውጫ ውስጥ ያለውን ውሂብ ወደ ፋይል አዛውረው ያስቀምጡ</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_ar.ts b/src/qt/locale/bitcoin_ar.ts
index 1f6ad8bd62..e58c221a86 100644
--- a/src/qt/locale/bitcoin_ar.ts
+++ b/src/qt/locale/bitcoin_ar.ts
@@ -51,21 +51,13 @@
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">اختر العنوان الذي ترغب باستلام البتكوين فيه</translation>
+ <translation type="unfinished">اختر العنوان الذي ترغب باستلام بتكوين اليه</translation>
</message>
<message>
<source>C&amp;hoose</source>
<translation type="unfinished">ا&amp;ختر</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">‫العناوين المرسِلة‬</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">العناوين المستلمة</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">‫هذه عناوين البتكوين الخاصة بك لإرسال المدفوعات. تأكد دائما من القيم المدخلة ومن العنوان المستلم قبل الارسال.‬</translation>
</message>
@@ -224,20 +216,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">‫عبارة المرور التي تم إدخالها لفك تشفير المحفظة غير صحيحة.‬</translation>
</message>
<message>
- <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">العبارة المدخلة لفك تشفير المحفظة غير صحيحة: تحتوي على خانة فارغة. إذا تم تعيين هذه العبارة في نسخة سابقة لـ 25.0، يرجى المحاولة مجددا بإدخال جميع الخانات السابقة للخانة الفارغة والتوقف عند الخانة الفارغة دون إدخال الفراغ. إذا نجحت المحاولة، يرجى تغيير العبارة لتفادي هذه المشكلة مستقبلا.</translation>
- </message>
- <message>
<source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">لقد تم تغير عبارة مرور المحفظة بنجاح</translation>
- </message>
- <message>
- <source>Passphrase change failed</source>
- <translation type="unfinished">فشل تغيير العبارة </translation>
- </message>
- <message>
- <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">العبارة السابقة المدخلة لفك تشفير المحفظة غير صحيحة: تحتوي على خانة فارغة. إذا تم تعيين هذه العبارة في نسخة سابقة لـ 25.0، يرجى المحاولة مجددا بإدخال جميع الخانات السابقة للخانة الفارغة والتوقف عند الخانة الفارغة دون إدخال الفراغ.</translation>
+ <translation type="unfinished">‫لقد تم تغيير عبارة المرور بنجاح.‬</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
@@ -633,19 +613,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">الاتصال بالأقران ...</translation>
+ <translation type="unfinished">‫الاتصال بالأقران…‬</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">أطلب دفعات (يولد كودات الرمز المربع وبيت كوين: العناوين المعطاة)</translation>
+ <translation type="unfinished">‫أطلب مدفوعات (أنشئ رموز استجابة (QR Codes) وعناوين بتكوين)‬</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">عرض قائمة عناوين الإرسال المستخدمة والملصقات</translation>
+ <translation type="unfinished">‫عرض قائمة العناوين المرسِلة والمذكرات (المستخدمة سابقا)‬</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">عرض قائمة عناوين الإستقبال المستخدمة والملصقات</translation>
+ <translation type="unfinished">‫عرض قائمة العناوين المستلمة والمذكرات (المستخدمة سابقا)‬</translation>
</message>
<message>
<source>&amp;Command-line options</source>
@@ -668,7 +648,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">يمسك…</translation>
+ <translation type="unfinished">‫يجري التدارك…‬</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -750,23 +730,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">بين اشارة المساعدة %1 للحصول على قائمة من خيارات اوامر البت كوين المحتملة </translation>
+ <translation type="unfinished">‫اعرض %1 رسالة المساعدة للحصول على قائمة من خيارات سطر أوامر البتكوين المحتملة‬</translation>
</message>
<message>
<source>&amp;Mask values</source>
- <translation type="unfinished">&amp; إخفاء القيم</translation>
+ <translation type="unfinished">&amp;إخفاء القيم</translation>
</message>
<message>
<source>Mask the values in the Overview tab</source>
- <translation type="unfinished">إخفاء القيم في علامة التبويب نظرة عامة</translation>
+ <translation type="unfinished">‫إخفاء القيم في علامة التبويب: نظرة عامة‬</translation>
</message>
<message>
<source>default wallet</source>
- <translation type="unfinished">المحفظة الإفتراضية</translation>
+ <translation type="unfinished">‫محفظة افتراضية‬</translation>
</message>
<message>
<source>No wallets available</source>
- <translation type="unfinished">المحفظة الرقمية غير متوفرة</translation>
+ <translation type="unfinished">‫لا يوجد محفظة متاحة‬</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -790,7 +770,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Window</source>
- <translation type="unfinished">&amp;نافذة</translation>
+ <translation type="unfinished">‫&amp;نافذة‬</translation>
</message>
<message>
<source>Zoom</source>
@@ -955,10 +935,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">الرسوم:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">غبار:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">بعد الرسوم:</translation>
</message>
@@ -1047,10 +1023,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">نسخ البايتات </translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">نسخ الغبار</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">‫نسخ الفكة‬</translation>
</message>
@@ -1059,18 +1031,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 تم قفله)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">نعم</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">لا</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">‫تتحول هذه المذكرة إلى اللون الأحمر إذا تلقى مستلم كمية أقل من الحد الأعلى الحالي للغبار .‬</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">‫يمكن يزيد أو ينقص %1 ساتوشي لكل مدخل.‬</translation>
</message>
@@ -1128,7 +1088,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>default wallet</source>
- <translation type="unfinished">المحفظة الإفتراضية</translation>
+ <translation type="unfinished">‫محفظة افتراضية‬</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -1231,14 +1191,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">أنشئ محفظة فارغة</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">استخدم الواصفات لإدارة scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">المحفظة الوصفية</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">استخدم جهاز توقيع خارجي مثل محفظة الأجهزة. قم بتكوين البرنامج النصي للموقِّع الخارجي في تفضيلات المحفظة أولاً.</translation>
</message>
@@ -1251,10 +1203,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">إنشاء</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">تم تجميعه بدون دعم sqlite (مطلوب لمحافظ الواصف)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">مجمعة بدون دعم توقيع خارجي (مطلوب للتوقيع الخارجي)</translation>
@@ -1757,7 +1705,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Window</source>
- <translation type="unfinished">&amp;نافذة</translation>
+ <translation type="unfinished">‫&amp;نافذة‬</translation>
</message>
<message>
<source>Show the icon in the system tray.</source>
@@ -1820,18 +1768,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">استخدم بروكسي SOCKS5 منفصل للوصول إلى الأقران عبر خدمات Tor onion:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">الخط أحادي المسافة في علامة التبويب "نظرة عامة":</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">‫مضمنة "%1"‬</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">‫أقرب تطابق "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;تم</translation>
</message>
@@ -2069,8 +2005,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">‫تم حفظ المعاملة الموقعة جزئيا على وحدة التخزين.‬</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* يرسل %1 إلى %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">عنوانه</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2502,7 +2438,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">‫وقت اخر طابق‬</translation>
+ <translation type="unfinished">اخر وقت الكتلة</translation>
</message>
<message>
<source>&amp;Open</source>
@@ -2763,7 +2699,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Could not unlock wallet.</source>
- <translation type="unfinished">‫تعذر فتح المحفظة.‬</translation>
+ <translation type="unfinished"> يمكن فتح المحفظة.</translation>
</message>
<message>
<source>Could not generate new %1 address</source>
@@ -2951,10 +2887,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">المدخلات...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">غبار:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">اختيار...</translation>
</message>
@@ -3031,10 +2963,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">نسخ البايتات </translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">نسخ الغبار</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">‫نسخ الفكة‬</translation>
</message>
@@ -3061,10 +2989,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">‫إن&amp;شاء من غير توقيع‬</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">من المحفظة '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 الى "%2"</translation>
</message>
@@ -3567,10 +3491,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">مؤشر المخرجات</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(لم يتم التحقق من الشهادة)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">تاجر</translation>
</message>
@@ -3665,10 +3585,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">أرسل إلى</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">دفع لنفسك</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">‫معدّن‬</translation>
</message>
@@ -3744,10 +3660,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">أرسل إلى</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">إليك</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">‫معدّن‬</translation>
</message>
@@ -3970,7 +3882,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>default wallet</source>
- <translation type="unfinished">المحفظة الإفتراضية</translation>
+ <translation type="unfinished">‫محفظة افتراضية‬</translation>
</message>
</context>
<context>
@@ -4024,6 +3936,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">‫‫%s مشكل. حاول استخدام أداة محفظة البتكوين للاصلاح أو استعادة نسخة احتياطية.‬</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%sفشل في التحقق من صحة حالة اللقطة -assumeutxo. يشير هذا إلى وجود مشكلة في الأجهزة، أو خطأ في البرنامج، أو تعديل سيء في البرنامج يسمح بتحميل لقطة غير صالحة. ونتيجة لذلك، سيتم إيقاف تشغيل العقدة والتوقف عن استخدام أي حالة تم إنشاؤها في اللقطة، مما يؤدي إلى إعادة ضبط ارتفاع السلسلة من%dإلى %d. في عملية إعادة التشغيل التالية، ستستأنف العقدة المزامنة من %dدون استخدام أي بيانات لقطة. الرجاء الإبلاغ عن هذه الحادثة إلى %s، بما في ذلك كيفية حصولك على اللقطة. سيتم ترك حالة سلسلة اللقطة غير الصالحة على القرص في حال كان ذلك مفيدًا في تشخيص المشكلة التي تسببت في هذا الخطأ.</translation>
+ </message>
+ <message>
<source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
<translation type="unfinished">‫لا يمكن استرجاع إصدار المحفظة من %i الى %i. لم يتغير إصدار المحفظة.‬</translation>
</message>
@@ -4036,10 +3952,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">موزع بموجب ترخيص برامج MIT ، راجع الملف المصاحب %s أو %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">خطأ في قراءة %s! جميع المفاتيح قرأت بشكل صحيح، لكن بيانات المعاملة أو إدخالات سجل العناوين قد تكون مفقودة أو غير صحيحة.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">‫خطأ في قراءة %s بيانات العملية قد تكون مفقودة أو غير صحيحة. اعادة فحص المحفظة.‬</translation>
</message>
@@ -4208,14 +4120,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">خطأ قراءة السجل التالي من قاعدة بيانات المحفظة</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">‫خطأ: لا يمكن اضافة عملية المراقبة فقط لمحفظة المراقبة‬</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">‫خطأ: لا يمكن حذف عمليات المراقبة فقط‬</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">‫خطأ : لم نتمكن من انشاء علامة فارقة (cursor) في قاعدة البيانات‬</translation>
</message>
@@ -4465,7 +4369,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Wallet needed to be rewritten: restart %s to complete</source>
- <translation type="unfinished">يجب إعادة كتابة المحفظة: يلزم إعادة تشغيل %s لإكمال العملية</translation>
+ <translation type="unfinished">يجب إعادة كتابة المحفظة: يلزم إعادة التشغيل %s لإكمال العملية</translation>
</message>
<message>
<source>Settings file could not be read</source>
diff --git a/src/qt/locale/bitcoin_az.ts b/src/qt/locale/bitcoin_az.ts
index a2aca2d413..3bba7a2b40 100644
--- a/src/qt/locale/bitcoin_az.ts
+++ b/src/qt/locale/bitcoin_az.ts
@@ -2,12 +2,8 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">Ünvana və ya etiketə düzəliş etmək üçün sağ klikləyin</translation>
- </message>
- <message>
<source>Create a new address</source>
- <translation type="unfinished">Yeni bir ünvan yaradın</translation>
+ <translation type="unfinished">Yeni ünvan yaradın</translation>
</message>
<message>
<source>&amp;New</source>
@@ -58,14 +54,6 @@
<translation type="unfinished">Seç</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Göndərilən ünvanlar</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Alınan ünvanlar</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Bunlar ödənişləri göndərmək üçün Bitcoin ünvanlarınızdır. pul göndərməzdən əvvəl həmişə miqdarı və göndəriləcək ünvanı yoxlayın.</translation>
</message>
@@ -283,6 +271,10 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">%1 hələ də təhlükəsiz bağlanmayıb...</translation>
</message>
<message>
+ <source>unknown</source>
+ <translation type="unfinished">naməlum</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Məbləğ</translation>
</message>
@@ -820,10 +812,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Komissiya:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Toz:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Komissiydan sonra:</translation>
</message>
@@ -912,10 +900,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Baytları koyalayın</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Tozu kopyalayın</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Dəyişikliyi kopyalayın</translation>
</message>
@@ -924,18 +908,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">(%1 kilidləndi)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">bəli</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">xeyr</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Əgər alıcı məbləği cari toz həddindən az alarsa bu etiket qırmızı olur.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Hər daxilolmada +/- %1 satoşi dəyişə bilər.</translation>
</message>
@@ -1109,14 +1081,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Boş pulqabı yaradın</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Publik açar skripti (scriptPubKey) idarəetməsi üçün deskreptorlardan itifadə edin</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Deskriptor pulqabı</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Aparat cüzdanı kimi xarici imzalama cihazından istifadə edin. Əvvəlcə cüzdan seçimlərində xarici imzalayan skriptini konfiqurasiya edin.</translation>
</message>
@@ -1459,10 +1423,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Gizlə</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Toz:</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">Miqdarı kopyalayın</translation>
</message>
@@ -1483,10 +1443,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Baytları koyalayın</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Tozu kopyalayın</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Dəyişikliyi kopyalayın</translation>
</message>
@@ -1516,6 +1472,10 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<source>Date</source>
<translation type="unfinished">Tarix</translation>
</message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">naməlum</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
diff --git a/src/qt/locale/bitcoin_az@latin.ts b/src/qt/locale/bitcoin_az@latin.ts
index 269acea5a5..bb808eaddb 100644
--- a/src/qt/locale/bitcoin_az@latin.ts
+++ b/src/qt/locale/bitcoin_az@latin.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">Seç</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Göndərilən ünvanlar</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Alınan ünvanlar</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Bunlar ödənişləri göndərmək üçün Bitcoin ünvanlarınızdır. pul göndərməzdən əvvəl həmişə miqdarı və göndəriləcək ünvanı yoxlayın.</translation>
</message>
@@ -283,6 +275,10 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">%1 hələ də təhlükəsiz bağlanmayıb...</translation>
</message>
<message>
+ <source>unknown</source>
+ <translation type="unfinished">naməlum</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Məbləğ</translation>
</message>
@@ -820,10 +816,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Komissiya:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Toz:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Komissiydan sonra:</translation>
</message>
@@ -912,10 +904,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Baytları koyalayın</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Tozu kopyalayın</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Dəyişikliyi kopyalayın</translation>
</message>
@@ -924,18 +912,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">(%1 kilidləndi)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">bəli</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">xeyr</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Əgər alıcı məbləği cari toz həddindən az alarsa bu etiket qırmızı olur.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Hər daxilolmada +/- %1 satoşi dəyişə bilər.</translation>
</message>
@@ -1109,14 +1085,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Boş pulqabı yaradın</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Publik açar skripti (scriptPubKey) idarəetməsi üçün deskreptorlardan itifadə edin</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Deskriptor pulqabı</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Aparat cüzdanı kimi xarici imzalama cihazından istifadə edin. Əvvəlcə cüzdan seçimlərində xarici imzalayan skriptini konfiqurasiya edin.</translation>
</message>
@@ -1459,10 +1427,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Gizlə</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Toz:</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">Miqdarı kopyalayın</translation>
</message>
@@ -1483,10 +1447,6 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<translation type="unfinished">Baytları koyalayın</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Tozu kopyalayın</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Dəyişikliyi kopyalayın</translation>
</message>
@@ -1516,6 +1476,10 @@ Daxil olma, yalnız 'qanuni' tipli ünvanlar ilə mümkündür.</translation>
<source>Date</source>
<translation type="unfinished">Tarix</translation>
</message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">naməlum</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
diff --git a/src/qt/locale/bitcoin_be.ts b/src/qt/locale/bitcoin_be.ts
index 4e944ac0e3..f53ba3f5b2 100644
--- a/src/qt/locale/bitcoin_be.ts
+++ b/src/qt/locale/bitcoin_be.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">Выбраць</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">адрасы Адпраўкі</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">адрасы Прымання</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Тут знаходзяцца Біткойн-адрасы для высылання плацяжоў. Заўсёды спраўджвайце колькасць і адрас прызначэння перад здзяйсненнем транзакцыі.</translation>
</message>
@@ -465,10 +457,6 @@
<translation type="unfinished">Камісія:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Пыл:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Пасля камісіі:</translation>
</message>
@@ -529,18 +517,6 @@
<translation type="unfinished">Капіяваць байты</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Капіяваць пыл</translation>
- </message>
- <message>
- <source>yes</source>
- <translation type="unfinished">так</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">не</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">непазначаны</translation>
</message>
@@ -798,10 +774,6 @@
<translation type="unfinished">Даслаць адразу некалькім атрымальнікам</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Пыл:</translation>
- </message>
- <message>
<source>Balance:</source>
<translation type="unfinished">Баланс:</translation>
</message>
@@ -830,10 +802,6 @@
<translation type="unfinished">Капіяваць байты</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Капіяваць пыл</translation>
- </message>
- <message>
<source>Confirm send coins</source>
<translation type="unfinished">Пацвердзіць дасыланне манет</translation>
</message>
@@ -975,10 +943,6 @@
<translation type="unfinished">Даслана да</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Плацёж самому сабе</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Здабыта</translation>
</message>
@@ -1038,10 +1002,6 @@
<translation type="unfinished">Даслана да</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Да сябе</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Здабыта</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bg.ts b/src/qt/locale/bitcoin_bg.ts
index f9429daa6f..7eefe113ce 100644
--- a/src/qt/locale/bitcoin_bg.ts
+++ b/src/qt/locale/bitcoin_bg.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">Избери</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Адреси за изпращане</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Адреси за получаване</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Тези са вашите Биткойн адреси за изпращане на плащания. Винаги проверявайте количеството и получаващите адреси преди изпращане на монети. </translation>
</message>
@@ -101,6 +93,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Получи се грешка при запазването на листа с адреси към %1. Моля опитайте пак.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Изпращащ адрес - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Получаващ адрес - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Изнасянето се провали</translation>
</message>
@@ -695,6 +695,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Затвори всички портфейли</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Мигрирайте портфейла</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Мигрирайте портфейл</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Покажи %1 помощно съобщение за да получиш лист с възможни Биткойн команди</translation>
</message>
@@ -791,6 +799,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Разреши мрежова активност</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Предварителна синхронизация на Headers (%1%)…</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Грешка при създаването на портфейл</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Грешка: %1</translation>
</message>
@@ -897,10 +913,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Такса:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">прах:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">След такса:</translation>
</message>
@@ -989,10 +1001,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Копиране на байтовете</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копирай прахта:</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Промяна на копирането</translation>
</message>
@@ -1001,18 +1009,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 заключен)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">да</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">не</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Този етикет става червен ако някой получател получи количество, по-малко от текущия праг на прах</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Може да варира с +/- %1 байт(а).</translation>
</message>
@@ -1072,6 +1068,37 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Мигрирайте портфейла</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Сигурни ли сте, че желаете да мигрирате портфейла &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Мигрирайте портфейла</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Миграция на портфейла &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Портфейлът "%1" беше мигриран успешно.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Грешка при миграцията</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Миграцията е успешна</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1154,6 +1181,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Създайте портфейл</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Вие сте само на крачка от създаването на вашия нов портфейл!</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Име на портфейл</translation>
</message>
@@ -1190,14 +1221,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Създайте празен портфейл</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Използвайте декодери за управление на scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Декодер за портфейл</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Използвайте външно устройство за подписване, като хардуерен портфейл. Конфигурирайте първо външния скрипт на подписа в предпочитания портфейл.</translation>
</message>
@@ -1210,10 +1233,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Създай</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Компилиран без поддръжка на sqlite (изисква се за декодер на портфейли)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Компилиран без поддръжка на външни подписи (изисква се за външно подписване)</translation>
@@ -1717,10 +1736,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Дали да покаже възможностите за контрол на монетите или не.</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Моноширинен шрифт в раздела Общ преглед:</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">ОК</translation>
</message>
@@ -1852,6 +1867,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Затвори</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">собствен адрес</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">Тотално количество</translation>
</message>
@@ -2342,10 +2361,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Изчисти всички полета от формуляра.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">прах:</translation>
- </message>
- <message>
<source>Clear &amp;All</source>
<translation type="unfinished">&amp;Изчисти</translation>
</message>
@@ -2382,10 +2397,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Копиране на байтовете</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копирай прахта:</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Промяна на копирането</translation>
</message>
@@ -2761,10 +2772,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Изпратени на</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Плащане към себе си</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Емитирани</translation>
</message>
@@ -2828,10 +2835,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Изпратени на</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Собствени</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Емитирани</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bn.ts b/src/qt/locale/bitcoin_bn.ts
index 8255fb1eb4..f4cdcd1a4b 100644
--- a/src/qt/locale/bitcoin_bn.ts
+++ b/src/qt/locale/bitcoin_bn.ts
@@ -50,14 +50,6 @@
<translation type="unfinished">কয়েন গ্রহণ করার ঠিকানা বাছাই করুন।</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">ঠিকানাগুলো পাঠানো হচ্ছে।</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">ঠিকানাগুলো গ্রহণ করা হচ্ছে।</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">পেমেন্ট পাওয়ার জন্য এটি আপনার বিটকয়েন ঠিকানা। নতুন ঠিকানা তৈরী করতে "নতুন গ্রহণের ঠিকানা তৈরী করুন" বোতাম ব্যবহার করুন। সাইন ইন করা শুধুমাত্র "উত্তরাধিকার" ঠিকানার মাধ্যমেই সম্ভব।</translation>
@@ -67,7 +59,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">কমা দিয়ে আলাদা করা ফাইল</translation>
</message>
- </context>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">রপ্তানি ব্যর্থ হয়েছে৷</translation>
+ </message>
+</context>
<context>
<name>AddressTableModel</name>
<message>
@@ -78,6 +74,25 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Address</source>
<translation type="unfinished">ঠিকানা</translation>
</message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(কোন লেবেল নেই)</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">ওয়ালেট ডিক্রিপশনের জন্য প্রবেশ করা পাসফ্রেজটি ভুল। এটিতে একটি শূন্য অক্ষর রয়েছে (যেমন - একটি শূন্য বাইট)। যদি পাসফ্রেজটি 25.0 এর আগে এই সফ্টওয়্যারটির একটি সংস্করণের সাথে সেট করা থাকে, অনুগ্রহ করে শুধুমাত্র প্রথম শূন্য অক্ষর পর্যন্ত — কিন্তু অন্তর্ভুক্ত নয় — পর্যন্ত অক্ষর দিয়ে আবার চেষ্টা করুন। এটি সফল হলে, ভবিষ্যতে এই সমস্যাটি এড়াতে অনুগ্রহ করে একটি নতুন পাসফ্রেজ সেট করুন৷</translation>
+ </message>
+ <message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">পাসফ্রেজ পরিবর্তন ব্যর্থ হয়েছে৷</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">ওয়ালেট ডিক্রিপশনের জন্য পুরানো পাসফ্রেজটি ভুল। এটিতে একটি শূন্য অক্ষর রয়েছে (যেমন - একটি শূন্য বাইট)। যদি পাসফ্রেজটি 25.0 এর আগে এই সফ্টওয়্যারটির একটি সংস্করণের সাথে সেট করা থাকে, অনুগ্রহ করে শুধুমাত্র প্রথম শূন্য অক্ষর পর্যন্ত — কিন্তু অন্তর্ভুক্ত নয় — পর্যন্ত অক্ষর দিয়ে আবার চেষ্টা করুন।</translation>
+ </message>
</context>
<context>
<name>BitcoinApplication</name>
@@ -190,6 +205,30 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;ওয়ালেট এনক্রিপ্ট করুন...</translation>
</message>
<message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">ব্যাকআপ ওয়ালেট…</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;পাসফ্রেজ পরিবর্তন করুন...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">সাইন এবং বার্তা...</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">বার্তা যাচাই করুন...</translation>
+ </message>
+ <message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">ফাইল থেকে PSBT লোড করুন...</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">URI খুলুন...</translation>
+ </message>
+ <message>
<source>Close Wallet…</source>
<translation type="unfinished">ওয়ালেট বন্ধ করুন...</translation>
</message>
@@ -229,6 +268,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Catching up…</source>
+ <translation type="unfinished">ধরা…</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction</source>
<translation type="unfinished">আংশিক স্বাক্ষরিত বিটকয়েন লেনদেন লোড করুন</translation>
</message>
@@ -359,19 +402,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Advanced Options</source>
<translation type="unfinished">উন্নত বিকল্প </translation>
</message>
- <message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">ScriptPub-এর জন্য বর্ণনাকারীর ব্যবস্থা করুন
- </translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">বর্ণনাকারী ওয়ালেট </translation>
- </message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">sqlite সমর্থন ছাড়াই সংকলিত (বরণাকারী ওয়ালেটের জন্য প্রয়োজনীয়)</translation>
- </message>
</context>
<context>
<name>Intro</name>
@@ -584,6 +614,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">আইডি</translation>
</message>
<message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">রপ্তানি ব্যর্থ হয়েছে৷</translation>
+ </message>
+ <message>
<source>Exporting Successful</source>
<translation type="unfinished">রপ্তানি সফল হয়েছে</translation>
</message>
diff --git a/src/qt/locale/bitcoin_bs.ts b/src/qt/locale/bitcoin_bs.ts
index 537a88eb86..2667d04cb7 100644
--- a/src/qt/locale/bitcoin_bs.ts
+++ b/src/qt/locale/bitcoin_bs.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Izaberite</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Adrese pošiljalaca</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adrese primalaca</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ovo su vaše Bitcoin adrese za slanje novca. Uvijek provjerite iznos i adresu primaoca prije slanja novca.</translation>
</message>
@@ -752,10 +744,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Naknada:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Prašina:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Poslije Naknade:</translation>
</message>
@@ -820,10 +808,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopiraj bajte</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiraj prašinu</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiraj promjenu</translation>
</message>
@@ -832,18 +816,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 zaključano)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">da</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ne</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ova naljepnica postaje crvena ako bilo koji primatelj primi količinu manju od trenutnog praga prašine.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Može varirati +/- %1 satoshi (a) po upisu vrijednosti.</translation>
</message>
@@ -942,21 +914,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Napravi Prazan Novčanik</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Koristite deskriptore za upravljanje scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Deskriptor Novčanik</translation>
- </message>
- <message>
<source>Create</source>
<translation type="unfinished">Napravi</translation>
</message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Sastavljeno bez podrške za sqlite (potrebno za deskriptorske novčanike)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1421,10 +1381,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Sakrij</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Prašina:</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">Kopiraj količinu</translation>
</message>
@@ -1445,10 +1401,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopiraj bajte</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiraj prašinu</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiraj promjenu</translation>
</message>
@@ -1671,10 +1623,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Iznosi transakcija ne smiju biti negativni</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakcija ima predugačak mempool lanac </translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcija mora imati najmanje jednog primaoca</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ca.ts b/src/qt/locale/bitcoin_ca.ts
index 1a03c7c2c6..2ea1e0a2a2 100644
--- a/src/qt/locale/bitcoin_ca.ts
+++ b/src/qt/locale/bitcoin_ca.ts
@@ -51,21 +51,13 @@
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Trieu l'adreça on rebre les monedes</translation>
+ <translation type="unfinished">Trieu l'adreça on rebre les monedes amb</translation>
</message>
<message>
<source>C&amp;hoose</source>
<translation type="unfinished">&amp;Tria</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Adreces d'enviament</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adreces de recepció</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Aquestes són les vostres adreces de Bitcoin per a enviar els pagaments. Sempre reviseu l'import i l'adreça del destinatari abans de transferir monedes.</translation>
</message>
@@ -102,6 +94,14 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">S'ha produït un error en desar la llista d'adreces a %1. Torneu-ho a provar.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Adreces d'enviament - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Adreces de recepció - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">L'exportació ha fallat</translation>
</message>
@@ -224,10 +224,22 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">La contrasenya introduïda per a desxifrar el moneder és incorrecta.</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">La contrasenya introduïda per a desxifrar la cartera és incorrecta. Conté un caràcter nul (és a dir, un byte zero). Si la contrasenya es va establir amb una versió d'aquest programari anterior a la 25.0, si us plau, torneu-ho a provar només amb els caràcters fins a — però sense incloure — el primer caràcter nul. En cas d'èxit, si us plau, establiu una nova contrasenya per evitar aquest problema en el futur.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">La contrasenya del moneder ha estat canviada correctament.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Ha fallat el canvi de frase de pas</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">La contrasenya antiga introduïda per a desxifrar la cartera és incorrecta. Conté un caràcter nul (és a dir, un byte zero). Si la contrasenya es va establir amb una versió d'aquest programari anterior a la 25.0, si us plau, intenta-ho de nou només amb els caràcters fins a — però sense incloure — el primer caràcter nul.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Avís: Les lletres majúscules estan activades!</translation>
</message>
@@ -246,6 +258,10 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">El fitxer de configuració %1 pot estar corrupte o invàlid.</translation>
+ </message>
+ <message>
<source>Runaway exception</source>
<translation type="unfinished">Excepció fugitiva</translation>
</message>
@@ -650,10 +666,28 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Tanca la cartera</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Reestablir cartera...</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Reestablir una cartera des d'un fitxer de còpia de seguretat</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Tanqueu totes les carteres</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar cartera</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrar una cartera</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Mostra el missatge d'ajuda del %1 per obtenir una llista amb les possibles opcions de línia d'ordres de Bitcoin</translation>
</message>
@@ -679,6 +713,16 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Dades de la cartera</translation>
</message>
<message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Carregar còpia de seguretat d'una cartera</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Restaurar cartera</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Nom de la cartera</translation>
@@ -703,6 +747,10 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<source>&amp;Hide</source>
<translation type="unfinished">&amp;Amaga</translation>
</message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">&amp;Mostra</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -732,6 +780,18 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Habilita l'activitat de la xarxa</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Pre-sincronitzant capçaleres (%1%)...</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Error al crear la cartera</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">No s'ha pogut crear una nova cartera, el programari s'ha compilat sense suport per a SQLite (necessari per a les carteres de descriptors)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Avís: %1</translation>
</message>
@@ -834,10 +894,6 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Tarifa:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polsim:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Tarifa posterior:</translation>
</message>
@@ -898,6 +954,10 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Copia la &amp;quantitat</translation>
</message>
<message>
+ <source>Copy transaction &amp;ID and output index</source>
+ <translation type="unfinished">Copiar &amp;ID de transacció i índex de sortida</translation>
+ </message>
+ <message>
<source>L&amp;ock unspent</source>
<translation type="unfinished">Bl&amp;oqueja sense gastar</translation>
</message>
@@ -922,10 +982,6 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">Copia els bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copia el polsim</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copia el canvi</translation>
</message>
@@ -934,14 +990,6 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<translation type="unfinished">(%1 bloquejada)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">sí</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Aquesta etiqueta es torna vermella si cap recipient rep un import inferior al llindar de polsim actual.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Pot variar en +/- %1 satoshi(s) per entrada.</translation>
</message>
@@ -982,7 +1030,75 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
<source>Can't list signers</source>
<translation type="unfinished">No es poden enumerar signants</translation>
</message>
- </context>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">Massa signants externs trobats</translation>
+ </message>
+</context>
+<context>
+ <name>LoadWalletsActivity</name>
+ <message>
+ <source>Load Wallets</source>
+ <extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
+ <translation type="unfinished">Carregar carteres</translation>
+ </message>
+ <message>
+ <source>Loading wallets…</source>
+ <extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
+ <translation type="unfinished">Carregant carteres...</translation>
+ </message>
+</context>
+<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrar cartera</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Esteu segurs que voleu migrar la cartera &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Migrar la cartera convertirà aquesta cartera en una o més carteres de descriptors. Caldrà fer una nova còpia de seguretat de la cartera.
+Si aquesta cartera conté algun script només per a visualització, es crearà una nova cartera que contingui aquests scripts només per a visualització.
+Si aquesta cartera conté algun script resoluble però no visualitzat, es crearà una cartera diferent i nova que contingui aquests scripts.
+
+El procés de migració crearà una còpia de seguretat de la cartera abans de migrar-la. Aquest fitxer de còpia de seguretat tindrà el nom &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak i es podrà trobar al directori d'aquesta cartera. En cas d'una migració incorrecta, es podrà restaurar la còpia de seguretat mitjançant la funcionalitat "Restaurar cartera".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar cartera</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrant cartera &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">La cartera '%1' s'ha migrat amb èxit.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Els scripts de només visualització s'han migrat a una nova cartera anomenada '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Els scripts resolubles però no vigilats s'han migrat a una nova cartera anomenada '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migració fallida</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migració exitosa</translation>
+ </message>
+</context>
<context>
<name>OpenWalletActivity</name>
<message>
@@ -1009,6 +1125,19 @@ Només és possible firmar amb adreces del tipus "legacy".</translation>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Restaurar cartera</translation>
+ </message>
+ <message>
+ <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
+ <translation type="unfinished">Restaurant cartera &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1075,14 +1204,6 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">Fes cartera en blanc</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Utilitzeu descriptors per a la gestió de scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Cartera del descriptor</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Utilitzeu un dispositiu de signatura extern, com ara una cartera de maquinari. Configureu primer l’escriptura de signatura externa a les preferències de cartera.</translation>
</message>
@@ -1095,10 +1216,6 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">Crear</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilat sense el suport sqlite (requerit per a carteres descriptor)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Compilat sense suport de signatura externa (necessari per a la signatura externa)</translation>
@@ -1206,6 +1323,10 @@ Això és ideal per a carteres de mode només lectura.</translation>
</translation>
</message>
<message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">Trieu un directori de dades</translation>
+ </message>
+ <message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">Almenys %1 GB de dades s'emmagatzemaran en aquest directori, i creixerà amb el temps.</translation>
</message>
@@ -1562,18 +1683,6 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">Utilitzeu el servidor intermediari SOCKS&amp;5 per a arribar als iguals mitjançant els serveis d'onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Tipus de lletra monoespai a la pestanya Visió general:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">incrustat "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">coincidència més propera "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;D'acord</translation>
</message>
@@ -1775,8 +1884,8 @@ Això és ideal per a carteres de mode només lectura.</translation>
<translation type="unfinished">PSBT guardada al disc.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">*Envia %1 a %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">adreça pròpia</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2046,6 +2155,10 @@ Si rebeu aquest error, haureu de sol·licitar al comerciant que proporcioni un U
<translation type="unfinished">Blocs sincronitzats</translation>
</message>
<message>
+ <source>Last Transaction</source>
+ <translation type="unfinished">Darrera transacció</translation>
+ </message>
+ <message>
<source>The mapped Autonomous System used for diversifying peer selection.</source>
<translation type="unfinished">El sistema autònom de mapat utilitzat per a diversificar la selecció entre iguals.</translation>
</message>
@@ -2589,10 +2702,6 @@ No utilitzeu aquesta consola sense entendre completament les ramificacions d'una
<translation type="unfinished">Entrades...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polsim:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Tria...</translation>
</message>
@@ -2668,10 +2777,6 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">Copia els bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copia el polsim</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copia el canvi</translation>
</message>
@@ -2702,10 +2807,6 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">Crea una transacció bitcoin parcialment signada (PSBT) per a utilitzar, per exemple, amb una cartera %1 fora de línia o amb una cartera compatible amb PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">de la cartera "%1"</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 a '%2'</translation>
</message>
@@ -2780,6 +2881,12 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">Import total</translation>
</message>
<message>
+ <source>Unsigned Transaction</source>
+ <comment>PSBT copied</comment>
+ <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
+ <translation type="unfinished">Transacció no signada</translation>
+ </message>
+ <message>
<source>Confirm send coins</source>
<translation type="unfinished">Confirma l'enviament de monedes</translation>
</message>
@@ -3193,10 +3300,6 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">Índex de resultats</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(El certificat no s'ha verificat)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Mercader</translation>
</message>
@@ -3295,10 +3398,6 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">Enviada a</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pagament a un mateix</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minada</translation>
</message>
@@ -3370,10 +3469,6 @@ Nota: atès que la tarifa es calcula per byte, una tarifa de "100 satoshis per k
<translation type="unfinished">Enviada a</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">A un mateix</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minada</translation>
</message>
@@ -3574,6 +3669,11 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">PSBT copiada</translation>
</message>
<message>
+ <source>Copied to clipboard</source>
+ <comment>Fee-bump PSBT saved</comment>
+ <translation type="unfinished">Copiat al portaretalls</translation>
+ </message>
+ <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">No es pot signar la transacció.</translation>
</message>
@@ -3657,10 +3757,6 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">Distribuït sota la llicència del programari MIT, consulteu el fitxer d'acompanyament %s o %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">S'ha produït un error en llegir %s. Totes les claus es llegeixen correctament, però les dades de la transacció o les entrades de la llibreta d'adreces podrien faltar o ser incorrectes.</translation>
- </message>
- <message>
<source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
<translation type="unfinished">Error: el registre del format del fitxer de bolcat és incorrecte. S'ha obtingut «%s», s'esperava «format».</translation>
</message>
@@ -3869,6 +3965,10 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">Error en obrir la base de dades de blocs</translation>
</message>
<message>
+ <source>Error reading configuration file: %s</source>
+ <translation type="unfinished">S'ha produït un error en llegir el fitxer de configuració: %s</translation>
+ </message>
+ <message>
<source>Error reading from database, shutting down.</source>
<translation type="unfinished">Error en llegir la base de dades, tancant.</translation>
</message>
@@ -4106,10 +4206,6 @@ Ves a Arxiu &gt; Obrir Cartera per a carregar cartera.
<translation type="unfinished">Els imports de la transacció no han de ser negatius</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacció té massa temps d'una cadena de mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacció ha de tenir com a mínim un destinatari</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cmn.ts b/src/qt/locale/bitcoin_cmn.ts
index 9ee3a7d418..d65385fd59 100644
--- a/src/qt/locale/bitcoin_cmn.ts
+++ b/src/qt/locale/bitcoin_cmn.ts
@@ -54,14 +54,6 @@
<translation type="unfinished">选择(&amp;H)</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">发送地址</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">收款地址</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">这些是你的比特币支付地址。在发送之前,一定要核对金额和接收地址。</translation>
</message>
@@ -97,6 +89,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">儲存地址列表到 %1 時發生錯誤。請再試一次。</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">付款地址 - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">收款地址 - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">导出失败</translation>
</message>
@@ -290,15 +290,45 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">请输入一个比特币地址 (例如 %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
<message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
<translation type="unfinished">区块转发</translation>
@@ -309,6 +339,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手册</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 天</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation type="unfinished">%1 小时</translation>
</message>
@@ -317,6 +361,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 分</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation type="unfinished">未知</translation>
</message>
@@ -665,8 +717,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">关闭所有钱包</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">迁移一个钱包</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示%1帮助消息以获得可能包含Bitcoin命令行选项的列表</translation>
+ <translation type="unfinished">显示 %1 帮助信息,获取可用命令行选项列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -760,6 +820,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">預先同步標頭(%1%)</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">创建钱包时出错</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">无法创建新钱包,软件编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">錯誤: %1</translation>
</message>
@@ -768,12 +836,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">警告: %1</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">日期: %1
+</translation>
+ </message>
+ <message>
<source>Amount: %1
</source>
<translation type="unfinished">金額: %1
</translation>
</message>
<message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">錢包: %1
+</translation>
+ </message>
+ <message>
<source>Type: %1
</source>
<translation type="unfinished">種類: %1
@@ -792,6 +872,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
<source>Incoming transaction</source>
<translation type="unfinished">收款交易</translation>
</message>
@@ -812,6 +896,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
<message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Original message:</source>
<translation type="unfinished">原消息:</translation>
</message>
@@ -830,14 +918,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手动选币</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
</message>
<message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
<source>Tree mode</source>
<translation type="unfinished">树状模式</translation>
</message>
@@ -850,10 +958,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
<source>Received with address</source>
<translation type="unfinished">收款地址</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
@@ -878,6 +998,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">锁定未花费(&amp;O)</translation>
</message>
<message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -894,10 +1018,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -906,14 +1026,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1已锁定)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">是</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">當任何一個收款金額小於目前的灰塵金額上限時,文字會變紅色。</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">每个输入可能有 +/- %1 聪 (satoshi) 的误差。</translation>
</message>
@@ -925,7 +1037,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- </context>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -956,6 +1072,57 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您确定想要迁移钱包&lt;i&gt;%1&lt;/i&gt;吗?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">迁移钱包将会把这个钱包转换成一个或多个输出描述符钱包。将会需要创建一个新的钱包备份。
+如果这个钱包包含仅观察脚本,将会创建包含那些仅观察脚本的新钱包。
+如果这个钱包包含可解但又未被监视的脚本,将会创建一个不同的钱包以包含那些脚本。
+
+迁移过程开始前将会创建一个钱包备份。备份文件将会被命名为 &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak 然后被保存在该钱包所在目录下。如果迁移过程出错,可以使用“恢复钱包”功能恢复备份。</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">迁移钱包 &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">迁移失败</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">迁移成功</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -966,9 +1133,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">打開錢包警告</translation>
</message>
<message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+ <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">開啟錢包</translation>
+ <translation type="unfinished">打开钱包</translation>
</message>
</context>
<context>
@@ -1009,7 +1180,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
<translation type="unfinished">启用修剪时,如果一个钱包被卸载太久,就必须重新同步整条区块链才能再次加载它。</translation>
</message>
- </context>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">关闭所有钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">您确定想要关闭所有钱包吗?</translation>
+ </message>
+</context>
<context>
<name>CreateWalletDialog</name>
<message>
@@ -1017,8 +1196,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">新增錢包</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">距离创建您的新钱包只有一步之遥了!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">请指定一个名字,如果需要的话还可以启用高级选项</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
- <translation type="unfinished">錢包名稱</translation>
+ <translation type="unfinished">钱包名称</translation>
</message>
<message>
<source>Wallet</source>
@@ -1049,12 +1236,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">製作空白錢包</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">使用输出描述符进行scriptPubKey管理</translation>
- </message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ <source>Create</source>
+ <translation type="unfinished">创建</translation>
</message>
</context>
<context>
@@ -1076,6 +1259,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
</message>
<message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">地址(&amp;A)</translation>
+ </message>
+ <message>
<source>New sending address</source>
<translation type="unfinished">新建付款地址</translation>
</message>
@@ -1088,6 +1275,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">地址“%1”已经存在,它是一个收款地址,标签为“%2”,所以它不能作为一个付款地址被添加进来。</translation>
+ </message>
+ <message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">输入的地址“%1”已经存在于地址簿中,标签为“%2”。</translation>
</message>
@@ -1107,10 +1298,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">就要產生新的資料目錄。</translation>
</message>
<message>
+ <source>name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished">已經有這個目錄了。如果你要在裡面造出新的目錄的話,請加上 %1.</translation>
</message>
<message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">路径已存在,并且不是一个目录。</translation>
+ </message>
+ <message>
<source>Cannot create data directory here.</source>
<translation type="unfinished">无法在此创建数据目录。</translation>
</message>
@@ -1183,6 +1382,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
</message>
<message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">取消此设置需要重新下载整个区块链。先完整下载整条链再进行修剪会更快。这会禁用一些高级功能。</translation>
+ </message>
+ <message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
<translation type="unfinished">當你點擊「確認」,%1會開始下載,並從%3年最早的交易,處裡整個%4區塊鏈(大小:%2GB)</translation>
</message>
@@ -1290,7 +1493,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Open bitcoin URI</source>
<translation type="unfinished">打开比特币URI</translation>
</message>
- </context>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -1298,6 +1506,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">選項</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
<translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
</message>
@@ -1306,6 +1522,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
</message>
<message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -1322,6 +1546,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1346,6 +1574,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -1374,6 +1606,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -1384,10 +1620,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -1398,10 +1646,26 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
<translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1418,6 +1682,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
</message>
<message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
<source>Port of the proxy (e.g. 9050)</source>
<translation type="unfinished">代理伺服器的通訊埠(像是 9050)</translation>
</message>
@@ -1430,6 +1702,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口(&amp;W)</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1442,6 +1722,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
</message>
<message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
<source>User Interface &amp;language:</source>
<translation type="unfinished">使用界面語言(&amp;L):</translation>
</message>
@@ -1466,22 +1750,39 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
</message>
<message>
<source>default</source>
<translation type="unfinished">預設值</translation>
</message>
<message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished">需要重新開始客戶端軟體來讓改變生效。</translation>
@@ -1522,7 +1823,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>The configuration file could not be opened.</source>
<translation type="unfinished">无法打开配置文件。</translation>
</message>
- </context>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -1541,6 +1850,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">顯示的資訊可能是過期的。跟 Bitcoin 網路的連線建立後,你的錢包會自動和網路同步,但是這個步驟還沒完成。</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation type="unfinished">可用金額:</translation>
</message>
@@ -1569,10 +1882,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">餘額</translation>
</message>
<message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
<source>Your current total balance</source>
<translation type="unfinished">您当前的总余额</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation type="unfinished">最近的交易</translation>
</message>
@@ -1581,6 +1906,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">仅观察地址的未确认交易</translation>
</message>
<message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
<source>Current total balance in watch-only addresses</source>
<translation type="unfinished">仅观察地址中的当前总余额</translation>
</message>
@@ -1616,6 +1945,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">關閉</translation>
</message>
<message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
@@ -1628,6 +1965,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
</message>
<message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -1637,6 +1990,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
<source>Pays transaction fee: </source>
<translation type="unfinished">支付交易费用:</translation>
</message>
@@ -1665,6 +2030,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(但这个钱包不能签名交易)</translation>
</message>
<message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
<source>Transaction status is unknown.</source>
<translation type="unfinished">交易状态未知。</translation>
</message>
@@ -1676,6 +2049,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">支付请求出错</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
<source>URI handling</source>
<translation type="unfinished">URI 處理</translation>
</message>
@@ -1752,7 +2129,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<extracomment>An Inbound Connection from a Peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
- </context>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1760,10 +2142,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
<source>Error encoding URI into QR Code.</source>
<translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
</message>
<message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
<source>Save QR Code</source>
<translation type="unfinished">儲存 QR 碼</translation>
</message>
@@ -1788,6 +2182,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">資訊(&amp;I)</translation>
</message>
<message>
+ <source>General</source>
+ <translation type="unfinished">常规</translation>
+ </message>
+ <message>
<source>Datadir</source>
<translation type="unfinished">数据目录</translation>
</message>
@@ -1800,6 +2198,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">区块存储目录</translation>
</message>
<message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">啓動時間</translation>
</message>
@@ -1808,6 +2210,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络</translation>
</message>
<message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation type="unfinished">連線數</translation>
</message>
@@ -1816,10 +2222,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">區塊鏈</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
<source>Memory usage</source>
<translation type="unfinished">内存使用</translation>
</message>
<message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
<source>(none)</source>
<translation type="unfinished">(无)</translation>
</message>
@@ -1848,6 +2266,26 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">选择节点查看详细信息。</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">传输层版本: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">传输</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">十六进制格式的BIP324会话ID,如果有的话。</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">会话ID</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">是否要将交易转发给这个节点。</translation>
</message>
@@ -1856,10 +2294,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation type="unfinished">已同步前導資料</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
@@ -1914,6 +2360,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">当前区块高度</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
<source>Decrease font size</source>
<translation type="unfinished">缩小字体大小</translation>
</message>
@@ -1950,10 +2400,23 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">高带宽</translation>
</message>
<message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
<source>Last Block</source>
<translation type="unfinished">上一个区块</translation>
</message>
<message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">最近送出</translation>
</message>
@@ -1962,6 +2425,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">上次接收</translation>
</message>
<message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
<source>The duration of a currently outstanding ping.</source>
<translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
</message>
@@ -1970,6 +2437,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ping 等待</translation>
</message>
<message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>&amp;Open</source>
<translation type="unfinished">打开(&amp;O)</translation>
</message>
@@ -1986,6 +2465,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">總計</translation>
</message>
<message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
<source>Clear console</source>
<translation type="unfinished">清主控台</translation>
</message>
@@ -2023,6 +2506,26 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
</message>
<message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: 未加密,明文传输协议</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324加密传输协议</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">我们选择了用于高带宽转发的节点</translation>
</message>
@@ -2031,15 +2534,35 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">对端选择了我们用于高带宽转发</translation>
</message>
<message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">复制地址(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation type="unfinished">1 小时(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
@@ -2049,6 +2572,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">解封(&amp;U)</translation>
</message>
<message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2071,6 +2610,10 @@ For more information on using this console, type %6.
<translation type="unfinished">执行中……</translation>
</message>
<message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">經由 %1</translation>
</message>
@@ -2079,6 +2622,10 @@ For more information on using this console, type %6.
<translation type="unfinished">是</translation>
</message>
<message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">到</translation>
</message>
@@ -2106,6 +2653,10 @@ For more information on using this console, type %6.
<translation type="unfinished">金额(&amp;A):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
<source>&amp;Message:</source>
<translation type="unfinished">訊息(&amp;M):</translation>
</message>
@@ -2114,6 +2665,10 @@ For more information on using this console, type %6.
<translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
</message>
<message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
</message>
@@ -2126,10 +2681,18 @@ For more information on using this console, type %6.
<translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
</message>
<message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
<source>&amp;Create new receiving address</source>
<translation type="unfinished">&amp;產生新的接收地址</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
<source>Clear</source>
<translation type="unfinished">清空</translation>
</message>
@@ -2150,6 +2713,10 @@ For more information on using this console, type %6.
<translation type="unfinished">从列表中移除选中的条目</translation>
</message>
<message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">複製 &amp;URI</translation>
</message>
@@ -2205,6 +2772,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请求支付至...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
<source>Label:</source>
<translation type="unfinished">标签:</translation>
</message>
@@ -2225,10 +2800,22 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
<source>Request payment to %1</source>
<translation type="unfinished">付款給 %1 的要求</translation>
</message>
@@ -2236,14 +2823,26 @@ For more information on using this console, type %6.
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
<message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
<source>(no amount requested)</source>
<translation type="unfinished">(無要求金額)</translation>
</message>
@@ -2271,14 +2870,38 @@ For more information on using this console, type %6.
<translation type="unfinished">金额不足!</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished">如果這項有打開,但是找零地址是空的或無效,那麼找零會送到一個產生出來的地址去。</translation>
</message>
<message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
<source>Transaction Fee:</source>
<translation type="unfinished">交易手续费:</translation>
</message>
@@ -2291,6 +2914,10 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -2303,12 +2930,20 @@ For more information on using this console, type %6.
<translation type="unfinished">自訂:</translation>
</message>
<message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
<source>Add &amp;Recipient</source>
<translation type="unfinished">增加收款人(&amp;R)</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
</message>
<message>
<source>Choose…</source>
@@ -2319,18 +2954,54 @@ For more information on using this console, type %6.
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
<translation type="unfinished">手續費太低的話可能會造成永遠無法確認的交易(請參考提示)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation type="unfinished">餘額:</translation>
</message>
<message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -2351,10 +3022,6 @@ For more information on using this console, type %6.
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -2363,12 +3030,26 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 (%2个块)</translation>
</message>
<message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2384,6 +3065,10 @@ For more information on using this console, type %6.
<translation type="unfinished">外部签名器失败</translation>
</message>
<message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -2397,6 +3082,10 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -2412,6 +3101,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请检查您的交易。</translation>
</message>
<message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">總金額</translation>
</message>
@@ -2442,6 +3139,22 @@ For more information on using this console, type %6.
<translation type="unfinished">支付金额必须大于0。</translation>
</message>
<message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
</message>
@@ -2452,10 +3165,18 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
<source>Confirm custom change address</source>
<translation type="unfinished">确认自定义找零地址</translation>
</message>
<message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
@@ -2471,14 +3192,34 @@ For more information on using this console, type %6.
<translation type="unfinished">付給(&amp;T):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
<source>The Bitcoin address to send the payment to</source>
<translation type="unfinished">將支付發送到的比特幣地址給</translation>
</message>
<message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
<source>The amount to send in the selected unit</source>
<translation type="unfinished">用被选单位表示的待发送金额</translation>
</message>
<message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
<source>S&amp;ubtract fee from amount</source>
<translation type="unfinished">從付款金額減去手續費(&amp;U)</translation>
</message>
@@ -2525,6 +3266,22 @@ For more information on using this console, type %6.
<translation type="unfinished">您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。</translation>
</message>
<message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
<source>Signature</source>
<translation type="unfinished">簽章</translation>
</message>
@@ -2545,10 +3302,18 @@ For more information on using this console, type %6.
<translation type="unfinished">清空所有签名消息栏</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Verify Message</source>
<translation type="unfinished">消息验证(&amp;V)</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation type="unfinished">用来签名消息的地址</translation>
</message>
@@ -2565,6 +3330,14 @@ For more information on using this console, type %6.
<translation type="unfinished">驗證這個訊息來確定是用指定的比特幣地址簽名的</translation>
</message>
<message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
<source>Click "Sign Message" to generate signature</source>
<translation type="unfinished">請按一下「簽署訊息」來產生簽章</translation>
</message>
@@ -2581,6 +3354,10 @@ For more information on using this console, type %6.
<translation type="unfinished">找不到与输入地址相关的密钥。</translation>
</message>
<message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
<source>No error</source>
<translation type="unfinished">沒有錯誤</translation>
</message>
@@ -2593,6 +3370,14 @@ For more information on using this console, type %6.
<translation type="unfinished">消息签名失败。</translation>
</message>
<message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
<source>Please check the signature and try again.</source>
<translation type="unfinished">请检查签名后重试。</translation>
</message>
@@ -2601,6 +3386,10 @@ For more information on using this console, type %6.
<translation type="unfinished">這個簽章跟訊息的數位摘要不符。</translation>
</message>
<message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
<source>Message verified.</source>
<translation type="unfinished">消息验证成功。</translation>
</message>
@@ -2634,6 +3423,11 @@ For more information on using this console, type %6.
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
<message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>%1/unconfirmed</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
<translation type="unfinished">%1 次/未確認</translation>
@@ -2644,10 +3438,18 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 个确认</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Source</source>
<translation type="unfinished">來源</translation>
</message>
<message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
<source>From</source>
<translation type="unfinished">來源</translation>
</message>
@@ -2660,6 +3462,10 @@ For more information on using this console, type %6.
<translation type="unfinished">到</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
<source>watch-only</source>
<translation type="unfinished">只能看</translation>
</message>
@@ -2667,6 +3473,10 @@ For more information on using this console, type %6.
<source>label</source>
<translation type="unfinished">标签</translation>
</message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2674,18 +3484,46 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
<source>Total debit</source>
<translation type="unfinished">总支出</translation>
</message>
<message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
<source>Net amount</source>
<translation type="unfinished">淨額</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
<source>Transaction ID</source>
<translation type="unfinished">交易 ID</translation>
</message>
<message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
<source>Transaction virtual size</source>
<translation type="unfinished">交易擬真大小</translation>
</message>
@@ -2694,8 +3532,20 @@ For more information on using this console, type %6.
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
+ </message>
+ <message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
</message>
<message>
<source>Inputs</source>
@@ -2709,7 +3559,11 @@ For more information on using this console, type %6.
<source>true</source>
<translation type="unfinished">是</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
@@ -2724,6 +3578,10 @@ For more information on using this console, type %6.
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2732,6 +3590,14 @@ For more information on using this console, type %6.
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
<translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
</message>
@@ -2740,6 +3606,18 @@ For more information on using this console, type %6.
<translation type="unfinished">已確認(%1 次)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2752,10 +3630,6 @@ For more information on using this console, type %6.
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">付給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -2780,6 +3654,10 @@ For more information on using this console, type %6.
<translation type="unfinished">收到交易的日期和時間。</translation>
</message>
<message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
<translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
</message>
@@ -2795,6 +3673,10 @@ For more information on using this console, type %6.
<translation type="unfinished">全部</translation>
</message>
<message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
<source>This week</source>
<translation type="unfinished">這星期</translation>
</message>
@@ -2803,6 +3685,14 @@ For more information on using this console, type %6.
<translation type="unfinished">這個月</translation>
</message>
<message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2811,10 +3701,6 @@ For more information on using this console, type %6.
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -2823,6 +3709,10 @@ For more information on using this console, type %6.
<translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
</message>
<message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
<source>Range…</source>
<translation type="unfinished">范围...</translation>
</message>
@@ -2847,10 +3737,22 @@ For more information on using this console, type %6.
<translation type="unfinished">复制原始交易(&amp;R)</translation>
</message>
<message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
<source>Increase transaction &amp;fee</source>
<translation type="unfinished">增加矿工费(&amp;F)</translation>
</message>
<message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
<source>&amp;Edit address label</source>
<translation type="unfinished">编辑地址标签(&amp;E)</translation>
</message>
@@ -2860,15 +3762,27 @@ For more information on using this console, type %6.
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗號分隔文件</translation>
</message>
<message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Watch-only</source>
<translation type="unfinished">只能觀看的</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2904,7 +3818,11 @@ For more information on using this console, type %6.
<source>Range:</source>
<translation type="unfinished">範圍:</translation>
</message>
- </context>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2935,7 +3853,15 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Partially Signed Transaction (*.psbt)</source>
<translation type="unfinished">部分签名交易 (*.psbt)</translation>
</message>
- </context>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
@@ -2943,11 +3869,23 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">付款</translation>
</message>
<message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
<translation type="unfinished">想要提高手續費嗎?</translation>
</message>
<message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
<source>New fee:</source>
<translation type="unfinished">新的費用:</translation>
</message>
@@ -2964,6 +3902,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">無法草擬交易。</translation>
</message>
<message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
@@ -2976,12 +3918,20 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Could not commit transaction</source>
<translation type="unfinished">沒辦法提交交易</translation>
</message>
- </context>
+ <message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+</context>
<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;匯出</translation>
+ <translation type="unfinished">导出(E)</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -3024,6 +3974,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s请求监听端口%u。此端口被认为是“坏的”,所以不太可能有其他节点会连接过来。详情以及完整的端口列表请参见 doc/p2p-bad-ports.md 。</translation>
</message>
@@ -3032,6 +3986,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
<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">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
</message>
@@ -3056,26 +4014,58 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
</message>
<message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
</message>
<message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">错误: 旧式钱包只支持 "legacy", "p2sh-segwit", 和 "bech32" 这三种地址类型</translation>
+ </message>
+ <message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>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>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
<translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
</message>
<message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
<translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
</message>
<message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
@@ -3084,6 +4074,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">修剪:上次同步钱包的位置已经超出(落后于)现有修剪后数据的范围。你需要进行-reindex(对于已经启用修剪节点,就需要重新下载整个区块链)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">重命名 '%s' -&gt; '%s' 失败。您需要手动移走或删除无效的快照目录 %s来解决这个问题,不然的话您就会在下一次启动时遇到相同的错误。</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: SQLite钱包schema版本%d未知。只支持%d版本</translation>
</message>
@@ -3092,14 +4086,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">區塊資料庫中有來自未來的區塊。可能是你電腦的日期時間不對。如果確定電腦日期時間沒錯的話,就重建區塊資料庫看看。</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">区块索引数据库含有历史遗留的 'txindex' 。可以运行完整的 -reindex 来清理被占用的磁盘空间;也可以忽略这个错误。这个错误消息将不会再次显示。</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">扣除手續費後的交易金額太少而不能傳送</translation>
</message>
<message>
+ <source>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>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation type="unfinished">這是個還沒發表的測試版本 - 使用請自負風險 - 請不要用來開採或做商業應用</translation>
</message>
@@ -3128,6 +4122,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">提供了未知的钱包格式 "%s" 。请使用 "bdb" 或 "sqlite" 中的一种。</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">不支持的类别限定日志等级 %1$s=%2$s 。 预期参数 %1$s=&lt;category&gt;:&lt;loglevel&gt;。 有效的类别: %3$s 。有效的日志等级: %4$s 。</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">找到了不受支持的 chainstate 数据库格式。请使用 -reindex-chainstate 参数重启。这将会重建 chainstate 数据库。</translation>
</message>
@@ -3136,6 +4134,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">钱包创建成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">钱包加载成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。可以使用 migratewallet 命令将旧式钱包迁移至输出描述符钱包。</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">警告: 转储文件的钱包格式 "%s" 与命令行指定的格式 "%s" 不符。</translation>
</message>
@@ -3144,6 +4146,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
<translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
</message>
@@ -3160,6 +4166,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">參數 -maxmempool 至少要給 %d 百萬位元組(MB)</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">沒辦法解析 -%s 參數指定的地址: '%s'</translation>
</message>
@@ -3176,30 +4186,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">不能写入到数据目录'%s';请检查文件权限。</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">无法完成由之前版本启动的 -txindex 升级。请用之前的版本重新启动,或者进行一次完整的 -reindex 。</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上以供诊断问题的原因。</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -blockfilterindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 blockfilterindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -coinstatsindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 coinstatsindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -txindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 txindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">在使用地址管理器(addrman)寻找出站连接时,无法同时提供特定的连接。</translation>
</message>
@@ -3208,6 +4198,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">加载%s时出错: 编译时未启用外部签名器支持,却仍然试图加载外部签名器钱包</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">读取 %s 时出错! 所有密钥都被正确读取,但交易数据或地址元数据可能缺失或有误。</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">错误:钱包中的地址簿数据无法被识别为属于迁移后的钱包</translation>
</message>
@@ -3220,6 +4214,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误:钱包中的交易%s无法被识别为属于迁移后的钱包</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">计算追加手续费失败,因为未确认UTXO依赖了大量未确认交易的簇集。</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">无法重命名无效的 peers.dat 文件。 请移动或删除它,然后重试。</translation>
</message>
@@ -3294,10 +4292,6 @@ Please try running the latest software version.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">不支持的类别限定日志等级 -loglevel=%s。预期参数 -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s。有效的类别: %s。</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -3318,6 +4312,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
<source>Do you want to rebuild the block database now?</source>
<translation type="unfinished">你想现在就重建区块数据库吗?</translation>
</message>
@@ -3330,6 +4344,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -3338,6 +4356,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化区块数据库时出错</translation>
</message>
<message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
<source>Error loading %s</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤</translation>
</message>
@@ -3354,6 +4376,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤: 這個錢包需要新版的 %s</translation>
</message>
<message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
@@ -3362,16 +4392,16 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3390,10 +4420,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -3418,6 +4444,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -3426,10 +4456,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">无法启动索引,关闭中...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -3598,6 +4652,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">这是你每次交易付款时最少要付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amounts must not be negative</source>
<translation type="unfinished">交易金额不不可为负数</translation>
</message>
@@ -3662,14 +4720,30 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">在 -onlynet 指定了不明的網路別: '%s'</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">不支持的全局日志等级 -loglevel=%s 。有效的数值:%s 。</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cs.ts b/src/qt/locale/bitcoin_cs.ts
index f6a97528bc..5f2ffc5bd0 100644
--- a/src/qt/locale/bitcoin_cs.ts
+++ b/src/qt/locale/bitcoin_cs.ts
@@ -54,14 +54,6 @@
<translation type="unfinished">&amp;Zvol</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Odesílací adresy</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Přijímací adresy</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Tohle jsou tvé bitcoinové adresy pro posílání plateb. Před odesláním mincí si vždy zkontroluj částku a cílovou adresu.</translation>
</message>
@@ -902,10 +894,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Poplatek:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Prach:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Čistá částka:</translation>
</message>
@@ -994,10 +982,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopíruj bajty</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopíruj prach</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopíruj drobné</translation>
</message>
@@ -1006,18 +990,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 zamčeno)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ano</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ne</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Popisek zčervená, pokud má některý příjemce obdržet částku menší, než je aktuální práh pro prach.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Může se lišit o +/– %1 satoshi na každý vstup.</translation>
</message>
@@ -1195,14 +1167,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Vytvořit prázdnou peněženku</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Použít popisovače pro správu scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Popisovačová peněženka</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Použijte externí podepisovací zařízení, například hardwarovou peněženku. V nastavení peněženky nejprve nakonfigurujte skript externího podepisovacího zařízení.</translation>
</message>
@@ -1215,10 +1179,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Vytvořit</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Zkompilováno bez podpory sqlite (vyžadováno pro popisovačové peněženky)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Zkompilováno bez externí podpory podepisování (nutné pro externí podepisování)</translation>
@@ -1774,18 +1734,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Použít samostatnou SOCKS&amp;5 proxy ke spojení s protějšky přes skryté služby v Toru:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Písmo s pevnou šířkou v panelu Přehled:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">zahrnuto "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">nejbližší shoda "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Budiž</translation>
</message>
@@ -2027,8 +1975,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT uložena na disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Odešle %1 na %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">vlastní adresa</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2928,10 +2876,6 @@ Pokud vidíte tuto chybu, měli byste požádat, aby obchodník poskytl adresu k
<translation type="unfinished">Vstupy...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Prach:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Zvol...</translation>
</message>
@@ -3008,10 +2952,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Kopíruj bajty</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopíruj prach</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopíruj drobné</translation>
</message>
@@ -3042,10 +2982,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Vytvořit částečně podepsanou Bitcoin transakci (Partially Signed Bitcoin Transaction - PSBT) k použtí kupříkladu s offline %1 peněženkou nebo s jinou kompatibilní PSBT hardware peněženkou.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">z peněženky '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 do '%2'</translation>
</message>
@@ -3565,10 +3501,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Pořadí výstupu</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certifikát nebyl ověřen)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Obchodník</translation>
</message>
@@ -3659,10 +3591,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Posláno na</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Platba sama sobě</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Vytěženo</translation>
</message>
@@ -3734,10 +3662,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Posláno na</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Sám sobě</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Vytěženo</translation>
</message>
@@ -4043,10 +3967,6 @@ Přejděte do Soubor &gt; Otevřít peněženku pro načtení peněženky.
<translation type="unfinished">Chyba při načítání peněženky. Peněženka vyžaduje stažení bloků a software v současné době nepodporuje načítání peněženek, zatímco bloky jsou stahovány mimo pořadí při použití snímků assumeutxo. Peněženka by měla být schopná se úspěšně načíst poté, co synchronizace uzlů dosáhne výšky %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Nastala chyba při čtení souboru %s! Všechny klíče se přečetly správně, ale data o transakcích nebo záznamy v adresáři mohou chybět či být nesprávné.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Chyba při čtení %s! Data o transakci mohou chybět a nebo být chybná.
Ověřuji peněženku.</translation>
@@ -4124,10 +4044,6 @@ Ověřuji peněženku.</translation>
<translation type="unfinished">Databáze bloků obsahuje blok, který vypadá jako z budoucnosti, což může být kvůli špatně nastavenému datu a času na tvém počítači. Nech databázi bloků přestavět pouze v případě, že si jsi jistý, že máš na počítači správný datum a čas</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">Databáze indexu bloků obsahuje starší 'txindex'. Pro vyčištění obsazeného místa na disku, spusťte úplný -reindex, v opačném případě tuto chybu ignorujte. Tato chybová zpráva nebude znovu zobrazena.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Částka v transakci po odečtení poplatku je příliš malá na odeslání</translation>
</message>
@@ -4220,30 +4136,10 @@ Ověřuji peněženku.</translation>
<translation type="unfinished">Není možné zapisovat do adresáře ' %s'; zkontrolujte oprávnění.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">Aktualizaci -txindex zahájenou předchozí verzí není možné dokončit. Restartujte s předchozí verzí a nebo spusťte úplný -reindex.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%sse nepodařilo ověřit -assumeutxo stav snímku. Tohle značí hardwarový problém, chybu v softwaru nebo špatnou úpravu softwaru, která dovolila nahrání neplatného snímku. Výsledkem je vypnutí uzlu a přestaňte používat jakékoliv verze, které byli postaveny na tomto snímku, resetování délky řetězce od %d do %d. Při příštím restartu bude uzel pokračovat v synchronizování od %d bez jakýkoliv dat snímku. Prosím, nahlašte tento incident %s, včetně toho, jak jste získali tento snímek. Neplatný snímek stavu řetězce byl ponechán na disku v případě, že by to bylo nápomocné při odhalení potíže, která způsobila tuto chybu. </translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s je nastaveno příliš vysoko! Poplatek takhle vysoký může pokrýt celou transakci.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Parametr -reindex-chainstate není kompatibilní s parametrem -blockfilterindex. Při použití -reindex-chainstate dočasně zakažte parametr -blockfilterindex nebo nahraďte parametr -reindex-chainstate parametrem -reindex pro úplné opětovné sestavení všech indexů.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Parametr -reindex-chainstate není kompatibilní s parametrem -coinstatsindex. Při použití -reindex-chainstate dočasně zakažte parametr -coinstatsindex nebo nahraďte parametr -reindex-chainstate parametrem -reindex pro úplné opětovné sestavení všech indexů.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Parametr -reindex-chainstate není kompatibilní s parametrem -txindex. Při použití -reindex-chainstate dočasně zakažte parametr -txindex nebo nahraďte parametr -reindex-chainstate parametrem -reindex pro úplné opětovné sestavení všech indexů.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Nelze poskytovat konkrétní spojení a zároveň mít vyhledávání addrman odchozích spojení ve stejný čas.</translation>
</message>
@@ -4338,10 +4234,6 @@ Zkuste prosím spustit nejnovější verzi softwaru.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Nepodporovaná úroveň pro logování úrovně -loglevel=%s. Očekávaný parametr -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Platné kategorie: %s. Platné úrovně logování: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4446,14 +4338,6 @@ Nelze obnovit zálohu peněženky.</translation>
<translation type="unfinished">Chyba: Nelze extrahovat cíl z generovaného scriptpubkey</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Chyba: Nelze přidat pouze-sledovací tx do peněženky pro čtení</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Chyba: Nelze odstranit transakce které jsou pouze pro čtení</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">Chyba: nebylo možno vytvořit kurzor do databáze</translation>
</message>
@@ -4490,10 +4374,6 @@ Nelze obnovit zálohu peněženky.</translation>
<translation type="unfinished">Chyba: Žádné %s adresy nejsou dostupné.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Chyba: Ne všechny pouze-sledovací tx bylo možné smazat</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Chyba: Tato peněženka již používá SQLite</translation>
</message>
@@ -4770,10 +4650,6 @@ Nelze obnovit zálohu peněženky.</translation>
<translation type="unfinished">Výstupní index změny transakce mimo rozsah</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakce má v transakčním zásobníku příliš dlouhý řetězec</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakce musí mít alespoň jednoho příjemce</translation>
</message>
@@ -4850,10 +4726,6 @@ Nelze obnovit zálohu peněženky.</translation>
<translation type="unfinished">Neznámá nová pravidla aktivována (verzový bit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Nepodporovaný globální logovací úroveň -loglevel=%s. Možné hodnoty: %s.</translation>
- </message>
- <message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Nepodporovaná logovací kategorie %s=%s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_cy.ts b/src/qt/locale/bitcoin_cy.ts
index ccff0580fd..273e36eb03 100644
--- a/src/qt/locale/bitcoin_cy.ts
+++ b/src/qt/locale/bitcoin_cy.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">D&amp;ewis</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Anfon cyfeiriadau</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Derbyn cyfeiriadau</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Rhain ydi eich cyfeiriadau Bitcoin ar gyfer gyrru taliadau. Gwnewch yn sicr o'r swm a'r cyfeiriad derbyn cyn gyrru arian.</translation>
</message>
@@ -549,10 +541,6 @@
<translation type="unfinished">Ffî:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Llwch</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Ar Ôl Ffî</translation>
</message>
@@ -867,10 +855,6 @@
<translation type="unfinished">Anfon at pobl lluosog ar yr un pryd</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Llwch</translation>
- </message>
- <message>
<source>Balance:</source>
<translation type="unfinished">Gweddill:</translation>
</message>
diff --git a/src/qt/locale/bitcoin_da.ts b/src/qt/locale/bitcoin_da.ts
index 651ac0e2ae..53a4f6a223 100644
--- a/src/qt/locale/bitcoin_da.ts
+++ b/src/qt/locale/bitcoin_da.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Vælg</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Afsendelsesadresser</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Modtagelsesadresser</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Disse er dine Bitcoin-adresser til afsendelse af betalinger. Tjek altid beløb og modtagelsesadresse, inden du sender bitcoins.</translation>
</message>
@@ -854,10 +846,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Gebyr:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Støv:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Efter gebyr:</translation>
</message>
@@ -946,10 +934,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopiér byte</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiér støv</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiér byttepenge</translation>
</message>
@@ -958,18 +942,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 fastlåst)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ja</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">nej</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Denne mærkat bliver rød, hvis en eller flere modtagere modtager et beløb, der er mindre end den aktuelle støvgrænse.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Kan variere med ±%1 satoshi per input.</translation>
</message>
@@ -1115,14 +1087,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Lav flad tegnebog</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Brug beskrivere til håndtering af scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Beskriver-Pung</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Brug en ekstern signeringsenhed som en hardwaretegnebog. Konfigurer den eksterne underskriver skript i tegnebogspræferencerne først.</translation>
</message>
@@ -1135,10 +1099,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Opret</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Kompileret uden sqlite-understøttelse (krævet til beskriver-punge)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Kompileret uden ekstern underskriver understøttelse (nødvendig for ekstern underskriver)</translation>
@@ -1658,18 +1618,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Brug separate SOCKS&amp;5 proxy, for at nå fælle via Tor-onion-tjenester:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Monospaced skrifttype på fanen Oversigt:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">indlejret "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">tættest matchende "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Ok</translation>
</message>
@@ -1891,8 +1839,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT gemt på disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Sender %1 til %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">egen adresse</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2744,10 +2692,6 @@ For mere information om brug af denne konsol, skriv %6.
<translation type="unfinished">Inputs...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Støv:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Vælg...</translation>
</message>
@@ -2824,10 +2768,6 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">Kopiér byte</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiér støv</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiér byttepenge</translation>
</message>
@@ -2854,10 +2794,6 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">L&amp;av usigneret</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">fra tegnebog '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 til '%2'</translation>
</message>
@@ -3347,10 +3283,6 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">Outputindeks</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(certifikat er ikke verificeret)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Forretningsdrivende</translation>
</message>
@@ -3445,10 +3377,6 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">Sendt til</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Betaling til dig selv</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minet</translation>
</message>
@@ -3520,10 +3448,6 @@ Bemærk: Da gebyret beregnes på per-byte-basis, ville en gebyrsats på "100 sat
<translation type="unfinished">Sendt til</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Til dig selv</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minet</translation>
</message>
@@ -3812,10 +3736,6 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">Distribueret under MIT-softwarelicensen; se den vedlagte fil %s eller %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Fejl under læsning af %s! Alle nøgler blev læst korrekt, men transaktionsdata eller indgange i adressebogen kan mangle eller være ukorrekte.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Fejl ved læsning %s! Transaktionsdata kan mangle eller være forkerte. Genscanner tegnebogen.</translation>
</message>
@@ -3884,10 +3804,6 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">Blokdatabasen indeholder en blok, som ser ud til at være fra fremtiden. Dette kan skyldes, at din computers dato og tid ikke er sat korrekt. Genopbyg kun blokdatabasen, hvis du er sikker på, at din computers dato og tid er korrekt</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">Blokindekset db indeholder et ældre 'txindex'. For at rydde den optagede diskplads skal du køre en fuld -reindex, ellers ignorere denne fejl. Denne fejlmeddelelse vil ikke blive vist igen.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Transaktionsbeløbet er for lille til at sende, når gebyret er trukket fra</translation>
</message>
@@ -3972,10 +3888,6 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">Kan ikke skrive til datamappe '%s'; tjek tilladelser.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">Opgraderingen af -txindex som er startet af en tidligere version kan ikke fuldføres. Genstart med den tidligere version eller kør en fuld -reindex.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Kan ikke levere specifikke forbindelser og få adrman til at finde udgående forbindelser på samme tid.</translation>
</message>
@@ -4316,10 +4228,6 @@ Gå til Fil &gt; Åbn Pung for, at indlæse en pung.
<translation type="unfinished">Transaktions byttepenge outputindeks uden for intervallet</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transaktionen har en for lang hukommelsespuljekæde</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transaktionen skal have mindst én modtager</translation>
</message>
diff --git a/src/qt/locale/bitcoin_de.ts b/src/qt/locale/bitcoin_de.ts
index 25560ecdf3..e7a3710dfb 100644
--- a/src/qt/locale/bitcoin_de.ts
+++ b/src/qt/locale/bitcoin_de.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Auswählen</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Sendeadressen</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Empfangsadressen</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Dies sind Ihre Bitcoin-Adressen zum Tätigen von Überweisungen. Bitte prüfen Sie den Betrag und die Adresse des Empfängers, bevor Sie Bitcoins überweisen.</translation>
</message>
@@ -102,6 +94,14 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Beim Speichern der Adressliste nach %1 ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Sendeadressen - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Empfangsadressen - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Exportieren fehlgeschlagen</translation>
</message>
@@ -263,7 +263,7 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
<message>
<source>Runaway exception</source>
- <translation type="unfinished">Ausreisser Ausnahme</translation>
+ <translation type="unfinished">Nicht abgefangene Ausnahme</translation>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
@@ -290,117 +290,4709 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
<translation type="unfinished">Ein schwerwiegender Fehler ist aufgetreten. Überprüfen Sie, ob die Einstellungsdatei beschreibbar ist, oder versuchen Sie, mit -nosettings zu starten.</translation>
</message>
+ <message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1 noch nicht sicher beendet…</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">unbekannt</translation>
+ </message>
+ <message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Eingebettet "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Standard Systemschriftart "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Benutzerdefiniert...</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">Betrag</translation>
+ </message>
+ <message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">Bitcoin-Adresse eingeben (z.B. %1)</translation>
+ </message>
+ <message>
+ <source>Ctrl+W</source>
+ <translation type="unfinished">Strg+W</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">Nicht weiterleitbar</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
+ <translation type="unfinished">Eingehend</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">Ausgehend</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">Volles Relais</translation>
+ </message>
+ <message>
+ <source>Block Relay</source>
+ <extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">Blockrelais</translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <extracomment>Peer connection type established manually through one of several methods.</extracomment>
+ <translation type="unfinished">Manuell</translation>
+ </message>
+ <message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">Fühler</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">Adress Abholung</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 T</translation>
+ </message>
+ <message>
+ <source>%1 h</source>
+ <translation type="unfinished">%1 S</translation>
+ </message>
+ <message>
+ <source>%1 m</source>
+ <translation type="unfinished">%1 min</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">Keine</translation>
+ </message>
+ <message>
+ <source>N/A</source>
+ <translation type="unfinished">k.A.</translation>
+ </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform>%n second(s)</numerusform>
- <numerusform>%n second(s)</numerusform>
+ <numerusform>%n Sekunde</numerusform>
+ <numerusform>%n Sekunden</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform>%n minute(s)</numerusform>
- <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n Minute</numerusform>
+ <numerusform>%n Minuten</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform>%n hour(s)</numerusform>
- <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n Stunde</numerusform>
+ <numerusform>%n Stunden</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
- <numerusform>%n day(s)</numerusform>
- <numerusform>%n day(s)</numerusform>
+ <numerusform>%nTag</numerusform>
+ <numerusform>%n Tage</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
- <numerusform>%n week(s)</numerusform>
- <numerusform>%n week(s)</numerusform>
+ <numerusform>%n Woche</numerusform>
+ <numerusform>%n Wochen</numerusform>
</translation>
</message>
+ <message>
+ <source>%1 and %2</source>
+ <translation type="unfinished">%1 und %2</translation>
+ </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform>%n year(s)</numerusform>
- <numerusform>%n year(s)</numerusform>
+ <numerusform>%nJahr</numerusform>
+ <numerusform>%n Jahre</numerusform>
</translation>
</message>
</context>
<context>
<name>BitcoinGUI</name>
+ <message>
+ <source>&amp;Overview</source>
+ <translation type="unfinished">&amp;Übersicht</translation>
+ </message>
+ <message>
+ <source>Show general overview of wallet</source>
+ <translation type="unfinished">Allgemeine Übersicht des Wallets anzeigen.</translation>
+ </message>
+ <message>
+ <source>&amp;Transactions</source>
+ <translation type="unfinished">&amp;Transaktionen</translation>
+ </message>
+ <message>
+ <source>Browse transaction history</source>
+ <translation type="unfinished">Transaktionsverlauf anschauen</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished">&amp;Beenden</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation type="unfinished">Anwendung beenden</translation>
+ </message>
+ <message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">&amp;Über %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Informationen anzeigen über %1</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished">Über &amp;Qt</translation>
+ </message>
+ <message>
+ <source>Show information about Qt</source>
+ <translation type="unfinished">Informationen anzeigen über Qt</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Konfiguration von %1 bearbeiten</translation>
+ </message>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">Neues Wallet erstellen</translation>
+ </message>
+ <message>
+ <source>&amp;Minimize</source>
+ <translation type="unfinished">&amp;Minimieren</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Wallet: </translation>
+ </message>
+ <message>
+ <source>Network activity disabled.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">Netzwerkaktivität deaktiviert.</translation>
+ </message>
+ <message>
+ <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
+ <translation type="unfinished">Proxy ist &lt;b&gt;aktiviert&lt;/b&gt;: %1</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation type="unfinished">Bitcoins an eine Bitcoin-Adresse überweisen</translation>
+ </message>
+ <message>
+ <source>Backup wallet to another location</source>
+ <translation type="unfinished">Eine Wallet-Sicherungskopie erstellen und abspeichern</translation>
+ </message>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">Die Passphrase ändern, die für die Wallet-Verschlüsselung benutzt wird</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation type="unfinished">&amp;Überweisen</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation type="unfinished">&amp;Empfangen</translation>
+ </message>
+ <message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Optionen…</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">Wallet &amp;verschlüsseln…</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation type="unfinished">Die zu Ihrer Wallet gehörenden privaten Schlüssel verschlüsseln</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">Wallet &amp;sichern…</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">Passphrase &amp;ändern…</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">&amp;Nachricht signieren</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">Nachrichten signieren, um den Besitz Ihrer Bitcoin-Adressen zu beweisen</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">Nachricht &amp;verifizieren…</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation type="unfinished">Nachrichten verifizieren, um sicherzustellen, dass diese mit den angegebenen Bitcoin-Adressen signiert wurden</translation>
+ </message>
+ <message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Lade PSBT aus Datei…</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Öffne &amp;URI…</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Wallet schließen</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Wallet erstellen…</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Schließe alle Wallets…</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Datei</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;Einstellungen</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;Hilfe</translation>
+ </message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">Registerkartenleiste</translation>
+ </message>
+ <message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Synchronisiere Header (%1%)…</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Synchronisiere mit Netzwerk...</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Indiziere Blöcke auf Datenträger...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Verarbeite Blöcke auf Datenträger...</translation>
+ </message>
+ <message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">Verbinde mit Gegenstellen...</translation>
+ </message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation type="unfinished">Zahlungen anfordern (erzeugt QR-Codes und bitcoin: URIs)</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation type="unfinished">Liste verwendeter Zahlungsadressen und Bezeichnungen anzeigen</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation type="unfinished">Liste verwendeter Empfangsadressen und Bezeichnungen anzeigen</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation type="unfinished">&amp;Kommandozeilenoptionen</translation>
+ </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>Processed %n block(s) of transaction history.</numerusform>
- <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform> %n Block der Transaktionshistorie verarbeitet.</numerusform>
+ <numerusform> %n Blöcke der Transaktionshistorie verarbeitet.</numerusform>
</translation>
</message>
+ <message>
+ <source>%1 behind</source>
+ <translation type="unfinished">%1 im Rückstand</translation>
+ </message>
+ <message>
+ <source>Catching up…</source>
+ <translation type="unfinished">Hole auf…</translation>
+ </message>
+ <message>
+ <source>Last received block was generated %1 ago.</source>
+ <translation type="unfinished">Zuletzt empfangener Block wurde generiert vor %1 .</translation>
+ </message>
+ <message>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation type="unfinished">Transaktionen hiernach werden noch nicht angezeigt.</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Fehler</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="unfinished">Warnung</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation type="unfinished">Informationen</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation type="unfinished">Auf aktuellem Stand</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">STRG+B</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">Lade teilsignierte Bitcoin-Transaktion</translation>
+ </message>
+ <message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Lade PSBT aus Zwischenablage…</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
+ <translation type="unfinished">Lade teilsignierte Bitcoin-Transaktion aus Zwischenablage</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Node-Fenster</translation>
+ </message>
+ <message>
+ <source>Open node debugging and diagnostic console</source>
+ <translation type="unfinished">Öffne Node-Konsole für Fehlersuche und Diagnose</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses</source>
+ <translation type="unfinished">&amp;Versandadressen</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses</source>
+ <translation type="unfinished">&amp;Empfangsadressen</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI</source>
+ <translation type="unfinished">Öffne bitcoin: URI</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <translation type="unfinished">Wallet öffnen</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Eine Wallet öffnen</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Wallet schließen</translation>
+ </message>
+ <message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Wallet wiederherstellen...</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Wiederherstellen einer Wallet aus einer Sicherungsdatei</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Schließe alle Wallets</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Wallet migrieren</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Eine Wallet Migrieren</translation>
+ </message>
+ <message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation type="unfinished">Zeige den "%1"-Hilfetext, um eine Liste mit möglichen Kommandozeilenoptionen zu erhalten</translation>
+ </message>
+ <message>
+ <source>&amp;Mask values</source>
+ <translation type="unfinished">&amp;Blende Werte aus</translation>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">Blende die Werte im Übersichtsreiter aus</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Standard-Wallet</translation>
+ </message>
+ <message>
+ <source>No wallets available</source>
+ <translation type="unfinished">Keine Wallets verfügbar</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Wallet-Daten</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Wallet-Backup laden</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Wallet wiederherstellen...</translation>
+ </message>
+ <message>
+ <source>Wallet Name</source>
+ <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
+ <translation type="unfinished">Wallet-Name</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Programmfenster</translation>
+ </message>
+ <message>
+ <source>Ctrl+M</source>
+ <translation type="unfinished">STRG+M</translation>
+ </message>
+ <message>
+ <source>Zoom</source>
+ <translation type="unfinished">Vergrößern</translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished">Hauptfenster</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation type="unfinished">%1 Client</translation>
+ </message>
+ <message>
+ <source>&amp;Hide</source>
+ <translation type="unfinished">&amp;Ausblenden</translation>
+ </message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">&amp;Anzeigen</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
<numerusform>%n active connection(s) to Bitcoin network.</numerusform>
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n aktive Verbindung(en) zum Bitcoin-Netzwerk</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">Klicken für sonstige Aktionen.</translation>
+ </message>
+ <message>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">Gegenstellen Reiter anzeigen</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">Netzwerk Aktivität ausschalten</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">Netzwerk Aktivität einschalten</translation>
+ </message>
+ <message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Synchronisiere Header vorab (%1%)…</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Fehler beim Erstellen des Wallets</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Es kann keine neue Wallet erstellt werden, die Software wurde ohne SQLite-Unterstützung kompiliert (erforderlich für Deskriptor-Wallets)</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Fehler: %1</translation>
+ </message>
+ <message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">Warnung: %1</translation>
+ </message>
+ <message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">Datum: %1
+</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation type="unfinished">Betrag: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation type="unfinished">Typ: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation type="unfinished">Bezeichnung: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation type="unfinished">Adresse: %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">Gesendete Transaktion</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation type="unfinished">Eingehende Transaktion</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
+ <translation type="unfinished">HD Schlüssel Generierung ist &lt;b&gt;aktiviert&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">HD Schlüssel Generierung ist &lt;b&gt;deaktiviert&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">Privater Schlüssel &lt;b&gt;deaktiviert&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
+ <translation type="unfinished">Wallet ist &lt;b&gt;verschlüsselt&lt;/b&gt; und aktuell &lt;b&gt;entsperrt&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">Wallet ist &lt;b&gt;verschlüsselt&lt;/b&gt; und aktuell &lt;b&gt;gesperrt&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Original message:</source>
+ <translation type="unfinished">Original-Nachricht:</translation>
+ </message>
+</context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation type="unfinished">Die Einheit in der Beträge angezeigt werden. Klicken, um eine andere Einheit auszuwählen.</translation>
+ </message>
+</context>
+<context>
+ <name>CoinControlDialog</name>
+ <message>
+ <source>Coin Selection</source>
+ <translation type="unfinished">Münzauswahl ("Coin Control")</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">Anzahl:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Betrag:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">Gebühr:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">Abzüglich Gebühr:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">Wechselgeld:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">Alles (de)selektieren</translation>
+ </message>
+ <message>
+ <source>Tree mode</source>
+ <translation type="unfinished">Baumansicht</translation>
+ </message>
+ <message>
+ <source>List mode</source>
+ <translation type="unfinished">Listenansicht</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">Betrag</translation>
+ </message>
+ <message>
+ <source>Received with label</source>
+ <translation type="unfinished">Empfangen mit Bezeichnung</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation type="unfinished">Empfangen mit Adresse</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">Datum</translation>
+ </message>
+ <message>
+ <source>Confirmations</source>
+ <translation type="unfinished">Bestätigungen</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">Bestätigt</translation>
+ </message>
+ <message>
+ <source>Copy amount</source>
+ <translation type="unfinished">Betrag kopieren</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Adresse kopieren</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">&amp;Bezeichnung kopieren</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">&amp;Betrag kopieren</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID and output index</source>
+ <translation type="unfinished">Transaktion &amp;ID und Ausgabeindex kopieren</translation>
+ </message>
+ <message>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">Nicht ausgegebenen Betrag &amp;sperren</translation>
+ </message>
+ <message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">Nicht ausgegebenen Betrag &amp;entsperren</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">Anzahl kopieren</translation>
+ </message>
+ <message>
+ <source>Copy fee</source>
+ <translation type="unfinished">Gebühr kopieren</translation>
+ </message>
+ <message>
+ <source>Copy after fee</source>
+ <translation type="unfinished">Abzüglich Gebühr kopieren</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation type="unfinished">Bytes kopieren</translation>
+ </message>
+ <message>
+ <source>Copy change</source>
+ <translation type="unfinished">Wechselgeld kopieren</translation>
+ </message>
+ <message>
+ <source>(%1 locked)</source>
+ <translation type="unfinished">(%1 gesperrt)</translation>
+ </message>
+ <message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation type="unfinished">Kann pro Eingabe um +/- %1 Satoshi(s) abweichen.</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(keine Bezeichnung)</translation>
+ </message>
+ <message>
+ <source>change from %1 (%2)</source>
+ <translation type="unfinished">Wechselgeld von %1 (%2)</translation>
+ </message>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(Wechselgeld)</translation>
+ </message>
+</context>
+<context>
+ <name>CreateWalletActivity</name>
+ <message>
+ <source>Create Wallet</source>
+ <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
+ <translation type="unfinished">Wallet erstellen</translation>
+ </message>
+ <message>
+ <source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
+ <translation type="unfinished">Erstelle Wallet &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>Create wallet failed</source>
+ <translation type="unfinished">Fehler beim Wallet erstellen aufgetreten</translation>
+ </message>
+ <message>
+ <source>Create wallet warning</source>
+ <translation type="unfinished">Warnung beim Wallet erstellen aufgetreten</translation>
+ </message>
+ <message>
+ <source>Can't list signers</source>
+ <translation type="unfinished">Unterzeichner können nicht aufgelistet werden</translation>
+ </message>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">Zu viele externe Unterzeichner erkannt.</translation>
+ </message>
+</context>
+<context>
+ <name>LoadWalletsActivity</name>
+ <message>
+ <source>Load Wallets</source>
+ <extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
+ <translation type="unfinished">Lade Wallets</translation>
+ </message>
+ <message>
+ <source>Loading wallets…</source>
+ <extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
+ <translation type="unfinished">Lade Wallets...</translation>
+ </message>
+</context>
+<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Wallet migrieren</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Sicher, dass die Wallet migriert werden soll? &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Durch die Migration der Wallet wird diese Wallet in eine oder mehrere Deskriptor-Wallets umgewandelt. Es muss ein neues Wallet-Backup erstellt werden.
+Wenn diese Wallet Watchonly-Skripte enthält, wird eine neue Wallet erstellt, die diese Watchonly-Skripte enthält.
+Wenn diese Wallet lösbare, aber nicht beobachtete Skripte enthält, wird eine andere und neue Wallet erstellt, die diese Skripte enthält.
+
+Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet erstellt. Diese Backup-Datei heißt &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak und befindet sich im Verzeichnis für diese Wallet. Im Falle einer fehlerhaften Migration kann das Backup mit der Funktion "Wallet wiederherstellen" wiederhergestellt werden.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Wallet migrieren</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Wallet migrieren &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Die Wallet '%1' wurde erfolgreich migriert.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Nur-beobachten Scripts wurden in eine neue Wallet namens '%1' überführt.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Lösbare aber nicht beobachtete Scripts wurde in eine neue Wallet namens '%1' überführt.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migration fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migration erfolgreich</translation>
+ </message>
+</context>
+<context>
+ <name>OpenWalletActivity</name>
+ <message>
+ <source>Open wallet failed</source>
+ <translation type="unfinished">Wallet öffnen fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Open wallet warning</source>
+ <translation type="unfinished">Wallet öffnen Warnung</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Standard-Wallet</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
+ <translation type="unfinished">Wallet öffnen</translation>
+ </message>
+ <message>
+ <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
+ <translation type="unfinished">Öffne Wallet &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+</context>
+<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Wallet wiederherstellen...</translation>
+ </message>
+ <message>
+ <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
+ <translation type="unfinished">Wiederherstellen der Wallet &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>Restore wallet failed</source>
+ <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
+ <translation type="unfinished">Wallet Wiederherstellung fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Restore wallet warning</source>
+ <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
+ <translation type="unfinished">Wallet Wiederherstellungs Warnung</translation>
+ </message>
+ <message>
+ <source>Restore wallet message</source>
+ <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
+ <translation type="unfinished">Wallet Wiederherstellungs Nachricht</translation>
+ </message>
+</context>
+<context>
+ <name>WalletController</name>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Wallet schließen</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Sind Sie sich sicher, dass Sie die Wallet &lt;i&gt;%1&lt;/i&gt; schließen möchten?</translation>
+ </message>
+ <message>
+ <source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
+ <translation type="unfinished">Wenn Sie die Wallet zu lange schließen, kann es dazu kommen, dass Sie die gesamte Chain neu synchronisieren müssen, wenn Pruning aktiviert ist.</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Schließe alle Wallets</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">Sicher, dass Sie alle Wallets schließen möchten?</translation>
+ </message>
+</context>
+<context>
+ <name>CreateWalletDialog</name>
+ <message>
+ <source>Create Wallet</source>
+ <translation type="unfinished">Wallet erstellen</translation>
+ </message>
+ <message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Nur noch einen Schritt entfernt, das neue Wallet zu erstellen!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Bitte einen Namen angeben und, falls gewünscht, alle erweiterten Optionen aktivieren</translation>
+ </message>
+ <message>
+ <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
+ <translation type="unfinished">Wallet verschlüsseln. Das Wallet wird mit einer Passphrase deiner Wahl verschlüsselt.</translation>
+ </message>
+ <message>
+ <source>Encrypt Wallet</source>
+ <translation type="unfinished">Wallet verschlüsseln</translation>
+ </message>
+ <message>
+ <source>Advanced Options</source>
+ <translation type="unfinished">Erweiterte Optionen</translation>
+ </message>
+ <message>
+ <source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
+ <translation type="unfinished">Deaktiviert private Schlüssel für dieses Wallet. Wallets mit deaktivierten privaten Schlüsseln werden keine privaten Schlüssel haben und können keinen HD Seed oder private Schlüssel importieren. Das ist ideal für Wallets, die nur beobachten.</translation>
+ </message>
+ <message>
+ <source>Disable Private Keys</source>
+ <translation type="unfinished">Private Keys deaktivieren</translation>
+ </message>
+ <message>
+ <source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
+ <translation type="unfinished">Erzeugt ein leeres Wallet. Leere Wallets haben zu Anfang keine privaten Schlüssel oder Scripte. Private Schlüssel oder Adressen können importiert werden, ebenso können jetzt oder später HD-Seeds gesetzt werden.</translation>
+ </message>
+ <message>
+ <source>Make Blank Wallet</source>
+ <translation type="unfinished">Eine leere Wallet erstellen</translation>
+ </message>
+ <message>
+ <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
+ <translation type="unfinished">Verwenden Sie ein externes Signiergerät, z. B. eine Hardware-Wallet. Konfigurieren Sie zunächst das Skript für den externen Signierer in den Wallet-Einstellungen.</translation>
+ </message>
+ <message>
+ <source>External signer</source>
+ <translation type="unfinished">Externer Unterzeichner</translation>
+ </message>
+ <message>
+ <source>Create</source>
+ <translation type="unfinished">Erstellen</translation>
+ </message>
+ <message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Ohne Unterstützung für die Signierung durch externe Geräte Dritter kompiliert (notwendig für Signierung durch externe Geräte Dritter)</translation>
+ </message>
+</context>
+<context>
+ <name>EditAddressDialog</name>
+ <message>
+ <source>Edit Address</source>
+ <translation type="unfinished">Adresse bearbeiten</translation>
+ </message>
+ <message>
+ <source>&amp;Label</source>
+ <translation type="unfinished">&amp;Bezeichnung</translation>
+ </message>
+ <message>
+ <source>The label associated with this address list entry</source>
+ <translation type="unfinished">Bezeichnung, die dem Adresslisteneintrag zugeordnet ist.</translation>
+ </message>
+ <message>
+ <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
+ <translation type="unfinished">Adresse, die dem Adresslisteneintrag zugeordnet ist. Diese kann nur bei Zahlungsadressen verändert werden.</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">&amp;Adresse</translation>
+ </message>
+ <message>
+ <source>New sending address</source>
+ <translation type="unfinished">Neue Zahlungsadresse</translation>
+ </message>
+ <message>
+ <source>Edit receiving address</source>
+ <translation type="unfinished">Empfangsadresse bearbeiten</translation>
+ </message>
+ <message>
+ <source>Edit sending address</source>
+ <translation type="unfinished">Zahlungsadresse bearbeiten</translation>
+ </message>
+ <message>
+ <source>The entered address "%1" is not a valid Bitcoin address.</source>
+ <translation type="unfinished">Die eingegebene Adresse "%1" ist keine gültige Bitcoin-Adresse.</translation>
+ </message>
+ <message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">Die Adresse "%1" existiert bereits als Empfangsadresse mit dem Label "%2" und kann daher nicht als Sendeadresse hinzugefügt werden.</translation>
+ </message>
+ <message>
+ <source>The entered address "%1" is already in the address book with label "%2".</source>
+ <translation type="unfinished">Die eingegebene Adresse "%1" befindet sich bereits im Adressbuch mit der Bezeichnung "%2".</translation>
+ </message>
+ <message>
+ <source>Could not unlock wallet.</source>
+ <translation type="unfinished">Wallet konnte nicht entsperrt werden.</translation>
+ </message>
+ <message>
+ <source>New key generation failed.</source>
+ <translation type="unfinished">Erzeugung eines neuen Schlüssels fehlgeschlagen.</translation>
+ </message>
+</context>
+<context>
+ <name>FreespaceChecker</name>
+ <message>
+ <source>A new data directory will be created.</source>
+ <translation type="unfinished">Es wird ein neues Datenverzeichnis angelegt.</translation>
+ </message>
+ <message>
+ <source>name</source>
+ <translation type="unfinished">Name</translation>
+ </message>
+ <message>
+ <source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
+ <translation type="unfinished">Verzeichnis existiert bereits. Fügen Sie %1 an, wenn Sie beabsichtigen hier ein neues Verzeichnis anzulegen.</translation>
+ </message>
+ <message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">Pfad existiert bereits und ist kein Verzeichnis.</translation>
+ </message>
+ <message>
+ <source>Cannot create data directory here.</source>
+ <translation type="unfinished">Datenverzeichnis kann hier nicht angelegt werden.</translation>
+ </message>
+</context>
<context>
<name>Intro</name>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform>%n GB of space available</numerusform>
- <numerusform>%n GB of space available</numerusform>
+ <numerusform>%n GB Speicherplatz verfügbar</numerusform>
+ <numerusform>%n GB Speicherplatz verfügbar</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
- <numerusform>(of %n GB needed)</numerusform>
- <numerusform>(of %n GB needed)</numerusform>
+ <numerusform>(von %n GB benötigt)</numerusform>
+ <numerusform>(von %n GB benötigt)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
- <numerusform>(%n GB needed for full chain)</numerusform>
- <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(%n GB benötigt für komplette Blockchain)</numerusform>
+ <numerusform>(%n GB benötigt für komplette Blockchain)</numerusform>
</translation>
</message>
+ <message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">Datenverzeichnis auswählen</translation>
+ </message>
+ <message>
+ <source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
+ <translation type="unfinished">Mindestens %1 GB Daten werden in diesem Verzeichnis gespeichert, und sie werden mit der Zeit zunehmen.</translation>
+ </message>
+ <message>
+ <source>Approximately %1 GB of data will be stored in this directory.</source>
+ <translation type="unfinished">Etwa %1 GB Daten werden in diesem Verzeichnis gespeichert.</translation>
+ </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
- <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
- <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(für Wiederherstellung ausreichende Sicherung %n Tag alt)</numerusform>
+ <numerusform>(für Wiederherstellung ausreichende Sicherung %n Tage alt)</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>%1 will download and store a copy of the Bitcoin block chain.</source>
+ <translation type="unfinished">%1 wird eine Kopie der Bitcoin-Blockchain herunterladen und speichern.</translation>
+ </message>
+ <message>
+ <source>The wallet will also be stored in this directory.</source>
+ <translation type="unfinished">Die Wallet wird ebenfalls in diesem Verzeichnis gespeichert.</translation>
+ </message>
+ <message>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation type="unfinished">Fehler: Angegebenes Datenverzeichnis "%1" kann nicht angelegt werden.</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Fehler</translation>
+ </message>
+ <message>
+ <source>Welcome</source>
+ <translation type="unfinished">Willkommen</translation>
+ </message>
+ <message>
+ <source>Welcome to %1.</source>
+ <translation type="unfinished">Willkommen bei %1.</translation>
+ </message>
+ <message>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation type="unfinished">Da Sie das Programm gerade zum ersten Mal starten, können Sie nun auswählen wo %1 seine Daten ablegen wird.</translation>
+ </message>
+ <message>
+ <source>Limit block chain storage to</source>
+ <translation type="unfinished">Blockchain-Speicher beschränken auf</translation>
+ </message>
+ <message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">Um diese Einstellung wiederherzustellen, muss die gesamte Blockchain neu heruntergeladen werden. Es ist schneller, die gesamte Chain zuerst herunterzuladen und später zu kürzen. Deaktiviert einige erweiterte Funktionen.</translation>
+ </message>
+ <message>
+ <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
+ <translation type="unfinished">Diese initiale Synchronisation führt zu hoher Last und kann Hardwareprobleme, die bisher nicht aufgetreten sind, mit dem Computer verursachen. Jedes Mal, beim %1 ausführen, wird der Download zum letzten Synchronisationspunkt fortgesetzt.</translation>
+ </message>
+ <message>
+ <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
+ <translation type="unfinished">Wenn Sie auf OK klicken, beginnt %1 mit dem Herunterladen und Verarbeiten der gesamten %4-Blockchain (%2GB), beginnend mit den frühesten Transaktionen in %3 beim ersten Start von %4.</translation>
+ </message>
+ <message>
+ <source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
+ <translation type="unfinished">Wenn man den Blockchain-Speicher begrenzt (pruning), müssen die historischen Daten dennoch heruntergeladen und verarbeitet werden. Diese Daten werden aber zu einem späteren Zeitpunkt gelöscht, um die Festplattennutzung niedrig zu halten.</translation>
+ </message>
+ <message>
+ <source>Use the default data directory</source>
+ <translation type="unfinished">Standard-Datenverzeichnis verwenden</translation>
+ </message>
+ <message>
+ <source>Use a custom data directory:</source>
+ <translation type="unfinished">Ein benutzerdefiniertes Datenverzeichnis verwenden:</translation>
+ </message>
+</context>
+<context>
+ <name>HelpMessageDialog</name>
+ <message>
+ <source>version</source>
+ <translation type="unfinished">Version</translation>
+ </message>
+ <message>
+ <source>About %1</source>
+ <translation type="unfinished">Über %1</translation>
+ </message>
+ <message>
+ <source>Command-line options</source>
+ <translation type="unfinished">Kommandozeilenoptionen</translation>
+ </message>
+</context>
+<context>
+ <name>ShutdownWindow</name>
+ <message>
+ <source>%1 is shutting down…</source>
+ <translation type="unfinished">%1 wird beendet...</translation>
+ </message>
+ <message>
+ <source>Do not shut down the computer until this window disappears.</source>
+ <translation type="unfinished">Fahren Sie den Computer nicht herunter, bevor dieses Fenster verschwindet.</translation>
+ </message>
+</context>
+<context>
+ <name>ModalOverlay</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">Formular</translation>
+ </message>
+ <message>
+ <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
+ <translation type="unfinished">Neueste Transaktionen werden eventuell noch nicht angezeigt, daher könnte Ihr Kontostand veraltet sein. Er wird korrigiert, sobald Ihr Wallet die Synchronisation mit dem Bitcoin-Netzwerk erfolgreich abgeschlossen hat. Details dazu finden sich weiter unten.</translation>
+ </message>
+ <message>
+ <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
+ <translation type="unfinished">Versuche, Bitcoins aus noch nicht angezeigten Transaktionen auszugeben, werden vom Netzwerk nicht akzeptiert.</translation>
+ </message>
+ <message>
+ <source>Number of blocks left</source>
+ <translation type="unfinished">Anzahl verbleibender Blöcke</translation>
+ </message>
+ <message>
+ <source>Unknown…</source>
+ <translation type="unfinished">Unbekannt...</translation>
+ </message>
+ <message>
+ <source>calculating…</source>
+ <translation type="unfinished">berechne...</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">Letzte Blockzeit</translation>
+ </message>
+ <message>
+ <source>Progress</source>
+ <translation type="unfinished">Fortschritt</translation>
+ </message>
+ <message>
+ <source>Progress increase per hour</source>
+ <translation type="unfinished">Fortschritt pro Stunde</translation>
+ </message>
+ <message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">Geschätzt verbleibende Zeit bis synchronisiert</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">Ausblenden</translation>
+ </message>
+ <message>
+ <source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
+ <translation type="unfinished">%1 synchronisiert gerade. Es lädt Header und Blöcke von Gegenstellen und validiert sie bis zum Erreichen der Spitze der Blockchain.</translation>
+ </message>
+ <message>
+ <source>Unknown. Syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Unbekannt. Synchronisiere Header (%1, %2%)...</translation>
+ </message>
+ <message>
+ <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Unbekannt. vorsynchronisiere Header (%1, %2%)...</translation>
+ </message>
+</context>
+<context>
+ <name>OpenURIDialog</name>
+ <message>
+ <source>Open bitcoin URI</source>
+ <translation type="unfinished">Öffne bitcoin URI</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">Adresse aus der Zwischenablage einfügen</translation>
+ </message>
+</context>
+<context>
+ <name>OptionsDialog</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished">Konfiguration</translation>
+ </message>
+ <message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">&amp;Allgemein</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">%1 nach der Anmeldung im System automatisch ausführen.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation type="unfinished">&amp;Starte %1 nach Systemanmeldung</translation>
+ </message>
+ <message>
+ <source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
+ <translation type="unfinished">Durch das Aktivieren von Pruning wird der zum Speichern von Transaktionen benötigte Speicherplatz erheblich reduziert. Alle Blöcke werden weiterhin vollständig validiert. Um diese Einstellung rückgängig zu machen, muss die gesamte Blockchain erneut heruntergeladen werden.</translation>
+ </message>
+ <message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">Größe des &amp;Datenbankpufferspeichers</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">Anzahl an Skript-&amp;Verifizierungs-Threads</translation>
+ </message>
+ <message>
+ <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
+ <translation type="unfinished">Vollständiger Pfad zu %1 einem Bitcoin Core kompatibelen Script (z.B.: C:\Downloads\hwi.exe oder /Users/you/Downloads/hwi.py). Achtung: Malware kann Bitcoins stehlen!</translation>
+ </message>
+ <message>
+ <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
+ <translation type="unfinished">IP-Adresse des Proxies (z.B. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
+ </message>
+ <message>
+ <source>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation type="unfinished">Zeigt an, ob der gelieferte Standard SOCKS5 Proxy verwendet wurde, um die Peers mit diesem Netzwerktyp zu erreichen.</translation>
+ </message>
+ <message>
+ <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
+ <translation type="unfinished">Minimiert die Anwendung anstatt sie zu beenden wenn das Fenster geschlossen wird. Wenn dies aktiviert ist, müssen Sie die Anwendung über "Beenden" im Menü schließen.</translation>
+ </message>
+ <message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Schriftart im Überblicks-Reiter:</translation>
+ </message>
+ <message>
+ <source>Options set in this dialog are overridden by the command line:</source>
+ <translation type="unfinished">Einstellungen in diesem Dialog werden von der Kommandozeile überschrieben:</translation>
+ </message>
+ <message>
+ <source>Open the %1 configuration file from the working directory.</source>
+ <translation type="unfinished">Öffnen Sie die %1 Konfigurationsdatei aus dem Arbeitsverzeichnis.</translation>
+ </message>
+ <message>
+ <source>Open Configuration File</source>
+ <translation type="unfinished">Konfigurationsdatei öffnen</translation>
+ </message>
+ <message>
+ <source>Reset all client options to default.</source>
+ <translation type="unfinished">Setzt die Clientkonfiguration auf Standardwerte zurück.</translation>
+ </message>
+ <message>
+ <source>&amp;Reset Options</source>
+ <translation type="unfinished">Konfiguration &amp;zurücksetzen</translation>
+ </message>
+ <message>
+ <source>&amp;Network</source>
+ <translation type="unfinished">&amp;Netzwerk</translation>
+ </message>
+ <message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">&amp;Blockspeicher kürzen auf</translation>
+ </message>
+ <message>
+ <source>Reverting this setting requires re-downloading the entire blockchain.</source>
+ <translation type="unfinished">Wenn diese Einstellung rückgängig gemacht wird, muss die komplette Blockchain erneut heruntergeladen werden.</translation>
+ </message>
+ <message>
+ <source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
+ <extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
+ <translation type="unfinished">Maximale Größe des Datenbank-Caches. Ein größerer Cache kann zu einer schnelleren Synchronisierung beitragen, danach ist der Vorteil für die meisten Anwendungsfälle weniger ausgeprägt. Eine Verringerung der Cache-Größe reduziert den Speicherverbrauch. Ungenutzter Mempool-Speicher wird für diesen Cache gemeinsam genutzt.</translation>
+ </message>
+ <message>
+ <source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
+ <extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
+ <translation type="unfinished">Legen Sie die Anzahl der Skriptüberprüfungs-Threads fest. Negative Werte entsprechen der Anzahl der Kerne, die Sie für das System frei lassen möchten.</translation>
+ </message>
+ <message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation type="unfinished">(0 = automatisch, &lt;0 = so viele Kerne frei lassen)</translation>
+ </message>
+ <message>
+ <source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
+ <extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
+ <translation type="unfinished">Dies ermöglicht Ihnen oder einem Drittanbieter-Tool die Kommunikation mit dem Knoten über Befehlszeilen- und JSON-RPC-Befehle.</translation>
+ </message>
+ <message>
+ <source>Enable R&amp;PC server</source>
+ <extracomment>An Options window setting to enable the RPC server.</extracomment>
+ <translation type="unfinished">R&amp;PC-Server aktivieren</translation>
+ </message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">B&amp;rieftasche</translation>
+ </message>
+ <message>
+ <source>Whether to set subtract fee from amount as default or not.</source>
+ <extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
+ <translation type="unfinished">Wählen Sie, ob die Gebühr standardmäßig vom Betrag abgezogen werden soll oder nicht.</translation>
+ </message>
+ <message>
+ <source>Subtract &amp;fee from amount by default</source>
+ <extracomment>An Options window setting to set subtracting the fee from a sending amount as default.</extracomment>
+ <translation type="unfinished">Standardmäßig die Gebühr vom Betrag abziehen</translation>
+ </message>
+ <message>
+ <source>Expert</source>
+ <translation type="unfinished">Experten-Optionen</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">"&amp;Coin Control"-Funktionen aktivieren</translation>
+ </message>
+ <message>
+ <source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
+ <translation type="unfinished">Wenn Sie das Ausgeben von unbestätigtem Wechselgeld deaktivieren, kann das Wechselgeld einer Transaktion nicht verwendet werden, bis es mindestens eine Bestätigung erhalten hat. Dies wirkt sich auf die Berechnung des Kontostands aus.</translation>
+ </message>
+ <message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">&amp;Unbestätigtes Wechselgeld darf ausgegeben werden</translation>
+ </message>
+ <message>
+ <source>Enable &amp;PSBT controls</source>
+ <extracomment>An options window setting to enable PSBT controls.</extracomment>
+ <translation type="unfinished">&amp;PBST-Kontrollen aktivieren</translation>
+ </message>
+ <message>
+ <source>Whether to show PSBT controls.</source>
+ <extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
+ <translation type="unfinished">Ob PSBT-Kontrollen angezeigt werden sollen. </translation>
+ </message>
+ <message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">Gerät für externe Signierung (z. B.: Hardware wallet)</translation>
+ </message>
+ <message>
+ <source>&amp;External signer script path</source>
+ <translation type="unfinished">&amp;Pfad zum Script des externen Gerätes zur Signierung</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">Automatisch den Bitcoin-Clientport auf dem Router öffnen. Dies funktioniert nur, wenn Ihr Router UPnP unterstützt und dies aktiviert ist.</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">Portweiterleitung via &amp;UPnP</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">Öffnet automatisch den Bitcoin-Client-Port auf dem Router. Dies funktioniert nur, wenn Ihr Router NAT-PMP unterstützt und es aktiviert ist. Der externe Port kann zufällig sein.</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">Map-Port mit NA&amp;T-PMP</translation>
+ </message>
+ <message>
+ <source>Accept connections from outside.</source>
+ <translation type="unfinished">Akzeptiere Verbindungen von außerhalb.</translation>
+ </message>
+ <message>
+ <source>Allow incomin&amp;g connections</source>
+ <translation type="unfinished">Erlaube &amp;eingehende Verbindungen</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation type="unfinished">Über einen SOCKS5-Proxy mit dem Bitcoin-Netzwerk verbinden.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation type="unfinished">Über einen SOCKS5-Proxy &amp;verbinden (Standardproxy):</translation>
+ </message>
+ <message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">Proxy-&amp;IP:</translation>
+ </message>
+ <message>
+ <source>Port of the proxy (e.g. 9050)</source>
+ <translation type="unfinished">Port des Proxies (z.B. 9050)</translation>
+ </message>
+ <message>
+ <source>Used for reaching peers via:</source>
+ <translation type="unfinished">Benutzt um Gegenstellen zu erreichen über:</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Programmfenster</translation>
+ </message>
+ <message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">Zeigt das Symbol in der Leiste an.</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">&amp;Zeige Statusleistensymbol</translation>
+ </message>
+ <message>
+ <source>Show only a tray icon after minimizing the window.</source>
+ <translation type="unfinished">Nur ein Symbol im Infobereich anzeigen, nachdem das Programmfenster minimiert wurde.</translation>
+ </message>
+ <message>
+ <source>&amp;Minimize to the tray instead of the taskbar</source>
+ <translation type="unfinished">In den Infobereich anstatt in die Taskleiste &amp;minimieren</translation>
+ </message>
+ <message>
+ <source>M&amp;inimize on close</source>
+ <translation type="unfinished">Beim Schließen m&amp;inimieren</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">&amp;Anzeige</translation>
+ </message>
+ <message>
+ <source>User Interface &amp;language:</source>
+ <translation type="unfinished">&amp;Sprache der Benutzeroberfläche:</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation type="unfinished">Die Sprache der Benutzeroberflächen kann hier festgelegt werden. Diese Einstellung wird nach einem Neustart von %1 wirksam werden.</translation>
+ </message>
+ <message>
+ <source>&amp;Unit to show amounts in:</source>
+ <translation type="unfinished">&amp;Einheit der Beträge:</translation>
+ </message>
+ <message>
+ <source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
+ <translation type="unfinished">Wählen Sie die standardmäßige Untereinheit, die in der Benutzeroberfläche und beim Überweisen von Bitcoins angezeigt werden soll.</translation>
+ </message>
+ <message>
+ <source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
+ <translation type="unfinished">URLs von Drittanbietern (z. B. eines Block-Explorers), erscheinen als Kontextmenüpunkte auf der Registerkarte. %s in der URL wird durch den Transaktionshash ersetzt. Mehrere URLs werden durch senkrechte Striche | getrennt.</translation>
+ </message>
+ <message>
+ <source>&amp;Third-party transaction URLs</source>
+ <translation type="unfinished">&amp;Transaktions-URLs von Drittparteien</translation>
+ </message>
+ <message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">Legt fest, ob die "Coin Control"-Funktionen angezeigt werden.</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
+ <translation type="unfinished">Verbinde mit dem Bitcoin-Netzwerk über einen separaten SOCKS5-Proxy für Tor-Onion-Dienste.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">Nutze separaten SOCKS&amp;5-Proxy um Gegenstellen über Tor-Onion-Dienste zu erreichen:</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Abbrechen</translation>
+ </message>
+ <message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Ohne Unterstützung für die Signierung durch externe Geräte Dritter kompiliert (notwendig für Signierung durch externe Geräte Dritter)</translation>
+ </message>
+ <message>
+ <source>default</source>
+ <translation type="unfinished">Standard</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation type="unfinished">keine</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">Zurücksetzen der Konfiguration bestätigen</translation>
+ </message>
+ <message>
+ <source>Client restart required to activate changes.</source>
+ <extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
+ <translation type="unfinished">Client-Neustart erforderlich, um Änderungen zu aktivieren.</translation>
+ </message>
+ <message>
+ <source>Current settings will be backed up at "%1".</source>
+ <extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
+ <translation type="unfinished">Aktuelle Einstellungen werden in "%1" gespeichert.</translation>
+ </message>
+ <message>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
+ <translation type="unfinished">Client wird beendet. Möchten Sie den Vorgang fortsetzen?</translation>
+ </message>
+ <message>
+ <source>Configuration options</source>
+ <extracomment>Window title text of pop-up box that allows opening up of configuration file.</extracomment>
+ <translation type="unfinished">Konfigurationsoptionen</translation>
+ </message>
+ <message>
+ <source>The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
+ <extracomment>Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</extracomment>
+ <translation type="unfinished">Die Konfigurationsdatei wird verwendet, um erweiterte Benutzeroptionen festzulegen, die die GUI-Einstellungen überschreiben. Darüber hinaus werden alle Befehlszeilenoptionen diese Konfigurationsdatei überschreiben.</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished">Weiter</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Abbrechen</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Fehler</translation>
+ </message>
+ <message>
+ <source>The configuration file could not be opened.</source>
+ <translation type="unfinished">Die Konfigurationsdatei konnte nicht geöffnet werden.</translation>
+ </message>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">Diese Änderung würde einen Client-Neustart erfordern.</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">Die eingegebene Proxy-Adresse ist ungültig.</translation>
+ </message>
+</context>
+<context>
+ <name>OptionsModel</name>
+ <message>
+ <source>Could not read setting "%1", %2.</source>
+ <translation type="unfinished">Die folgende Einstellung konnte nicht gelesen werden "%1", %2.</translation>
+ </message>
+</context>
+<context>
+ <name>OverviewPage</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">Formular</translation>
+ </message>
+ <message>
+ <source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
+ <translation type="unfinished">Die angezeigten Informationen sind möglicherweise nicht mehr aktuell. Ihre Wallet wird automatisch synchronisiert, nachdem eine Verbindung zum Bitcoin-Netzwerk hergestellt wurde. Dieser Prozess ist jedoch derzeit noch nicht abgeschlossen.</translation>
+ </message>
+ <message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">Beobachtet:</translation>
+ </message>
+ <message>
+ <source>Available:</source>
+ <translation type="unfinished">Verfügbar:</translation>
+ </message>
+ <message>
+ <source>Your current spendable balance</source>
+ <translation type="unfinished">Ihr aktuell verfügbarer Kontostand</translation>
+ </message>
+ <message>
+ <source>Pending:</source>
+ <translation type="unfinished">Ausstehend:</translation>
+ </message>
+ <message>
+ <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
+ <translation type="unfinished">Gesamtbetrag aus unbestätigten Transaktionen, der noch nicht im aktuell verfügbaren Kontostand enthalten ist</translation>
+ </message>
+ <message>
+ <source>Immature:</source>
+ <translation type="unfinished">Unreif:</translation>
+ </message>
+ <message>
+ <source>Mined balance that has not yet matured</source>
+ <translation type="unfinished">Erarbeiteter Betrag der noch nicht gereift ist</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation type="unfinished">Kontostände</translation>
+ </message>
+ <message>
+ <source>Total:</source>
+ <translation type="unfinished">Gesamtbetrag:</translation>
+ </message>
+ <message>
+ <source>Your current total balance</source>
+ <translation type="unfinished">Ihr aktueller Gesamtbetrag</translation>
+ </message>
+ <message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">Ihr aktueller Kontostand in nur-beobachteten Adressen</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">Verfügbar:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation type="unfinished">Letzte Transaktionen</translation>
+ </message>
+ <message>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation type="unfinished">Unbestätigte Transaktionen an nur-beobachtete Adressen</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">Erarbeiteter Betrag in nur-beobachteten Adressen der noch nicht gereift ist</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation type="unfinished">Aktueller Gesamtbetrag in nur-beobachteten Adressen</translation>
+ </message>
+ <message>
+ <source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
+ <translation type="unfinished">Datenschutz-Modus aktiviert für den Übersichtsreiter. Um die Werte einzublenden, deaktiviere Einstellungen-&gt;Werte ausblenden.</translation>
+ </message>
+</context>
+<context>
+ <name>PSBTOperationsDialog</name>
+ <message>
+ <source>PSBT Operations</source>
+ <translation type="unfinished">PSBT-Operationen</translation>
+ </message>
+ <message>
+ <source>Sign Tx</source>
+ <translation type="unfinished">Signiere Tx</translation>
+ </message>
+ <message>
+ <source>Broadcast Tx</source>
+ <translation type="unfinished">Rundsende Tx</translation>
+ </message>
+ <message>
+ <source>Copy to Clipboard</source>
+ <translation type="unfinished">Kopiere in Zwischenablage</translation>
+ </message>
+ <message>
+ <source>Save…</source>
+ <translation type="unfinished">Speichern...</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished">Schließen</translation>
+ </message>
+ <message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">Laden der Transaktion fehlgeschlagen: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">Signieren der Transaktion fehlgeschlagen: %1</translation>
+ </message>
+ <message>
+ <source>Cannot sign inputs while wallet is locked.</source>
+ <translation type="unfinished">Eingaben können nicht unterzeichnet werden, wenn die Wallet gesperrt ist.</translation>
+ </message>
+ <message>
+ <source>Could not sign any more inputs.</source>
+ <translation type="unfinished">Konnte keinerlei weitere Eingaben signieren.</translation>
+ </message>
+ <message>
+ <source>Signed %1 inputs, but more signatures are still required.</source>
+ <translation type="unfinished">%1 Eingaben signiert, doch noch sind weitere Signaturen erforderlich.</translation>
+ </message>
+ <message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">Transaktion erfolgreich signiert. Transaktion ist bereit für Rundsendung.</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">Unbekannter Fehler bei der Transaktionsverarbeitung</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast successfully! Transaction ID: %1</source>
+ <translation type="unfinished">Transaktion erfolgreich rundgesendet! Transaktions-ID: %1</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast failed: %1</source>
+ <translation type="unfinished">Rundsenden der Transaktion fehlgeschlagen: %1</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">PSBT in Zwischenablage kopiert.</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">Speichere Transaktionsdaten</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">Teilweise signierte Transaktion (binär)</translation>
+ </message>
+ <message>
+ <source>PSBT saved to disk.</source>
+ <translation type="unfinished">PSBT auf Platte gespeichert.</translation>
+ </message>
+ <message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Schickt %1 an %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">eigene Adresse</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">Kann die Gebühr oder den Gesamtbetrag der Transaktion nicht berechnen.</translation>
+ </message>
+ <message>
+ <source>Pays transaction fee: </source>
+ <translation type="unfinished">Zahlt Transaktionsgebühr:</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">Gesamtbetrag</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">oder</translation>
+ </message>
+ <message>
+ <source>Transaction has %1 unsigned inputs.</source>
+ <translation type="unfinished">Transaktion hat %1 unsignierte Eingaben.</translation>
+ </message>
+ <message>
+ <source>Transaction is missing some information about inputs.</source>
+ <translation type="unfinished">Der Transaktion fehlen einige Informationen über Eingaben.</translation>
+ </message>
+ <message>
+ <source>Transaction still needs signature(s).</source>
+ <translation type="unfinished">Transaktion erfordert weiterhin Signatur(en).</translation>
+ </message>
+ <message>
+ <source>(But no wallet is loaded.)</source>
+ <translation type="unfinished">(Aber kein Wallet ist geladen.)</translation>
+ </message>
+ <message>
+ <source>(But this wallet cannot sign transactions.)</source>
+ <translation type="unfinished">(doch diese Wallet kann Transaktionen nicht signieren)</translation>
+ </message>
+ <message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(doch diese Wallet hat nicht die richtigen Schlüssel)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">Transaktion ist vollständig signiert und zur Rundsendung bereit.</translation>
+ </message>
+ <message>
+ <source>Transaction status is unknown.</source>
+ <translation type="unfinished">Transaktionsstatus ist unbekannt.</translation>
+ </message>
+</context>
+<context>
+ <name>PaymentServer</name>
+ <message>
+ <source>Payment request error</source>
+ <translation type="unfinished">Fehler bei der Zahlungsanforderung</translation>
+ </message>
+ <message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">Kann Bitcoin nicht starten: Klicken-zum-Bezahlen-Verarbeiter</translation>
+ </message>
+ <message>
+ <source>URI handling</source>
+ <translation type="unfinished">URI-Verarbeitung</translation>
+ </message>
+ <message>
+ <source>'bitcoin://' is not a valid URI. Use 'bitcoin:' instead.</source>
+ <translation type="unfinished">'bitcoin://' ist kein gültiger URL. Bitte 'bitcoin:' nutzen.</translation>
+ </message>
+ <message>
+ <source>Cannot process payment request because BIP70 is not supported.
+Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
+If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
+ <translation type="unfinished">Zahlungsanforderung kann nicht verarbeitet werden, da BIP70 nicht unterstützt wird.
+Aufgrund der weit verbreiteten Sicherheitslücken in BIP70 wird dringend empfohlen, die Anweisungen des Händlers zum Wechsel des Wallets zu ignorieren.
+Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BIP21-kompatiblen URI bereitzustellen.</translation>
+ </message>
+ <message>
+ <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
+ <translation type="unfinished">URI kann nicht analysiert werden! Dies kann durch eine ungültige Bitcoin-Adresse oder fehlerhafte URI-Parameter verursacht werden.</translation>
+ </message>
+ <message>
+ <source>Payment request file handling</source>
+ <translation type="unfinished">Zahlungsanforderungsdatei-Verarbeitung</translation>
+ </message>
+</context>
+<context>
+ <name>PeerTableModel</name>
+ <message>
+ <source>User Agent</source>
+ <extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
+ <translation type="unfinished">User-Agent</translation>
+ </message>
+ <message>
+ <source>Peer</source>
+ <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
+ <translation type="unfinished">Gegenstelle</translation>
+ </message>
+ <message>
+ <source>Age</source>
+ <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
+ <translation type="unfinished">Alter</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <extracomment>Title of Peers Table column which indicates the direction the peer connection was initiated from.</extracomment>
+ <translation type="unfinished">Richtung</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</extracomment>
+ <translation type="unfinished">Übertragen</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
+ <translation type="unfinished">Empfangen</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
+ <translation type="unfinished">Adresse</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
+ <translation type="unfinished">Typ</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
+ <translation type="unfinished">Netzwerk</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An Inbound Connection from a Peer.</extracomment>
+ <translation type="unfinished">Eingehend</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">Ausgehend</translation>
+ </message>
+</context>
+<context>
+ <name>QRImageWidget</name>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Bild speichern...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">Grafik &amp;kopieren</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">Resultierende URI ist zu lang, bitte den Text für Bezeichnung/Nachricht kürzen.</translation>
+ </message>
+ <message>
+ <source>Error encoding URI into QR Code.</source>
+ <translation type="unfinished">Beim Kodieren der URI in den QR-Code ist ein Fehler aufgetreten.</translation>
+ </message>
+ <message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">QR Code Funktionalität nicht vorhanden</translation>
+ </message>
+ <message>
+ <source>Save QR Code</source>
+ <translation type="unfinished">QR-Code speichern</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
+ <translation type="unfinished">PNG-Bild</translation>
+ </message>
+</context>
+<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>N/A</source>
+ <translation type="unfinished">k.A.</translation>
+ </message>
+ <message>
+ <source>Client version</source>
+ <translation type="unfinished">Client-Version</translation>
+ </message>
+ <message>
+ <source>&amp;Information</source>
+ <translation type="unfinished">&amp;Informationen</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="unfinished">Allgemein</translation>
+ </message>
+ <message>
+ <source>Datadir</source>
+ <translation type="unfinished">Datenverzeichnis</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the data directory use the '%1' option.</source>
+ <translation type="unfinished">Verwenden Sie die Option '%1' um einen anderen, nicht standardmäßigen Speicherort für das Datenverzeichnis festzulegen.</translation>
+ </message>
+ <message>
+ <source>Blocksdir</source>
+ <translation type="unfinished">Blockverzeichnis</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">Verwenden Sie die Option '%1' um einen anderen, nicht standardmäßigen Speicherort für das Blöckeverzeichnis festzulegen.</translation>
+ </message>
+ <message>
+ <source>Startup time</source>
+ <translation type="unfinished">Startzeit</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">Netzwerk</translation>
+ </message>
+ <message>
+ <source>Number of connections</source>
+ <translation type="unfinished">Anzahl der Verbindungen</translation>
+ </message>
+ <message>
+ <source>Block chain</source>
+ <translation type="unfinished">Blockchain</translation>
+ </message>
+ <message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">Speicher-Pool</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">Aktuelle Anzahl der Transaktionen</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished">Speichernutzung</translation>
+ </message>
+ <message>
+ <source>(none)</source>
+ <translation type="unfinished">(keine)</translation>
+ </message>
+ <message>
+ <source>&amp;Reset</source>
+ <translation type="unfinished">&amp;Zurücksetzen</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <translation type="unfinished">Empfangen</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation type="unfinished">Übertragen</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation type="unfinished">&amp;Gegenstellen</translation>
+ </message>
+ <message>
+ <source>Banned peers</source>
+ <translation type="unfinished">Gesperrte Gegenstellen</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation type="unfinished">Gegenstelle auswählen, um detaillierte Informationen zu erhalten.</translation>
+ </message>
+ <message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Die Transportschicht-Version: %1</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Die BIP324-Sitzungs-ID-Zeichenfolge in hexadezimaler Form, falls vorhanden.</translation>
+ </message>
+ <message>
+ <source>Whether we relay transactions to this peer.</source>
+ <translation type="unfinished">Ob wir Adressen an diese Gegenstelle weiterleiten.</translation>
+ </message>
+ <message>
+ <source>Transaction Relay</source>
+ <translation type="unfinished">Transaktions-Relay</translation>
+ </message>
+ <message>
+ <source>Starting Block</source>
+ <translation type="unfinished">Start Block</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation type="unfinished">Synchronisierte Header</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">Synchronisierte Blöcke</translation>
+ </message>
+ <message>
+ <source>Last Transaction</source>
+ <translation type="unfinished">Letzte Transaktion</translation>
+ </message>
+ <message>
+ <source>The mapped Autonomous System used for diversifying peer selection.</source>
+ <translation type="unfinished">Das zugeordnete autonome System zur Diversifizierung der Gegenstellen-Auswahl.</translation>
+ </message>
+ <message>
+ <source>Mapped AS</source>
+ <translation type="unfinished">Zugeordnetes AS</translation>
+ </message>
+ <message>
+ <source>Whether we relay addresses to this peer.</source>
+ <extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
+ <translation type="unfinished">Ob wir Adressen an diese Gegenstelle weiterleiten.</translation>
+ </message>
+ <message>
+ <source>Address Relay</source>
+ <extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
+ <translation type="unfinished">Adress-Relay</translation>
+ </message>
+ <message>
+ <source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
+ <extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
+ <translation type="unfinished">Die Gesamtzahl der von dieser Gegenstelle empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
+ </message>
+ <message>
+ <source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
+ <extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
+ <translation type="unfinished">Die Gesamtzahl der von dieser Gegenstelle empfangenen Adressen, die aufgrund von Ratenbegrenzung verworfen (nicht verarbeitet) wurden.</translation>
+ </message>
+ <message>
+ <source>Addresses Processed</source>
+ <extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
+ <translation type="unfinished">Verarbeitete Adressen</translation>
+ </message>
+ <message>
+ <source>Addresses Rate-Limited</source>
+ <extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
+ <translation type="unfinished">Ratenbeschränkte Adressen</translation>
+ </message>
+ <message>
+ <source>User Agent</source>
+ <translation type="unfinished">User-Agent</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Node-Fenster</translation>
+ </message>
+ <message>
+ <source>Current block height</source>
+ <translation type="unfinished">Aktuelle Blockhöhe</translation>
+ </message>
+ <message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">Öffnet die %1-Debug-Protokolldatei aus dem aktuellen Datenverzeichnis. Dies kann bei großen Protokolldateien einige Sekunden dauern.</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation type="unfinished">Schrift verkleinern</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation type="unfinished">Schrift vergrößern</translation>
+ </message>
+ <message>
+ <source>Permissions</source>
+ <translation type="unfinished">Berechtigungen</translation>
+ </message>
+ <message>
+ <source>The direction and type of peer connection: %1</source>
+ <translation type="unfinished">Die Richtung und der Typ der Gegenstellen-Verbindung: %1</translation>
+ </message>
+ <message>
+ <source>Direction/Type</source>
+ <translation type="unfinished">Richtung/Typ</translation>
+ </message>
+ <message>
+ <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
+ <translation type="unfinished">Das Netzwerkprotokoll, über das diese Gegenstelle verbunden ist, ist: IPv4, IPv6, Onion, I2P oder CJDNS.</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation type="unfinished">Dienste</translation>
+ </message>
+ <message>
+ <source>High bandwidth BIP152 compact block relay: %1</source>
+ <translation type="unfinished">Kompakte BIP152 Blockweiterleitung mit hoher Bandbreite: %1</translation>
+ </message>
+ <message>
+ <source>High Bandwidth</source>
+ <translation type="unfinished">Hohe Bandbreite</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation type="unfinished">Verbindungsdauer</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">Abgelaufene Zeit seitdem ein neuer Block mit erfolgreichen initialen Gültigkeitsprüfungen von dieser Gegenstelle empfangen wurde.</translation>
+ </message>
+ <message>
+ <source>Last Block</source>
+ <translation type="unfinished">Letzter Block</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">Abgelaufene Zeit seit eine neue Transaktion, die in unseren Speicherpool hineingelassen wurde, von dieser Gegenstelle empfangen wurde.</translation>
+ </message>
+ <message>
+ <source>Last Send</source>
+ <translation type="unfinished">Letzte Übertragung</translation>
+ </message>
+ <message>
+ <source>Last Receive</source>
+ <translation type="unfinished">Letzter Empfang</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping-Zeit</translation>
+ </message>
+ <message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation type="unfinished">Die Laufzeit eines aktuell ausstehenden Ping.</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation type="unfinished">Ping-Wartezeit</translation>
+ </message>
+ <message>
+ <source>Min Ping</source>
+ <translation type="unfinished">Minimaler Ping</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">Zeitversatz</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">Letzte Blockzeit</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation type="unfinished">&amp;Öffnen</translation>
+ </message>
+ <message>
+ <source>&amp;Console</source>
+ <translation type="unfinished">&amp;Konsole</translation>
+ </message>
+ <message>
+ <source>&amp;Network Traffic</source>
+ <translation type="unfinished">&amp;Netzwerkauslastung</translation>
+ </message>
+ <message>
+ <source>Totals</source>
+ <translation type="unfinished">Gesamtbetrag:</translation>
+ </message>
+ <message>
+ <source>Debug log file</source>
+ <translation type="unfinished">Debug-Protokolldatei</translation>
+ </message>
+ <message>
+ <source>Clear console</source>
+ <translation type="unfinished">Konsole zurücksetzen</translation>
+ </message>
+ <message>
+ <source>In:</source>
+ <translation type="unfinished">Ein:</translation>
+ </message>
+ <message>
+ <source>Out:</source>
+ <translation type="unfinished">Aus:</translation>
+ </message>
+ <message>
+ <source>Inbound: initiated by peer</source>
+ <extracomment>Explanatory text for an inbound peer connection.</extracomment>
+ <translation type="unfinished">Eingehend: wurde von Gegenstelle initiiert</translation>
+ </message>
+ <message>
+ <source>Outbound Full Relay: default</source>
+ <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
+ <translation type="unfinished">Ausgehende vollständige Weiterleitung: Standard</translation>
+ </message>
+ <message>
+ <source>Outbound Block Relay: does not relay transactions or addresses</source>
+ <extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">Ausgehende Blockweiterleitung: leitet Transaktionen und Adressen nicht weiter</translation>
+ </message>
+ <message>
+ <source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
+ <extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
+ <translation type="unfinished">Ausgehend Manuell: durch die RPC %1 oder %2/%3 Konfigurationsoptionen hinzugefügt</translation>
+ </message>
+ <message>
+ <source>Outbound Feeler: short-lived, for testing addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">Ausgehender Fühler: kurzlebig, zum Testen von Adressen</translation>
+ </message>
+ <message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Ausgehende Adressensammlung: kurzlebig, zum Anfragen von Adressen</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Erkennen: Peer könnte v1 oder v2 sein</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">V1: Unverschlüsseltes Klartext-Transportprotokoll</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 verschlüsseltes Transportprotokoll</translation>
+ </message>
+ <message>
+ <source>we selected the peer for high bandwidth relay</source>
+ <translation type="unfinished">Wir haben die Gegenstelle zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
+ </message>
+ <message>
+ <source>the peer selected us for high bandwidth relay</source>
+ <translation type="unfinished">Die Gegenstelle hat uns zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
+ </message>
+ <message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">Keine Weiterleitung mit hoher Bandbreite ausgewählt</translation>
+ </message>
+ <message>
+ <source>Ctrl++</source>
+ <extracomment>Main shortcut to increase the RPC console font size.</extracomment>
+ <translation type="unfinished">Strg++</translation>
+ </message>
+ <message>
+ <source>Ctrl+=</source>
+ <extracomment>Secondary shortcut to increase the RPC console font size.</extracomment>
+ <translation type="unfinished">Strg+=</translation>
+ </message>
+ <message>
+ <source>Ctrl+-</source>
+ <extracomment>Main shortcut to decrease the RPC console font size.</extracomment>
+ <translation type="unfinished">Strg+-</translation>
+ </message>
+ <message>
+ <source>Ctrl+_</source>
+ <extracomment>Secondary shortcut to decrease the RPC console font size.</extracomment>
+ <translation type="unfinished">Strg+_</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <extracomment>Context menu action to copy the address of a peer.</extracomment>
+ <translation type="unfinished">&amp;Adresse kopieren</translation>
+ </message>
+ <message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">&amp;Trennen</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation type="unfinished">1 &amp;Stunde</translation>
+ </message>
+ <message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 T&amp;ag</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 &amp;Woche</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 &amp;Jahr</translation>
+ </message>
+ <message>
+ <source>&amp;Copy IP/Netmask</source>
+ <extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
+ <translation type="unfinished">&amp;Kopiere IP/Netzmaske</translation>
+ </message>
+ <message>
+ <source>&amp;Unban</source>
+ <translation type="unfinished">&amp;Entsperren</translation>
+ </message>
+ <message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">Netzwerkaktivität deaktiviert</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">Befehl wird ohne spezifizierte Wallet ausgeführt</translation>
+ </message>
+ <message>
+ <source>Ctrl+I</source>
+ <translation type="unfinished">Strg+I</translation>
+ </message>
+ <message>
+ <source>Ctrl+T</source>
+ <translation type="unfinished">Strg+T</translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation type="unfinished">Strg+N</translation>
+ </message>
+ <message>
+ <source>Ctrl+P</source>
+ <translation type="unfinished">Strg+P</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Node-Fenster - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">Befehl wird mit Wallet "%1" ausgeführt</translation>
+ </message>
+ <message>
+ <source>Welcome to the %1 RPC console.
+Use up and down arrows to navigate history, and %2 to clear screen.
+Use %3 and %4 to increase or decrease the font size.
+Type %5 for an overview of available commands.
+For more information on using this console, type %6.
+
+%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
+ <extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
+ <translation type="unfinished">Willkommen bei der %1 RPC Konsole.
+Benutze die Auf/Ab Pfeiltasten, um durch die Historie zu navigieren, und %2, um den Bildschirm zu löschen.
+Benutze %3 und %4, um die Fontgröße zu vergrößern bzw. verkleinern.
+Tippe %5 für einen Überblick über verfügbare Befehle.
+Für weitere Informationen über diese Konsole, tippe %6.
+
+%7 ACHTUNG: Es sind Betrüger zu Gange, die Benutzer anweisen, hier Kommandos einzugeben, wodurch sie den Inhalt der Wallet stehlen können. Benutze diese Konsole nicht, ohne die Implikationen eines Kommandos vollständig zu verstehen.%8</translation>
+ </message>
+ <message>
+ <source>Executing…</source>
+ <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
+ <translation type="unfinished">Ausführen…</translation>
+ </message>
+ <message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(Gegenstelle: %1)</translation>
+ </message>
+ <message>
+ <source>via %1</source>
+ <translation type="unfinished">über %1</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation type="unfinished">Ja</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation type="unfinished">Nein</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">An</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">Von</translation>
+ </message>
+ <message>
+ <source>Ban for</source>
+ <translation type="unfinished">Sperren für</translation>
+ </message>
+ <message>
+ <source>Never</source>
+ <translation type="unfinished">Nie</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation type="unfinished">Unbekannt</translation>
+ </message>
+</context>
+<context>
+ <name>ReceiveCoinsDialog</name>
+ <message>
+ <source>&amp;Amount:</source>
+ <translation type="unfinished">&amp;Betrag:</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">&amp;Bezeichnung:</translation>
+ </message>
+ <message>
+ <source>&amp;Message:</source>
+ <translation type="unfinished">&amp;Nachricht:</translation>
+ </message>
+ <message>
+ <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
+ <translation type="unfinished">Eine optionale Nachricht, die an die Zahlungsanforderung angehängt wird. Sie wird angezeigt, wenn die Anforderung geöffnet wird. Hinweis: Diese Nachricht wird nicht mit der Zahlung über das Bitcoin-Netzwerk gesendet.</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">Eine optionale Bezeichnung, die der neuen Empfangsadresse zugeordnet wird.</translation>
+ </message>
+ <message>
+ <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
+ <translation type="unfinished">Verwenden Sie dieses Formular, um Zahlungen anzufordern. Alle Felder sind &lt;b&gt;optional&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
+ <translation type="unfinished">Ein optional angeforderter Betrag. Lassen Sie dieses Feld leer oder setzen Sie es auf 0, um keinen spezifischen Betrag anzufordern.</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
+ <translation type="unfinished">Ein optionales Etikett zu einer neuen Empfängeradresse (für dich zum Identifizieren einer Rechnung). Es wird auch der Zahlungsanforderung beigefügt.</translation>
+ </message>
+ <message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">Eine optionale Nachricht, die der Zahlungsanforderung beigefügt wird und dem Absender angezeigt werden kann.</translation>
+ </message>
+ <message>
+ <source>&amp;Create new receiving address</source>
+ <translation type="unfinished">&amp;Neue Empfangsadresse erstellen</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">Alle Formularfelder zurücksetzen.</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">Zurücksetzen</translation>
+ </message>
+ <message>
+ <source>Requested payments history</source>
+ <translation type="unfinished">Verlauf der angeforderten Zahlungen</translation>
+ </message>
+ <message>
+ <source>Show the selected request (does the same as double clicking an entry)</source>
+ <translation type="unfinished">Ausgewählte Zahlungsanforderungen anzeigen (entspricht einem Doppelklick auf einen Eintrag)</translation>
+ </message>
+ <message>
+ <source>Show</source>
+ <translation type="unfinished">Anzeigen</translation>
+ </message>
+ <message>
+ <source>Remove the selected entries from the list</source>
+ <translation type="unfinished">Ausgewählte Einträge aus der Liste entfernen</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished">Entfernen</translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation type="unfinished">&amp;URI kopieren</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Adresse kopieren</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">&amp;Bezeichnung kopieren</translation>
+ </message>
+ <message>
+ <source>Copy &amp;message</source>
+ <translation type="unfinished">&amp;Nachricht kopieren</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">&amp;Betrag kopieren</translation>
+ </message>
+ <message>
+ <source>Not recommended due to higher fees and less protection against typos.</source>
+ <translation type="unfinished">Nicht zu empfehlen aufgrund höherer Gebühren und geringerem Schutz vor Tippfehlern.</translation>
+ </message>
+ <message>
+ <source>Generates an address compatible with older wallets.</source>
+ <translation type="unfinished">Generiert eine Adresse, die mit älteren Wallets kompatibel ist.</translation>
+ </message>
+ <message>
+ <source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
+ <translation type="unfinished">Generiert eine native Segwit-Adresse (BIP-173). Einige alte Wallets unterstützen es nicht.</translation>
+ </message>
+ <message>
+ <source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
+ <translation type="unfinished">Bech32m (BIP-350) ist ein Upgrade auf Bech32, Wallet-Unterstützung ist immer noch eingeschränkt.</translation>
+ </message>
+ <message>
+ <source>Could not unlock wallet.</source>
+ <translation type="unfinished">Wallet konnte nicht entsperrt werden.</translation>
+ </message>
+ <message>
+ <source>Could not generate new %1 address</source>
+ <translation type="unfinished">Konnte neue %1 Adresse nicht erzeugen.</translation>
+ </message>
+</context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ <message>
+ <source>Request payment to …</source>
+ <translation type="unfinished">Zahlung anfordern an ...</translation>
+ </message>
+ <message>
+ <source>Address:</source>
+ <translation type="unfinished">Adresse:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Betrag:</translation>
+ </message>
+ <message>
+ <source>Label:</source>
+ <translation type="unfinished">Bezeichnung:</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">Nachricht:</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Wallet: </translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation type="unfinished">&amp;URI kopieren</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Address</source>
+ <translation type="unfinished">&amp;Adresse kopieren</translation>
+ </message>
+ <message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">&amp;Überprüfen</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">Verifizieren Sie diese Adresse z.B. auf dem Display Ihres Hardware-Wallets</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Bild speichern...</translation>
+ </message>
+ <message>
+ <source>Payment information</source>
+ <translation type="unfinished">Zahlungsinformationen</translation>
+ </message>
+ <message>
+ <source>Request payment to %1</source>
+ <translation type="unfinished">Zahlung anfordern an %1</translation>
+ </message>
+</context>
+<context>
+ <name>RecentRequestsTableModel</name>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">Datum</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Bezeichnung</translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished">Nachricht</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(keine Bezeichnung)</translation>
+ </message>
+ <message>
+ <source>(no message)</source>
+ <translation type="unfinished">(keine Nachricht)</translation>
+ </message>
+ <message>
+ <source>(no amount requested)</source>
+ <translation type="unfinished">(kein Betrag angefordert)</translation>
+ </message>
+ <message>
+ <source>Requested</source>
+ <translation type="unfinished">Angefordert</translation>
+ </message>
+</context>
<context>
<name>SendCoinsDialog</name>
+ <message>
+ <source>Send Coins</source>
+ <translation type="unfinished">Bitcoins überweisen</translation>
+ </message>
+ <message>
+ <source>Coin Control Features</source>
+ <translation type="unfinished">"Coin Control"-Funktionen</translation>
+ </message>
+ <message>
+ <source>automatically selected</source>
+ <translation type="unfinished">automatisch ausgewählt</translation>
+ </message>
+ <message>
+ <source>Insufficient funds!</source>
+ <translation type="unfinished">Unzureichender Kontostand!</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">Anzahl:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Betrag:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">Gebühr:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">Abzüglich Gebühr:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">Wechselgeld:</translation>
+ </message>
+ <message>
+ <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
+ <translation type="unfinished">Wenn dies aktiviert ist, aber die Wechselgeld-Adresse leer oder ungültig ist, wird das Wechselgeld an eine neu generierte Adresse gesendet.</translation>
+ </message>
+ <message>
+ <source>Custom change address</source>
+ <translation type="unfinished">Benutzerdefinierte Wechselgeld-Adresse</translation>
+ </message>
+ <message>
+ <source>Transaction Fee:</source>
+ <translation type="unfinished">Transaktionsgebühr:</translation>
+ </message>
+ <message>
+ <source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
+ <translation type="unfinished">Die Verwendung der "fallbackfee" kann dazu führen, dass eine gesendete Transaktion erst nach mehreren Stunden oder Tagen (oder nie) bestätigt wird. Erwägen Sie, Ihre Gebühr manuell auszuwählen oder warten Sie, bis Sie die gesamte Chain validiert haben.</translation>
+ </message>
+ <message>
+ <source>Warning: Fee estimation is currently not possible.</source>
+ <translation type="unfinished">Achtung: Berechnung der Gebühr ist momentan nicht möglich.</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">pro Kilobyte</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">Ausblenden</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation type="unfinished">Empfehlungen:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation type="unfinished">Benutzerdefiniert:</translation>
+ </message>
+ <message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">An mehrere Empfänger auf einmal überweisen</translation>
+ </message>
+ <message>
+ <source>Add &amp;Recipient</source>
+ <translation type="unfinished">Empfänger &amp;hinzufügen</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">Alle Formularfelder zurücksetzen.</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">Eingaben...</translation>
+ </message>
+ <message>
+ <source>Choose…</source>
+ <translation type="unfinished">Auswählen...</translation>
+ </message>
+ <message>
+ <source>Hide transaction fee settings</source>
+ <translation type="unfinished">Einstellungen für Transaktionsgebühr nicht anzeigen</translation>
+ </message>
+ <message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">Gib manuell eine Gebühr pro kB (1.000 Bytes) der virtuellen Transaktionsgröße an.
+
+Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebührenrate von "100 Satoshis per kvB" für eine Transaktion von 500 virtuellen Bytes (die Hälfte von 1 kvB) letztlich zu einer Gebühr von nur 50 Satoshis.</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">Nur die minimale Gebühr zu bezahlen ist so lange in Ordnung, wie weniger Transaktionsvolumen als Platz in den Blöcken vorhanden ist. Aber Vorsicht, diese Option kann dazu führen, dass Transaktionen nicht bestätigt werden, wenn mehr Bedarf an Bitcoin-Transaktionen besteht als das Netzwerk verarbeiten kann.</translation>
+ </message>
+ <message>
+ <source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
+ <translation type="unfinished">Eine niedrige Gebühr kann dazu führen das eine Transaktion niemals bestätigt wird (Lesen sie die Anmerkung).</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(Intelligente Gebühr noch nicht initialisiert. Das dauert normalerweise ein paar Blocks…)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">Bestätigungsziel:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">Aktiviere Replace-By-Fee</translation>
+ </message>
+ <message>
+ <source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
+ <translation type="unfinished">Mit Replace-By-Fee (BIP-125) kann die Transaktionsgebühr nach dem Senden erhöht werden. Ohne dies wird eine höhere Gebühr empfohlen, um das Risiko einer hohen Transaktionszeit zu reduzieren.</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">&amp;Zurücksetzen</translation>
+ </message>
+ <message>
+ <source>Balance:</source>
+ <translation type="unfinished">Kontostand:</translation>
+ </message>
+ <message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">Überweisung bestätigen</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">&amp;Überweisen</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">Anzahl kopieren</translation>
+ </message>
+ <message>
+ <source>Copy amount</source>
+ <translation type="unfinished">Betrag kopieren</translation>
+ </message>
+ <message>
+ <source>Copy fee</source>
+ <translation type="unfinished">Gebühr kopieren</translation>
+ </message>
+ <message>
+ <source>Copy after fee</source>
+ <translation type="unfinished">Abzüglich Gebühr kopieren</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation type="unfinished">Bytes kopieren</translation>
+ </message>
+ <message>
+ <source>Copy change</source>
+ <translation type="unfinished">Wechselgeld kopieren</translation>
+ </message>
+ <message>
+ <source>%1 (%2 blocks)</source>
+ <translation type="unfinished">%1 (%2 Blöcke)</translation>
+ </message>
+ <message>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">Gerät anmelden</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">Verbinden Sie zunächst Ihre Hardware-Wallet</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Pfad für externes Signierskript in Optionen festlegen -&gt; Wallet</translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">Unsigniert &amp;erzeugen</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">Erzeugt eine teilsignierte Bitcoin Transaktion (PSBT) zur Benutzung mit z.B. einem Offline %1 Wallet, oder einem kompatiblen Hardware Wallet.</translation>
+ </message>
+ <message>
+ <source>%1 to '%2'</source>
+ <translation type="unfinished">%1 an '%2'</translation>
+ </message>
+ <message>
+ <source>%1 to %2</source>
+ <translation type="unfinished">%1 an %2</translation>
+ </message>
+ <message>
+ <source>To review recipient list click "Show Details…"</source>
+ <translation type="unfinished">Um die Empfängerliste zu sehen, klicke auf "Zeige Details…"</translation>
+ </message>
+ <message>
+ <source>Sign failed</source>
+ <translation type="unfinished">Signierung der Nachricht fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>External signer not found</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Es konnte kein externes Gerät zum signieren gefunden werden</translation>
+ </message>
+ <message>
+ <source>External signer failure</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Signierung durch externes Gerät fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">Speichere Transaktionsdaten</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">Teilweise signierte Transaktion (binär)</translation>
+ </message>
+ <message>
+ <source>PSBT saved</source>
+ <extracomment>Popup message when a PSBT has been saved to a file</extracomment>
+ <translation type="unfinished">PSBT gespeichert</translation>
+ </message>
+ <message>
+ <source>External balance:</source>
+ <translation type="unfinished">Externe Bilanz:</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">oder</translation>
+ </message>
+ <message>
+ <source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
+ <translation type="unfinished">Sie können die Gebühr später erhöhen (signalisiert Replace-By-Fee, BIP-125).</translation>
+ </message>
+ <message>
+ <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
+ <translation type="unfinished">Überprüfen Sie bitte Ihr Transaktionsvorhaben. Dadurch wird eine Partiell Signierte Bitcoin-Transaktion (PSBT) erstellt, die Sie speichern oder kopieren und dann z. B. mit einer Offline-Wallet %1 oder einer PSBT-kompatible Hardware-Wallet nutzen können.</translation>
+ </message>
+ <message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 von Wallet '%2'</translation>
+ </message>
+ <message>
+ <source>Do you want to create this transaction?</source>
+ <extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
+ <translation type="unfinished">Möchtest du diese Transaktion erstellen?</translation>
+ </message>
+ <message>
+ <source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
+ <translation type="unfinished">Bitte überprüfen Sie Ihre Transaktion. Sie können diese Transaktion erstellen und versenden oder eine Partiell Signierte Bitcoin Transaction (PSBT) erstellen, die Sie speichern oder kopieren und dann z.B. mit einer offline %1 Wallet oder einer PSBT-kompatiblen Hardware-Wallet signieren können.</translation>
+ </message>
+ <message>
+ <source>Please, review your transaction.</source>
+ <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
+ <translation type="unfinished">Bitte überprüfen sie ihre Transaktion.</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">Transaktionsgebühr</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">Replace-By-Fee, BIP-125 wird nicht angezeigt.</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">Gesamtbetrag</translation>
+ </message>
+ <message>
+ <source>Unsigned Transaction</source>
+ <comment>PSBT copied</comment>
+ <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
+ <translation type="unfinished">Unsignierte Transaktion</translation>
+ </message>
+ <message>
+ <source>The PSBT has been copied to the clipboard. You can also save it.</source>
+ <translation type="unfinished">Die PSBT wurde in die Zwischenablage kopiert. Kann auch abgespeichert werden.</translation>
+ </message>
+ <message>
+ <source>PSBT saved to disk</source>
+ <translation type="unfinished">PSBT auf Festplatte gespeichert</translation>
+ </message>
+ <message>
+ <source>Confirm send coins</source>
+ <translation type="unfinished">Überweisung bestätigen</translation>
+ </message>
+ <message>
+ <source>Watch-only balance:</source>
+ <translation type="unfinished">Nur-Anzeige Saldo:</translation>
+ </message>
+ <message>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation type="unfinished">Die Zahlungsadresse ist ungültig, bitte nochmals überprüfen.</translation>
+ </message>
+ <message>
+ <source>The amount to pay must be larger than 0.</source>
+ <translation type="unfinished">Der zu zahlende Betrag muss größer als 0 sein.</translation>
+ </message>
+ <message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">Der angegebene Betrag übersteigt Ihren Kontostand.</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">Der angegebene Betrag übersteigt aufgrund der Transaktionsgebühr in Höhe von %1 Ihren Kontostand.</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">Doppelte Adresse entdeckt: Adressen sollten jeweils nur einmal benutzt werden.</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">Transaktionserstellung fehlgeschlagen!</translation>
+ </message>
+ <message>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation type="unfinished">Eine höhere Gebühr als %1 wird als unsinnig hohe Gebühr angesehen.</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
- <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Voraussichtlicher Beginn der Bestätigung innerhalb von %n Block</numerusform>
+ <numerusform>Voraussichtlicher Beginn der Bestätigung innerhalb von %n Blöcken</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>Warning: Invalid Bitcoin address</source>
+ <translation type="unfinished">Warnung: Ungültige Bitcoin-Adresse</translation>
+ </message>
+ <message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">Warnung: Unbekannte Wechselgeld-Adresse</translation>
+ </message>
+ <message>
+ <source>Confirm custom change address</source>
+ <translation type="unfinished">Bestätige benutzerdefinierte Wechselgeld-Adresse</translation>
+ </message>
+ <message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">Die ausgewählte Wechselgeld-Adresse ist nicht Bestandteil dieses Wallets. Einige oder alle Mittel aus Ihrem Wallet könnten an diese Adresse gesendet werden. Wollen Sie das wirklich?</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(keine Bezeichnung)</translation>
+ </message>
+</context>
+<context>
+ <name>SendCoinsEntry</name>
+ <message>
+ <source>A&amp;mount:</source>
+ <translation type="unfinished">Betra&amp;g:</translation>
+ </message>
+ <message>
+ <source>Pay &amp;To:</source>
+ <translation type="unfinished">E&amp;mpfänger:</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">&amp;Bezeichnung:</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">Bereits verwendete Adresse auswählen</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation type="unfinished">Die Zahlungsadresse der Überweisung</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">Adresse aus der Zwischenablage einfügen</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">Diesen Eintrag entfernen</translation>
+ </message>
+ <message>
+ <source>The amount to send in the selected unit</source>
+ <translation type="unfinished">Zu sendender Betrag in der ausgewählten Einheit</translation>
+ </message>
+ <message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">Die Gebühr wird vom zu überweisenden Betrag abgezogen. Der Empfänger wird also weniger Bitcoins erhalten, als Sie im Betrags-Feld eingegeben haben. Falls mehrere Empfänger ausgewählt wurden, wird die Gebühr gleichmäßig verteilt.</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation type="unfinished">Gebühr vom Betrag ab&amp;ziehen</translation>
+ </message>
+ <message>
+ <source>Use available balance</source>
+ <translation type="unfinished">Benutze verfügbaren Kontostand</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">Nachricht:</translation>
+ </message>
+ <message>
+ <source>Enter a label for this address to add it to the list of used addresses</source>
+ <translation type="unfinished">Bezeichnung für diese Adresse eingeben, um sie zur Liste bereits verwendeter Adressen hinzuzufügen.</translation>
+ </message>
+ <message>
+ <source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
+ <translation type="unfinished">Eine an die "bitcoin:"-URI angefügte Nachricht, die zusammen mit der Transaktion gespeichert wird. Hinweis: Diese Nachricht wird nicht über das Bitcoin-Netzwerk gesendet.</translation>
+ </message>
+</context>
+<context>
+ <name>SendConfirmationDialog</name>
+ <message>
+ <source>Send</source>
+ <translation type="unfinished">Senden</translation>
+ </message>
+ <message>
+ <source>Create Unsigned</source>
+ <translation type="unfinished">Unsigniert erstellen</translation>
+ </message>
+</context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>Signatures - Sign / Verify a Message</source>
+ <translation type="unfinished">Signaturen - eine Nachricht signieren / verifizieren</translation>
+ </message>
+ <message>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">Nachricht &amp;signieren</translation>
+ </message>
+ <message>
+ <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Sie können Nachrichten/Vereinbarungen mit Hilfe Ihrer Adressen signieren, um zu beweisen, dass Sie Bitcoins empfangen können, die an diese Adressen überwiesen werden. Seien Sie vorsichtig und signieren Sie nichts Vages oder Willkürliches, um Ihre Indentität vor Phishingangriffen zu schützen. Signieren Sie nur vollständig-detaillierte Aussagen, mit denen Sie auch einverstanden sind.</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">Die Bitcoin-Adresse, mit der die Nachricht signiert wird</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">Bereits verwendete Adresse auswählen</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">Adresse aus der Zwischenablage einfügen</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">Zu signierende Nachricht hier eingeben</translation>
+ </message>
+ <message>
+ <source>Signature</source>
+ <translation type="unfinished">Signatur</translation>
+ </message>
+ <message>
+ <source>Copy the current signature to the system clipboard</source>
+ <translation type="unfinished">Aktuelle Signatur in die Zwischenablage kopieren</translation>
+ </message>
+ <message>
+ <source>Sign the message to prove you own this Bitcoin address</source>
+ <translation type="unfinished">Die Nachricht signieren, um den Besitz dieser Bitcoin-Adresse zu beweisen</translation>
+ </message>
+ <message>
+ <source>Sign &amp;Message</source>
+ <translation type="unfinished">&amp;Nachricht signieren</translation>
+ </message>
+ <message>
+ <source>Reset all sign message fields</source>
+ <translation type="unfinished">Alle "Nachricht signieren"-Felder zurücksetzen</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">&amp;Zurücksetzen</translation>
+ </message>
+ <message>
+ <source>&amp;Verify Message</source>
+ <translation type="unfinished">Nachricht &amp;verifizieren</translation>
+ </message>
+ <message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">Geben Sie die Zahlungsadresse des Empfängers, Nachricht (achten Sie darauf Zeilenumbrüche, Leerzeichen, Tabulatoren usw. exakt zu kopieren) und Signatur unten ein, um die Nachricht zu verifizieren. Vorsicht, interpretieren Sie nicht mehr in die Signatur hinein, als in der signierten Nachricht selber enthalten ist, um nicht von einem Man-in-the-middle-Angriff hinters Licht geführt zu werden. Beachten Sie, dass dies nur beweist, dass die signierende Partei über diese Adresse Überweisungen empfangen kann.</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address the message was signed with</source>
+ <translation type="unfinished">Die Bitcoin-Adresse, mit der die Nachricht signiert wurde</translation>
+ </message>
+ <message>
+ <source>The signed message to verify</source>
+ <translation type="unfinished">Die zu überprüfende signierte Nachricht</translation>
+ </message>
+ <message>
+ <source>The signature given when the message was signed</source>
+ <translation type="unfinished">Die beim Signieren der Nachricht geleistete Signatur</translation>
+ </message>
+ <message>
+ <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
+ <translation type="unfinished">Die Nachricht verifizieren, um sicherzustellen, dass diese mit der angegebenen Bitcoin-Adresse signiert wurde</translation>
+ </message>
+ <message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">&amp;Nachricht verifizieren</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">Alle "Nachricht verifizieren"-Felder zurücksetzen</translation>
+ </message>
+ <message>
+ <source>Click "Sign Message" to generate signature</source>
+ <translation type="unfinished">Auf "Nachricht signieren" klicken, um die Signatur zu erzeugen</translation>
+ </message>
+ <message>
+ <source>The entered address is invalid.</source>
+ <translation type="unfinished">Die eingegebene Adresse ist ungültig.</translation>
+ </message>
+ <message>
+ <source>Please check the address and try again.</source>
+ <translation type="unfinished">Bitte überprüfen Sie die Adresse und versuchen Sie es erneut.</translation>
+ </message>
+ <message>
+ <source>The entered address does not refer to a key.</source>
+ <translation type="unfinished">Die eingegebene Adresse verweist nicht auf einen Schlüssel.</translation>
+ </message>
+ <message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">Wallet-Entsperrung wurde abgebrochen.</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation type="unfinished">Kein Fehler</translation>
+ </message>
+ <message>
+ <source>Private key for the entered address is not available.</source>
+ <translation type="unfinished">Privater Schlüssel zur eingegebenen Adresse ist nicht verfügbar.</translation>
+ </message>
+ <message>
+ <source>Message signing failed.</source>
+ <translation type="unfinished">Signierung der Nachricht fehlgeschlagen.</translation>
+ </message>
+ <message>
+ <source>Message signed.</source>
+ <translation type="unfinished">Nachricht signiert.</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">Die Signatur konnte nicht dekodiert werden.</translation>
+ </message>
+ <message>
+ <source>Please check the signature and try again.</source>
+ <translation type="unfinished">Bitte überprüfen Sie die Signatur und versuchen Sie es erneut.</translation>
+ </message>
+ <message>
+ <source>The signature did not match the message digest.</source>
+ <translation type="unfinished">Die Signatur entspricht nicht dem "Message Digest".</translation>
+ </message>
+ <message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">Verifizierung der Nachricht fehlgeschlagen.</translation>
+ </message>
+ <message>
+ <source>Message verified.</source>
+ <translation type="unfinished">Nachricht verifiziert.</translation>
+ </message>
+</context>
+<context>
+ <name>SplashScreen</name>
+ <message>
+ <source>(press q to shutdown and continue later)</source>
+ <translation type="unfinished">(drücke q, um herunterzufahren und später fortzuführen)</translation>
+ </message>
+ <message>
+ <source>press q to shutdown</source>
+ <translation type="unfinished">q zum Herunterfahren drücken</translation>
+ </message>
+</context>
<context>
<name>TransactionDesc</name>
+ <message>
+ <source>conflicted with a transaction with %1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
+ <translation type="unfinished">steht im Konflikt mit einer Transaktion mit %1 Bestätigungen</translation>
+ </message>
+ <message>
+ <source>0/unconfirmed, in memory pool</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
+ <translation type="unfinished">0/unbestätigt, im Speicherpool</translation>
+ </message>
+ <message>
+ <source>0/unconfirmed, not in memory pool</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
+ <translation type="unfinished">0/unbestätigt, nicht im Speicherpool</translation>
+ </message>
+ <message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">eingestellt</translation>
+ </message>
+ <message>
+ <source>%1/unconfirmed</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
+ <translation type="unfinished">%1/unbestätigt</translation>
+ </message>
+ <message>
+ <source>%1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
+ <translation type="unfinished">%1 Bestätigungen</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">Datum</translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished">Quelle</translation>
+ </message>
+ <message>
+ <source>Generated</source>
+ <translation type="unfinished">Erzeugt</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">Von</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">unbekannt</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">An</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">eigene Adresse</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">beobachtet</translation>
+ </message>
+ <message>
+ <source>label</source>
+ <translation type="unfinished">Bezeichnung</translation>
+ </message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">Gutschrift</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>matures in %n more block(s)</numerusform>
- <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>reift noch %n weiteren Block</numerusform>
+ <numerusform>reift noch %n weitere Blöcken</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>not accepted</source>
+ <translation type="unfinished">nicht angenommen</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">Belastung</translation>
+ </message>
+ <message>
+ <source>Total debit</source>
+ <translation type="unfinished">Gesamtbelastung</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation type="unfinished">Gesamtgutschrift</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">Transaktionsgebühr</translation>
+ </message>
+ <message>
+ <source>Net amount</source>
+ <translation type="unfinished">Nettobetrag</translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished">Nachricht</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">Kommentar</translation>
+ </message>
+ <message>
+ <source>Transaction ID</source>
+ <translation type="unfinished">Transaktionskennung</translation>
+ </message>
+ <message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">Gesamte Transaktionsgröße</translation>
+ </message>
+ <message>
+ <source>Transaction virtual size</source>
+ <translation type="unfinished">Virtuelle Größe der Transaktion</translation>
+ </message>
+ <message>
+ <source>Output index</source>
+ <translation type="unfinished">Ausgabeindex</translation>
+ </message>
+ <message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Zertifikat wurde nicht verifiziert)</translation>
+ </message>
+ <message>
+ <source>Merchant</source>
+ <translation type="unfinished">Händler</translation>
+ </message>
+ <message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">Erzeugte Bitcoins müssen %1 Blöcke lang reifen, bevor sie ausgegeben werden können. Als Sie diesen Block erzeugten, wurde er an das Netzwerk übertragen, um ihn der Blockchain hinzuzufügen. Falls dies fehlschlägt wird der Status in "nicht angenommen" geändert und Sie werden keine Bitcoins gutgeschrieben bekommen. Das kann gelegentlich passieren, wenn ein anderer Knoten einen Block fast zeitgleich erzeugt.</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">Debug-Informationen</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">Transaktion</translation>
+ </message>
+ <message>
+ <source>Inputs</source>
+ <translation type="unfinished">Eingaben</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">Betrag</translation>
+ </message>
+ <message>
+ <source>true</source>
+ <translation type="unfinished">wahr</translation>
+ </message>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">falsch</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionDescDialog</name>
+ <message>
+ <source>This pane shows a detailed description of the transaction</source>
+ <translation type="unfinished">Dieser Bereich zeigt eine detaillierte Beschreibung der Transaktion an</translation>
+ </message>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">Details für %1</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">Datum</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Typ</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Bezeichnung</translation>
+ </message>
+ <message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">Unbestätigt</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">Eingestellt</translation>
+ </message>
+ <message>
+ <source>Confirming (%1 of %2 recommended confirmations)</source>
+ <translation type="unfinished">Wird bestätigt (%1 von %2 empfohlenen Bestätigungen)</translation>
+ </message>
+ <message>
+ <source>Confirmed (%1 confirmations)</source>
+ <translation type="unfinished">Bestätigt (%1 Bestätigungen)</translation>
+ </message>
+ <message>
+ <source>Conflicted</source>
+ <translation type="unfinished">in Konflikt stehend</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">Unreif (%1 Bestätigungen, wird verfügbar sein nach %2)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">Generiert, aber nicht akzeptiert</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">Empfangen über</translation>
+ </message>
+ <message>
+ <source>Received from</source>
+ <translation type="unfinished">Empfangen von</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">Überwiesen an</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">Erarbeitet</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">beobachtet</translation>
+ </message>
+ <message>
+ <source>(n/a)</source>
+ <translation type="unfinished">(k.A.)</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(keine Bezeichnung)</translation>
+ </message>
+ <message>
+ <source>Transaction status. Hover over this field to show number of confirmations.</source>
+ <translation type="unfinished">Transaktionsstatus. Fahren Sie mit der Maus über dieses Feld, um die Anzahl der Bestätigungen zu sehen.</translation>
+ </message>
+ <message>
+ <source>Date and time that the transaction was received.</source>
+ <translation type="unfinished">Datum und Zeit als die Transaktion empfangen wurde.</translation>
+ </message>
+ <message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">Art der Transaktion</translation>
+ </message>
+ <message>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation type="unfinished">Zeigt an, ob eine beobachtete Adresse in diese Transaktion involviert ist.</translation>
+ </message>
+ <message>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation type="unfinished">Benutzerdefinierter Verwendungszweck der Transaktion</translation>
+ </message>
+ <message>
+ <source>Amount removed from or added to balance.</source>
+ <translation type="unfinished">Der Betrag, der dem Kontostand abgezogen oder hinzugefügt wurde.</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionView</name>
+ <message>
+ <source>All</source>
+ <translation type="unfinished">Alle</translation>
+ </message>
+ <message>
+ <source>Today</source>
+ <translation type="unfinished">Heute</translation>
+ </message>
+ <message>
+ <source>This week</source>
+ <translation type="unfinished">Diese Woche</translation>
+ </message>
+ <message>
+ <source>This month</source>
+ <translation type="unfinished">Diesen Monat</translation>
+ </message>
+ <message>
+ <source>Last month</source>
+ <translation type="unfinished">Letzten Monat</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">Dieses Jahr</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">Empfangen über</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">Überwiesen an</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">Erarbeitet</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation type="unfinished">Andere</translation>
+ </message>
+ <message>
+ <source>Enter address, transaction id, or label to search</source>
+ <translation type="unfinished">Zu suchende Adresse, Transaktion oder Bezeichnung eingeben</translation>
+ </message>
+ <message>
+ <source>Min amount</source>
+ <translation type="unfinished">Mindestbetrag</translation>
+ </message>
+ <message>
+ <source>Range…</source>
+ <translation type="unfinished">Bereich…</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Adresse kopieren</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">&amp;Bezeichnung kopieren</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">&amp;Betrag kopieren</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID</source>
+ <translation type="unfinished">Transaktionskennung kopieren</translation>
+ </message>
+ <message>
+ <source>Copy &amp;raw transaction</source>
+ <translation type="unfinished">&amp;Rohdaten der Transaktion kopieren</translation>
+ </message>
+ <message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">Vollständige Transaktions&amp;details kopieren</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">Transaktionsdetails &amp;anzeigen</translation>
+ </message>
+ <message>
+ <source>Increase transaction &amp;fee</source>
+ <translation type="unfinished">Transaktions&amp;gebühr erhöhen</translation>
+ </message>
+ <message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">Transaktion a&amp;bbrechen</translation>
+ </message>
+ <message>
+ <source>&amp;Edit address label</source>
+ <translation type="unfinished">Adressbezeichnung &amp;bearbeiten</translation>
+ </message>
+ <message>
+ <source>Show in %1</source>
+ <extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
+ <translation type="unfinished">Zeige in %1</translation>
+ </message>
+ <message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">Transaktionsverlauf exportieren</translation>
+ </message>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">Durch Komma getrennte Datei</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">Bestätigt</translation>
+ </message>
+ <message>
+ <source>Watch-only</source>
+ <translation type="unfinished">Nur beobachten</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">Datum</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Typ</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Bezeichnung</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Adresse</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Exportieren fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the transaction history to %1.</source>
+ <translation type="unfinished">Beim Speichern des Transaktionsverlaufs nach %1 ist ein Fehler aufgetreten.</translation>
+ </message>
+ <message>
+ <source>Exporting Successful</source>
+ <translation type="unfinished">Exportieren erfolgreich</translation>
+ </message>
+ <message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation type="unfinished">Speichern des Transaktionsverlaufs nach %1 war erfolgreich.</translation>
+ </message>
+ <message>
+ <source>Range:</source>
+ <translation type="unfinished">Zeitraum:</translation>
+ </message>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">bis</translation>
+ </message>
+</context>
+<context>
+ <name>WalletFrame</name>
+ <message>
+ <source>No wallet has been loaded.
+Go to File &gt; Open Wallet to load a wallet.
+- OR -</source>
+ <translation type="unfinished">Es wurde keine Wallet geladen.
+Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
+- ODER-</translation>
+ </message>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">Neues Wallet erstellen</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Fehler</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT from clipboard (invalid base64)</source>
+ <translation type="unfinished">Konnte PSBT aus Zwischenablage nicht entschlüsseln (ungültiges Base64)</translation>
+ </message>
+ <message>
+ <source>Load Transaction Data</source>
+ <translation type="unfinished">Lade Transaktionsdaten</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (*.psbt)</source>
+ <translation type="unfinished">Teilsignierte Transaktion (*.psbt)</translation>
+ </message>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT-Datei muss kleiner als 100 MiB sein</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">PSBT konnte nicht entschlüsselt werden</translation>
+ </message>
+</context>
+<context>
+ <name>WalletModel</name>
+ <message>
+ <source>Send Coins</source>
+ <translation type="unfinished">Bitcoins überweisen</translation>
+ </message>
+ <message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">Gebührenerhöhungsfehler</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">Erhöhung der Transaktionsgebühr fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Do you want to increase the fee?</source>
+ <extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
+ <translation type="unfinished">Möchten Sie die Gebühr erhöhen?</translation>
+ </message>
+ <message>
+ <source>Current fee:</source>
+ <translation type="unfinished">Aktuelle Gebühr:</translation>
+ </message>
+ <message>
+ <source>Increase:</source>
+ <translation type="unfinished">Erhöhung:</translation>
+ </message>
+ <message>
+ <source>New fee:</source>
+ <translation type="unfinished">Neue Gebühr:</translation>
+ </message>
+ <message>
+ <source>Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
+ <translation type="unfinished">Warnung: Hierdurch kann die zusätzliche Gebühr durch Verkleinerung von Wechselgeld Outputs oder nötigenfalls durch Hinzunahme weitere Inputs beglichen werden. Ein neuer Wechselgeld Output kann dabei entstehen, falls noch keiner existiert. Diese Änderungen können möglicherweise private Daten preisgeben.</translation>
+ </message>
+ <message>
+ <source>Confirm fee bump</source>
+ <translation type="unfinished">Gebührenerhöhung bestätigen</translation>
+ </message>
+ <message>
+ <source>Can't draft transaction.</source>
+ <translation type="unfinished">Kann Transaktion nicht entwerfen.</translation>
+ </message>
+ <message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT kopiert</translation>
+ </message>
+ <message>
+ <source>Copied to clipboard</source>
+ <comment>Fee-bump PSBT saved</comment>
+ <translation type="unfinished">In die Zwischenablage kopiert </translation>
+ </message>
+ <message>
+ <source>Can't sign transaction.</source>
+ <translation type="unfinished">Signierung der Transaktion fehlgeschlagen.</translation>
+ </message>
+ <message>
+ <source>Could not commit transaction</source>
+ <translation type="unfinished">Konnte Transaktion nicht übergeben</translation>
+ </message>
+ <message>
+ <source>Can't display address</source>
+ <translation type="unfinished">Die Adresse kann nicht angezeigt werden</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Standard-Wallet</translation>
+ </message>
+</context>
+<context>
+ <name>WalletView</name>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Exportieren</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Daten der aktuellen Ansicht in eine Datei exportieren</translation>
+ </message>
+ <message>
+ <source>Backup Wallet</source>
+ <translation type="unfinished">Wallet sichern</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Wallet-Daten</translation>
+ </message>
+ <message>
+ <source>Backup Failed</source>
+ <translation type="unfinished">Sicherung fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the wallet data to %1.</source>
+ <translation type="unfinished">Beim Speichern der Wallet-Daten nach %1 ist ein Fehler aufgetreten.</translation>
+ </message>
+ <message>
+ <source>Backup Successful</source>
+ <translation type="unfinished">Sicherung erfolgreich</translation>
+ </message>
+ <message>
+ <source>The wallet data was successfully saved to %1.</source>
+ <translation type="unfinished">Speichern der Wallet-Daten nach %1 war erfolgreich.</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Abbrechen</translation>
+ </message>
+</context>
+<context>
+ <name>bitcoin-core</name>
+ <message>
+ <source>The %s developers</source>
+ <translation type="unfinished">Die %s-Entwickler</translation>
+ </message>
+ <message>
+ <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
+ <translation type="unfinished">%s korrupt. Versuche mit dem Wallet-Werkzeug bitcoin-wallet zu retten, oder eine Sicherung wiederherzustellen.</translation>
+ </message>
+ <message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s konnte den -assumeutxo-Snapshot-Status nicht validieren. Dies deutet auf ein Hardwareproblem, einen Fehler in der Software oder eine fehlerhafte Softwareänderung hin, die das Laden eines ungültigen Schnappschusses ermöglichte. Infolgedessen wird der Knoten heruntergefahren und verwendet keinen Zustand mehr, der auf dem Snapshot aufgebaut wurde, wodurch die Chain Height von %d auf %d zurückgesetzt wird. Beim nächsten Neustart nimmt der Knoten die Synchronisierung ab %d ohne Verwendung von Snapshot-Daten wieder auf. Bitte melden Sie diesen Vorfall an %s und geben Sie an, wie Sie den Snapshot erhalten haben. Der ungültige Snapshot-Chainstatus wird auf der Festplatte belassen, falls er bei der Diagnose des Problems, das diesen Fehler verursacht hat, hilfreich ist.</translation>
+ </message>
+ <message>
+ <source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
+ <translation type="unfinished">%s Aufforderung, auf Port %u zu lauschen. Dieser Port wird als "schlecht" eingeschätzt und es ist daher unwahrscheinlich, dass sich Bitcoin Core Gegenstellen mit ihm verbinden. Siehe doc/p2p-bad-ports.md für Details und eine vollständige Liste.</translation>
+ </message>
+ <message>
+ <source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
+ <translation type="unfinished">Kann Wallet Version nicht von Version %i auf Version %i abstufen. Wallet Version bleibt unverändert.</translation>
+ </message>
+ <message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">Datenverzeichnis %s kann nicht gesperrt werden. Evtl. wurde %s bereits gestartet.</translation>
+ </message>
+ <message>
+ <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">Kann ein aufgespaltenes nicht-HD Wallet nicht von Version %i auf Version %i aktualisieren, ohne auf Unterstützung von Keypools vor der Aufspaltung zu aktualisieren. Bitte benutze Version%i oder keine bestimmte Version.</translation>
+ </message>
+ <message>
+ <source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
+ <translation type="unfinished">Der Speicherplatz für %s reicht möglicherweise nicht für die Block-Dateien aus. In diesem Verzeichnis werden ca. %u GB an Daten gespeichert.</translation>
+ </message>
+ <message>
+ <source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
+ <translation type="unfinished">Veröffentlicht unter der MIT-Softwarelizenz, siehe beiliegende Datei %s oder %s.</translation>
+ </message>
+ <message>
+ <source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
+ <translation type="unfinished">Fehler beim Laden der Wallet. Wallet erfordert das Herunterladen von Blöcken, und die Software unterstützt derzeit nicht das Laden von Wallets, während Blöcke außer der Reihe heruntergeladen werden, wenn assumeutxo-Snapshots verwendet werden. Die Wallet sollte erfolgreich geladen werden können, nachdem die Node-Synchronisation die Höhe %s erreicht hat.</translation>
+ </message>
+ <message>
+ <source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
+ <translation type="unfinished">Fehler beim Lesen von %s! Transaktionsdaten fehlen oder sind nicht korrekt. Wallet wird erneut gescannt.</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
+ <translation type="unfinished">Fehler: Dumpdatei Format Eintrag ist Ungültig. Habe "%s" bekommen, aber "format" erwartet.</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">Fehler: Dumpdatei Identifikationseintrag ist ungültig. Habe "%s" bekommen, aber "%s" erwartet.</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
+ <translation type="unfinished">Fehler: Die Version der Speicherauszugsdatei ist %s und wird nicht unterstützt. Diese Version von bitcoin-wallet unterstützt nur Speicherauszugsdateien der Version 1.</translation>
+ </message>
+ <message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">Fehler: Legacy Wallets unterstützen nur die Adresstypen "legacy", "p2sh-segwit" und "bech32".</translation>
+ </message>
+ <message>
+ <source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
+ <translation type="unfinished">Fehler: Es können keine Deskriptoren für diese Legacy-Wallet erstellt werden. Stellen Sie sicher, dass Sie die Passphrase der Wallet angeben, wenn diese verschlüsselt ist.</translation>
+ </message>
+ <message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">Datei %s existiert bereits. Wenn Sie das wirklich tun wollen, dann bewegen Sie zuvor die existierende Datei woanders hin.</translation>
+ </message>
+ <message>
+ <source>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>
+ <translation type="unfinished">Ungültige oder beschädigte peers.dat (%s). Wenn Sie glauben, dass dies ein Programmierfehler ist, melden Sie ihn bitte an %s. Zur Abhilfe können Sie die Datei (%s) aus dem Weg räumen (umbenennen, verschieben oder löschen), so dass beim nächsten Start eine neue Datei erstellt wird.</translation>
+ </message>
+ <message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">Mehr als eine Onion-Bindungsadresse angegeben. Verwende %s für den automatisch erstellten Tor-Onion-Dienst.</translation>
+ </message>
+ <message>
+ <source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">Keine Dumpdatei angegeben. Um createfromdump zu benutzen, muss -dumpfile=&lt;filename&gt; angegeben werden.</translation>
+ </message>
+ <message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">Keine Dumpdatei angegeben. Um dump verwenden zu können, muss -dumpfile=&lt;filename&gt; angegeben werden.</translation>
+ </message>
+ <message>
+ <source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
+ <translation type="unfinished">Kein Format der Wallet-Datei angegeben. Um createfromdump zu nutzen, muss -format=&lt;format&gt; angegeben werden.</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">Bitte korrigieren Sie die Datums- und Uhrzeiteinstellungen Ihres Computers, da %s ansonsten nicht ordnungsgemäß funktionieren wird.</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">Wenn sie %s nützlich finden, sind Helfer sehr gern gesehen. Besuchen Sie %s um mehr über das Softwareprojekt zu erfahren.</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">Prune-Modus wurde kleiner als das Minimum in Höhe von %d MiB konfiguriert. Bitte verwenden Sie einen größeren Wert.</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
+ <translation type="unfinished">Der Prune-Modus ist mit -reindex-chainstate nicht kompatibel. Verwende stattdessen den vollen -reindex.</translation>
+ </message>
+ <message>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation type="unfinished">Prune (Kürzung): Die letzte Synchronisation der Wallet liegt vor gekürzten (gelöschten) Blöcken. Es ist ein -reindex (erneuter Download der gesamten Blockchain im Fall eines gekürzten Nodes) notwendig.</translation>
+ </message>
+ <message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Umbenennung von '%s' -&gt; '%s' fehlgeschlagen. Sie sollten dieses Problem beheben, indem Sie das ungültige Snapshot-Verzeichnis %s manuell verschieben oder löschen, andernfalls wird der gleiche Fehler beim nächsten Start erneut auftreten.</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
+ <translation type="unfinished">SQLite-Datenbank: Unbekannte SQLite-Wallet-Schema-Version %d. Nur Version %d wird unterstützt.</translation>
+ </message>
+ <message>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation type="unfinished">Die Block-Datenbank enthält einen Block, der scheinbar aus der Zukunft kommt. Dies kann daran liegen, dass die Systemzeit Ihres Computers falsch eingestellt ist. Stellen Sie die Block-Datenbank erst dann wieder her, wenn Sie sich sicher sind, dass Ihre Systemzeit korrekt eingestellt ist.</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation type="unfinished">Der Transaktionsbetrag ist zu klein, um ihn nach Abzug der Gebühr zu senden.</translation>
+ </message>
+ <message>
+ <source>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>
+ <translation type="unfinished">Dieser Fehler kann auftreten, wenn diese Wallet nicht ordnungsgemäß heruntergefahren und zuletzt mithilfe eines Builds mit einer neueren Version von Berkeley DB geladen wurde. Verwenden Sie in diesem Fall die Software, die diese Wallet zuletzt geladen hat</translation>
+ </message>
+ <message>
+ <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
+ <translation type="unfinished">Dies ist eine Vorab-Testversion - Verwendung auf eigene Gefahr - nicht für Mining- oder Handelsanwendungen nutzen!</translation>
+ </message>
+ <message>
+ <source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
+ <translation type="unfinished">Dies ist die maximale Transaktionsgebühr, die Sie (zusätzlich zur normalen Gebühr) zahlen, um die Vermeidung von teilweisen Ausgaben gegenüber der regulären Münzauswahl zu priorisieren.</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you may discard if change is smaller than dust at this level</source>
+ <translation type="unfinished">Dies ist die Transaktionsgebühr, die ggf. abgeschrieben wird, wenn das Wechselgeld "Staub" ist in dieser Stufe.</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation type="unfinished">Das ist die Transaktionsgebühr, welche Sie zahlen müssten, wenn die Gebührenschätzungen nicht verfügbar sind.</translation>
+ </message>
+ <message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation type="unfinished">Gesamtlänge des Netzwerkversionstrings (%i) erreicht die maximale Länge (%i). Reduzieren Sie Anzahl oder Größe von uacomments.</translation>
+ </message>
+ <message>
+ <source>Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
+ <translation type="unfinished">Fehler beim Verarbeiten von Blöcken. Sie müssen die Datenbank mit Hilfe des Arguments '-reindex-chainstate' neu aufbauen.</translation>
+ </message>
+ <message>
+ <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
+ <translation type="unfinished">Angegebenes Format "%s" der Wallet-Datei ist unbekannt.
+Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
+ </message>
+ <message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Nicht unterstützte kategoriespezifische Protokollierungsebene %1$s=%2$s. Erwartet %1$s=&lt;category&gt;:&lt;loglevel&gt;. Gültige Kategorien: %3$s. Gültige Loglevels: %4$s.</translation>
+ </message>
+ <message>
+ <source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
+ <translation type="unfinished">Nicht unterstütztes Chainstate-Datenbankformat gefunden. Bitte starte mit -reindex-chainstate neu. Dadurch wird die Chainstate-Datenbank neu erstellt.</translation>
+ </message>
+ <message>
+ <source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
+ <translation type="unfinished">Wallet erfolgreich erstellt. Der Legacy-Wallet-Typ ist veraltet und die Unterstützung für das Erstellen und Öffnen von Legacy-Wallets wird in Zukunft entfernt.</translation>
+ </message>
+ <message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Wallet erfolgreich geladen. Der Legacy-Wallet-Typ ist veraltet und die Unterstützung für das Erstellen und Öffnen von Legacy-Wallets wird in Zukunft entfernt. Legacy-Wallets können mit migratewallet auf eine Deskriptor-Wallet migriert werden.</translation>
+ </message>
+ <message>
+ <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
+ <translation type="unfinished">Warnung: Dumpdatei Wallet Format "%s" passt nicht zum auf der Kommandozeile angegebenen Format "%s".</translation>
+ </message>
+ <message>
+ <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
+ <translation type="unfinished">Warnung: Es wurden private Schlüssel in der Wallet {%s} entdeckt, welche private Schlüssel jedoch deaktiviert hat.</translation>
+ </message>
+ <message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">Warnung: Wir scheinen nicht vollständig mit unseren Gegenstellen übereinzustimmen! Sie oder die anderen Knoten müssen unter Umständen Ihre Client-Software aktualisieren.</translation>
+ </message>
+ <message>
+ <source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
+ <translation type="unfinished">Zeugnisdaten für Blöcke nach Höhe %d müssen validiert werden. Bitte mit -reindex neu starten.</translation>
+ </message>
+ <message>
+ <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
+ <translation type="unfinished">Sie müssen die Datenbank mit Hilfe von -reindex neu aufbauen, um zum ungekürzten Modus zurückzukehren. Dies erfordert, dass die gesamte Blockchain erneut heruntergeladen wird.</translation>
+ </message>
+ <message>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation type="unfinished">-maxmempool muss mindestens %d MB betragen</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">Ein fataler interner Fehler ist aufgetreten, siehe debug.log für Details</translation>
+ </message>
+ <message>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation type="unfinished">Kann Adresse in -%s nicht auflösen: '%s'</translation>
+ </message>
+ <message>
+ <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
+ <translation type="unfinished">Kann -forcednsseed nicht auf true setzen, wenn -dnsseed auf false gesetzt ist.</translation>
+ </message>
+ <message>
+ <source>Cannot set -peerblockfilters without -blockfilterindex.</source>
+ <translation type="unfinished">Kann -peerblockfilters nicht ohne -blockfilterindex setzen.</translation>
+ </message>
+ <message>
+ <source>Cannot write to data directory '%s'; check permissions.</source>
+ <translation type="unfinished">Es konnte nicht in das Datenverzeichnis '%s' geschrieben werden; Überprüfen Sie die Berechtigungen.</translation>
+ </message>
+ <message>
+ <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">%s ist sehr hoch gesetzt! Gebühren dieser Höhe könnten für eine einzelne Transaktion gezahlt werden.</translation>
+ </message>
+ <message>
+ <source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
+ <translation type="unfinished">Es ist nicht möglich, bestimmte Verbindungen anzubieten und gleichzeitig addrman ausgehende Verbindungen finden zu lassen.</translation>
+ </message>
+ <message>
+ <source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
+ <translation type="unfinished">Fehler beim Laden von %s: Externe Unterzeichner-Brieftasche wird geladen, ohne dass die Unterstützung für externe Unterzeichner kompiliert wurde</translation>
+ </message>
+ <message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Fehler beim Lesen von %s! Alle Schlüssel wurden korrekt gelesen, aber Transaktionsdaten oder Adressmetadaten fehlen oder sind falsch.</translation>
+ </message>
+ <message>
+ <source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
+ <translation type="unfinished">Fehler: Adressbuchdaten im Wallet können nicht als zum migrierten Wallet gehörend identifiziert werden</translation>
+ </message>
+ <message>
+ <source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
+ <translation type="unfinished">Fehler: Doppelte Deskriptoren, die während der Migration erstellt wurden. Diese Wallet ist möglicherweise beschädigt.</translation>
+ </message>
+ <message>
+ <source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
+ <translation type="unfinished">Fehler: Transaktion in Wallet %s kann nicht als zu migrierten Wallet gehörend identifiziert werden</translation>
+ </message>
+ <message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Es war nicht möglich, die Bump-Gebühren zu berechnen, da unbestätigte UTXOs von einem enormen Cluster unbestätigter Transaktionen abhängen.</translation>
+ </message>
+ <message>
+ <source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
+ <translation type="unfinished">Kann ungültige Datei peers.dat nicht umbenennen. Bitte Verschieben oder Löschen und noch einmal versuchen.</translation>
+ </message>
+ <message>
+ <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <translation type="unfinished">Gebührenschätzung fehlgeschlagen. Fallbackgebühr ist deaktiviert. Warten Sie ein paar Blöcke oder aktivieren Sie %s.</translation>
+ </message>
+ <message>
+ <source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
+ <translation type="unfinished">Inkompatible Optionen: -dnsseed=1 wurde explizit angegeben, aber -onlynet verbietet Verbindungen zu IPv4/IPv6</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation type="unfinished">Ungültiger Betrag für %s=&lt;amount&gt;: '%s' (muss mindestens die MinRelay-Gebühr von %s betragen, um festhängende Transaktionen zu verhindern)</translation>
+ </message>
+ <message>
+ <source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
+ <translation type="unfinished">Ausgehende Verbindungen sind auf CJDNS beschränkt (-onlynet=cjdns), aber -cjdnsreachable ist nicht angegeben</translation>
+ </message>
+ <message>
+ <source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0</source>
+ <translation type="unfinished">Ausgehende Verbindungen sind eingeschränkt auf Tor (-onlynet=onion), aber der Proxy, um das Tor-Netzwerk zu erreichen ist nicht vorhanden (no -proxy= and no -onion= given) oder ausdrücklich verboten (-onion=0)</translation>
+ </message>
+ <message>
+ <source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given</source>
+ <translation type="unfinished">Ausgehende Verbindungen sind eingeschränkt auf Tor (-onlynet=onion), aber der Proxy, um das Tor-Netzwerk zu erreichen ist nicht vorhanden. Weder -proxy noch -onion noch -listenonion ist angegeben.</translation>
+ </message>
+ <message>
+ <source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
+ <translation type="unfinished">Ausgehende Verbindungen sind auf i2p (-onlynet=i2p) beschränkt, aber -i2psam ist nicht angegeben</translation>
+ </message>
+ <message>
+ <source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
+ <translation type="unfinished">Die Größe der Inputs übersteigt das maximale Gewicht. Bitte versuchen Sie, einen kleineren Betrag zu senden oder die UTXOs Ihrer Wallet manuell zu konsolidieren.</translation>
+ </message>
+ <message>
+ <source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
+ <translation type="unfinished">Die vorgewählte Gesamtsumme der Coins deckt das Transaktionsziel nicht ab. Bitte erlauben Sie, dass andere Eingaben automatisch ausgewählt werden, oder fügen Sie manuell mehr Coins hinzu</translation>
+ </message>
+ <message>
+ <source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
+ <translation type="unfinished">Die Transaktion erfordert ein Ziel mit einem Wert ungleich nicht-0, eine Gebühr ungleich nicht-0 oder eine vorausgewählte Eingabe</translation>
+ </message>
+ <message>
+ <source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
+ <translation type="unfinished">UTXO-Snapshot konnte nicht validiert werden. Starten Sie neu, um den normalen anfänglichen Block-Download fortzusetzen, oder versuchen Sie, einen anderen Snapshot zu laden.</translation>
+ </message>
+ <message>
+ <source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
+ <translation type="unfinished">Unbestätigte UTXOs sind verfügbar, aber deren Ausgabe erzeugt eine Kette von Transaktionen, die vom Mempool abgelehnt werden</translation>
+ </message>
+ <message>
+ <source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
+
+The wallet might have been tampered with or created with malicious intent.
+</source>
+ <translation type="unfinished">Unerwarteter Legacy-Eintrag in Deskriptor-Wallet gefunden. Lade Wallet %s
+
+Die Wallet könnte manipuliert oder in böser Absicht erstellt worden sein.
+</translation>
+ </message>
+ <message>
+ <source>Unrecognized descriptor found. Loading wallet %s
+
+The wallet might had been created on a newer version.
+Please try running the latest software version.
+</source>
+ <translation type="unfinished">Nicht erkannter Deskriptor gefunden. Beim Laden vom Wallet %s
+
+Die Wallet wurde möglicherweise in einer neueren Version erstellt.
+Bitte mit der neuesten Softwareversion versuchen.
+</translation>
+ </message>
+ <message>
+ <source>
+Unable to cleanup failed migration</source>
+ <translation type="unfinished">
+Fehlgeschlagene Migration kann nicht bereinigt werden</translation>
+ </message>
+ <message>
+ <source>
+Unable to restore backup of wallet.</source>
+ <translation type="unfinished">
+Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
+ </message>
+ <message>
+ <source>Block verification was interrupted</source>
+ <translation type="unfinished">Blocküberprüfung wurde unterbrochen</translation>
+ </message>
+ <message>
+ <source>Config setting for %s only applied on %s network when in [%s] section.</source>
+ <translation type="unfinished">Konfigurationseinstellungen für %s sind nur auf %s network gültig, wenn in Sektion [%s]</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">Beschädigte Blockdatenbank erkannt</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">Konnte die asmap Datei %s nicht finden</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">Konnte die asmap Datei %s nicht analysieren</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">Freier Plattenspeicher zu gering!</translation>
+ </message>
+ <message>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation type="unfinished">Möchten Sie die Blockdatenbank jetzt neu aufbauen?</translation>
+ </message>
+ <message>
+ <source>Done loading</source>
+ <translation type="unfinished">Laden abgeschlossen</translation>
+ </message>
+ <message>
+ <source>Dump file %s does not exist.</source>
+ <translation type="unfinished">Speicherauszugsdatei %sexistiert nicht.</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Bestätigen der Datenbanktransaktion für die Entfernung der Wallet-Transaktionen.</translation>
+ </message>
+ <message>
+ <source>Error creating %s</source>
+ <translation type="unfinished">Error beim Erstellen von %s</translation>
+ </message>
+ <message>
+ <source>Error initializing block database</source>
+ <translation type="unfinished">Fehler beim Initialisieren der Blockdatenbank</translation>
+ </message>
+ <message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">Fehler beim Initialisieren der Wallet-Datenbankumgebung %s!</translation>
+ </message>
+ <message>
+ <source>Error loading %s</source>
+ <translation type="unfinished">Fehler beim Laden von %s</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Private keys can only be disabled during creation</source>
+ <translation type="unfinished">Fehler beim Laden von %s: Private Schlüssel können nur bei der Erstellung deaktiviert werden</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation type="unfinished">Fehler beim Laden von %s: Das Wallet ist beschädigt</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation type="unfinished">Fehler beim Laden von %s: Das Wallet benötigt eine neuere Version von %s</translation>
+ </message>
+ <message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">Fehler beim Laden der Blockdatenbank</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">Fehler beim Öffnen der Blockdatenbank</translation>
+ </message>
+ <message>
+ <source>Error reading configuration file: %s</source>
+ <translation type="unfinished">Fehler beim Lesen der Konfigurationsdatei: %s</translation>
+ </message>
+ <message>
+ <source>Error reading from database, shutting down.</source>
+ <translation type="unfinished">Fehler beim Lesen der Datenbank, Ausführung wird beendet.</translation>
+ </message>
+ <message>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">Fehler beim Lesen des nächsten Eintrags aus der Wallet Datenbank</translation>
+ </message>
+ <message>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Starten der Datenbanktransaktion für die Entfernung der Wallet-Transaktionen.</translation>
+ </message>
+ <message>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
+ </message>
+ <message>
+ <source>Error: Couldn't create cursor into database</source>
+ <translation type="unfinished">Fehler: Konnte den Cursor in der Datenbank nicht erzeugen</translation>
+ </message>
+ <message>
+ <source>Error: Disk space is low for %s</source>
+ <translation type="unfinished">Fehler: Zu wenig Speicherplatz auf der Festplatte %s</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">Fehler: Prüfsumme der Speicherauszugsdatei stimmt nicht überein.
+Berechnet: %s, erwartet: %s</translation>
+ </message>
+ <message>
+ <source>Error: Failed to create new watchonly wallet</source>
+ <translation type="unfinished">Fehler: Fehler beim Erstellen einer neuen nur-beobachten Wallet</translation>
+ </message>
+ <message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">Fehler: Schlüssel ist kein Hex: %s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">Fehler: Wert ist kein Hex: %s</translation>
+ </message>
+ <message>
+ <source>Error: Keypool ran out, please call keypoolrefill first</source>
+ <translation type="unfinished">Fehler: Schlüsselspeicher ausgeschöpft, bitte zunächst keypoolrefill ausführen</translation>
+ </message>
+ <message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">Fehler: Fehlende Prüfsumme</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">Fehler: Keine %s Adressen verfügbar.</translation>
+ </message>
+ <message>
+ <source>Error: This wallet already uses SQLite</source>
+ <translation type="unfinished">Fehler: Diese Wallet verwendet bereits SQLite</translation>
+ </message>
+ <message>
+ <source>Error: This wallet is already a descriptor wallet</source>
+ <translation type="unfinished">Fehler: Diese Wallet ist bereits eine Deskriptor-Brieftasche</translation>
+ </message>
+ <message>
+ <source>Error: Unable to begin reading all records in the database</source>
+ <translation type="unfinished">Fehler: Konnte nicht anfangen, alle Datensätze in der Datenbank zu lesen.</translation>
+ </message>
+ <message>
+ <source>Error: Unable to make a backup of your wallet</source>
+ <translation type="unfinished">Fehler: Es kann keine Sicherungskopie Ihrer Wallet erstellt werden</translation>
+ </message>
+ <message>
+ <source>Error: Unable to parse version %u as a uint32_t</source>
+ <translation type="unfinished">Fehler: Kann Version %u nicht als uint32_t lesen.</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read all records in the database</source>
+ <translation type="unfinished">Fehler: Nicht alle Datensätze in der Datenbank können gelesen werden</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht lesen.</translation>
+ </message>
+ <message>
+ <source>Error: Unable to remove watchonly address book data</source>
+ <translation type="unfinished">Fehler: Watchonly-Adressbuchdaten können nicht entfernt werden</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write record to new wallet</source>
+ <translation type="unfinished">Fehler: Kann neuen Eintrag nicht in Wallet schreiben</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten-Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Fehler: Adressbuchkopie für Wallet %s fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Fehler: Datenbank-Transaktion kann für Wallet %s nicht ausgeführt werden.</translation>
+ </message>
+ <message>
+ <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
+ <translation type="unfinished">Fehler: Konnte auf keinem Port hören. Wenn dies so gewünscht wird -listen=0 verwenden.</translation>
+ </message>
+ <message>
+ <source>Failed to rescan the wallet during initialization</source>
+ <translation type="unfinished">Fehler: Wallet konnte während der Initialisierung nicht erneut gescannt werden.</translation>
+ </message>
+ <message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Start der Indizes fehlgeschlagen, wird beendet..</translation>
+ </message>
+ <message>
+ <source>Failed to verify database</source>
+ <translation type="unfinished">Verifizierung der Datenbank fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Fehler beim Entfernen der Transaktion: %s</translation>
+ </message>
+ <message>
+ <source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
+ <translation type="unfinished">Der Gebührensatz (%s) ist niedriger als die Mindestgebührensatz (%s) Einstellung.</translation>
+ </message>
+ <message>
+ <source>Ignoring duplicate -wallet %s.</source>
+ <translation type="unfinished">Ignoriere doppeltes -wallet %s.</translation>
+ </message>
+ <message>
+ <source>Importing…</source>
+ <translation type="unfinished">Importiere...</translation>
+ </message>
+ <message>
+ <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
+ <translation type="unfinished">Fehlerhafter oder kein Genesis-Block gefunden. Falsches Datenverzeichnis für das Netzwerk?</translation>
+ </message>
+ <message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation type="unfinished">Initialisierungsplausibilitätsprüfung fehlgeschlagen. %s wird beendet.</translation>
+ </message>
+ <message>
+ <source>Input not found or already spent</source>
+ <translation type="unfinished">Eingabe nicht gefunden oder bereits ausgegeben</translation>
+ </message>
+ <message>
+ <source>Insufficient dbcache for block verification</source>
+ <translation type="unfinished">Unzureichender dbcache für die Blocküberprüfung</translation>
+ </message>
+ <message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">Unzureichender Kontostand</translation>
+ </message>
+ <message>
+ <source>Invalid -i2psam address or hostname: '%s'</source>
+ <translation type="unfinished">Ungültige -i2psam Adresse oder Hostname: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid -onion address or hostname: '%s'</source>
+ <translation type="unfinished">Ungültige Onion-Adresse oder ungültiger Hostname: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid -proxy address or hostname: '%s'</source>
+ <translation type="unfinished">Ungültige Proxy-Adresse oder ungültiger Hostname: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid P2P permission: '%s'</source>
+ <translation type="unfinished">Ungültige P2P Genehmigung: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation type="unfinished">Ungültiger Betrag für %s=&lt;amount&gt;: '%s' (muss mindestens %ssein)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Ungültiger Betrag für %s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Ungültiger Betrag für -%s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid netmask specified in -whitelist: '%s'</source>
+ <translation type="unfinished">Ungültige Netzmaske angegeben in -whitelist: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid port specified in %s: '%s'</source>
+ <translation type="unfinished">Ungültiger Port angegeben in %s: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid pre-selected input %s</source>
+ <translation type="unfinished">Ungültige vorausgewählte Eingabe %s</translation>
+ </message>
+ <message>
+ <source>Listening for incoming connections failed (listen returned error %s)</source>
+ <translation type="unfinished">Das Hören auf eingehende Verbindungen ist fehlgeschlagen (Das Hören hat Fehler %s zurückgegeben)</translation>
+ </message>
+ <message>
+ <source>Loading P2P addresses…</source>
+ <translation type="unfinished">Lade P2P-Adressen...</translation>
+ </message>
+ <message>
+ <source>Loading banlist…</source>
+ <translation type="unfinished">Lade Bannliste…</translation>
+ </message>
+ <message>
+ <source>Loading block index…</source>
+ <translation type="unfinished">Lade Block-Index...</translation>
+ </message>
+ <message>
+ <source>Loading wallet…</source>
+ <translation type="unfinished">Lade Wallet...</translation>
+ </message>
+ <message>
+ <source>Missing amount</source>
+ <translation type="unfinished">Fehlender Betrag</translation>
+ </message>
+ <message>
+ <source>Missing solving data for estimating transaction size</source>
+ <translation type="unfinished">Fehlende Auflösungsdaten zur Schätzung der Transaktionsgröße</translation>
+ </message>
+ <message>
+ <source>Need to specify a port with -whitebind: '%s'</source>
+ <translation type="unfinished">Angabe eines Ports benötigt für -whitebind: '%s'</translation>
+ </message>
+ <message>
+ <source>No addresses available</source>
+ <translation type="unfinished">Keine Adressen verfügbar</translation>
+ </message>
+ <message>
+ <source>Not enough file descriptors available.</source>
+ <translation type="unfinished">Nicht genügend Datei-Deskriptoren verfügbar.</translation>
+ </message>
+ <message>
+ <source>Not found pre-selected input %s</source>
+ <translation type="unfinished">Nicht gefundener vorausgewählter Input %s</translation>
+ </message>
+ <message>
+ <source>Not solvable pre-selected input %s</source>
+ <translation type="unfinished">Nicht auflösbare vorausgewählter Input %s</translation>
+ </message>
+ <message>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation type="unfinished">Kürzungsmodus kann nicht mit einem negativen Wert konfiguriert werden.</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation type="unfinished">Kürzungsmodus ist nicht mit -txindex kompatibel.</translation>
+ </message>
+ <message>
+ <source>Pruning blockstore…</source>
+ <translation type="unfinished">Kürze den Blockspeicher…</translation>
+ </message>
+ <message>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation type="unfinished">Reduziere -maxconnections von %d zu %d, aufgrund von Systemlimitierungen.</translation>
+ </message>
+ <message>
+ <source>Replaying blocks…</source>
+ <translation type="unfinished">Spiele alle Blocks erneut ein…</translation>
+ </message>
+ <message>
+ <source>Rescanning…</source>
+ <translation type="unfinished">Wiederhole Scan...</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
+ <translation type="unfinished">SQLite-Datenbank: Anweisung, die Datenbank zu verifizieren fehlgeschlagen: %s</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
+ <translation type="unfinished">SQLite-Datenbank: Anfertigung der Anweisung zum Verifizieren der Datenbank fehlgeschlagen: %s</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Failed to read database verification error: %s</source>
+ <translation type="unfinished">Datenbank konnte nicht gelesen werden
+Verifikations-Error: %s</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
+ <translation type="unfinished">SQLiteDatabase: Unerwartete Anwendungs-ID. %u statt %u erhalten.</translation>
+ </message>
+ <message>
+ <source>Section [%s] is not recognized.</source>
+ <translation type="unfinished">Sektion [%s] ist nicht delegiert.</translation>
+ </message>
+ <message>
+ <source>Signing transaction failed</source>
+ <translation type="unfinished">Signierung der Transaktion fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Specified -walletdir "%s" does not exist</source>
+ <translation type="unfinished">Angegebenes Verzeichnis "%s" existiert nicht</translation>
+ </message>
+ <message>
+ <source>Specified -walletdir "%s" is a relative path</source>
+ <translation type="unfinished">Angegebenes -walletdir "%s" ist ein relativer Pfad</translation>
+ </message>
+ <message>
+ <source>Specified -walletdir "%s" is not a directory</source>
+ <translation type="unfinished">Angegebenes Verzeichnis "%s" ist kein Verzeichnis</translation>
+ </message>
+ <message>
+ <source>Specified blocks directory "%s" does not exist.</source>
+ <translation type="unfinished">Angegebener Blöcke-Ordner "%s" existiert nicht.</translation>
+ </message>
+ <message>
+ <source>Specified data directory "%s" does not exist.</source>
+ <translation type="unfinished">Das angegebene Datenverzeichnis "%s" existiert nicht.</translation>
+ </message>
+ <message>
+ <source>Starting network threads…</source>
+ <translation type="unfinished">Starte Netzwerk-Threads...</translation>
+ </message>
+ <message>
+ <source>The source code is available from %s.</source>
+ <translation type="unfinished">Der Quellcode ist auf %s verfügbar.</translation>
+ </message>
+ <message>
+ <source>The specified config file %s does not exist</source>
+ <translation type="unfinished">Die angegebene Konfigurationsdatei %sexistiert nicht</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation type="unfinished">Der Transaktionsbetrag ist zu niedrig, um die Gebühr zu bezahlen.</translation>
+ </message>
+ <message>
+ <source>The wallet will avoid paying less than the minimum relay fee.</source>
+ <translation type="unfinished">Das Wallet verhindert Zahlungen, die die Mindesttransaktionsgebühr nicht berücksichtigen.</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation type="unfinished">Dies ist experimentelle Software.</translation>
+ </message>
+ <message>
+ <source>This is the minimum transaction fee you pay on every transaction.</source>
+ <translation type="unfinished">Dies ist die kleinstmögliche Gebühr, die beim Senden einer Transaktion fällig wird.</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you will pay if you send a transaction.</source>
+ <translation type="unfinished">Dies ist die Gebühr, die beim Senden einer Transaktion fällig wird.</translation>
+ </message>
+ <message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Transaktion %s gehört nicht zu dieser Wallet</translation>
+ </message>
+ <message>
+ <source>Transaction amount too small</source>
+ <translation type="unfinished">Transaktionsbetrag zu niedrig</translation>
+ </message>
+ <message>
+ <source>Transaction amounts must not be negative</source>
+ <translation type="unfinished">Transaktionsbeträge dürfen nicht negativ sein.</translation>
+ </message>
+ <message>
+ <source>Transaction change output index out of range</source>
+ <translation type="unfinished">Ausgangsindex des Wechselgelds außerhalb des Bereichs</translation>
+ </message>
+ <message>
+ <source>Transaction must have at least one recipient</source>
+ <translation type="unfinished">Die Transaktion muss mindestens einen Empfänger enthalten.</translation>
+ </message>
+ <message>
+ <source>Transaction needs a change address, but we can't generate it.</source>
+ <translation type="unfinished">Transaktion erfordert eine Wechselgeldadresse, die jedoch nicht erzeugt werden kann.</translation>
+ </message>
+ <message>
+ <source>Transaction too large</source>
+ <translation type="unfinished">Transaktion zu groß</translation>
+ </message>
+ <message>
+ <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
+ <translation type="unfinished">Speicher kann für -maxsigcachesize: '%s' MiB nicht zugewiesen werden:</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer (bind returned error %s)</source>
+ <translation type="unfinished">Kann auf diesem Computer nicht an %s binden (bind meldete Fehler %s)</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation type="unfinished">Kann auf diesem Computer nicht an %s binden. Evtl. wurde %s bereits gestartet.</translation>
+ </message>
+ <message>
+ <source>Unable to create the PID file '%s': %s</source>
+ <translation type="unfinished">Erstellung der PID-Datei '%s': %s ist nicht möglich</translation>
+ </message>
+ <message>
+ <source>Unable to find UTXO for external input</source>
+ <translation type="unfinished">UTXO für externen Input konnte nicht gefunden werden</translation>
+ </message>
+ <message>
+ <source>Unable to generate initial keys</source>
+ <translation type="unfinished">Initialschlüssel können nicht generiert werden</translation>
+ </message>
+ <message>
+ <source>Unable to generate keys</source>
+ <translation type="unfinished">Schlüssel können nicht generiert werden</translation>
+ </message>
+ <message>
+ <source>Unable to open %s for writing</source>
+ <translation type="unfinished">Konnte %s nicht zum Schreiben zu öffnen</translation>
+ </message>
+ <message>
+ <source>Unable to parse -maxuploadtarget: '%s'</source>
+ <translation type="unfinished">Kann -maxuploadtarget: '%s' nicht parsen</translation>
+ </message>
+ <message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation type="unfinished">Kann HTTP-Server nicht starten. Siehe Debug-Log für Details.</translation>
+ </message>
+ <message>
+ <source>Unable to unload the wallet before migrating</source>
+ <translation type="unfinished">Die Wallet kann vor der Migration nicht entladen werden</translation>
+ </message>
+ <message>
+ <source>Unknown -blockfilterindex value %s.</source>
+ <translation type="unfinished">Unbekannter -blockfilterindex Wert %s.</translation>
+ </message>
+ <message>
+ <source>Unknown address type '%s'</source>
+ <translation type="unfinished">Unbekannter Adresstyp '%s'</translation>
+ </message>
+ <message>
+ <source>Unknown change type '%s'</source>
+ <translation type="unfinished">Unbekannter Wechselgeld-Typ '%s'</translation>
+ </message>
+ <message>
+ <source>Unknown network specified in -onlynet: '%s'</source>
+ <translation type="unfinished">Unbekannter Netztyp in -onlynet angegeben: '%s'</translation>
+ </message>
+ <message>
+ <source>Unknown new rules activated (versionbit %i)</source>
+ <translation type="unfinished">Unbekannte neue Regeln aktiviert (Versionsbit %i)</translation>
+ </message>
+ <message>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Nicht unterstützte globale Protokollierungsebene %s=%s. Gültige Werte: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Wallet Datei konnte nicht angelegt werden: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates wird auf der %s Chain nicht unterstützt.</translation>
+ </message>
+ <message>
+ <source>Unsupported logging category %s=%s.</source>
+ <translation type="unfinished">Nicht unterstützte Protokollkategorie %s=%s.</translation>
+ </message>
+ <message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten TX %s der Nur-beobachten-Wallet nicht hinzufügen.</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden.</translation>
+ </message>
+ <message>
+ <source>User Agent comment (%s) contains unsafe characters.</source>
+ <translation type="unfinished">Der User Agent Kommentar (%s) enthält unsichere Zeichen.</translation>
+ </message>
+ <message>
+ <source>Verifying blocks…</source>
+ <translation type="unfinished">Überprüfe Blöcke...</translation>
+ </message>
+ <message>
+ <source>Verifying wallet(s)…</source>
+ <translation type="unfinished">Überprüfe Wallet(s)...</translation>
+ </message>
+ <message>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation type="unfinished">Wallet musste neu geschrieben werden: starten Sie %s zur Fertigstellung neu</translation>
+ </message>
+ <message>
+ <source>Settings file could not be read</source>
+ <translation type="unfinished">Einstellungsdatei konnte nicht gelesen werden</translation>
+ </message>
+ <message>
+ <source>Settings file could not be written</source>
+ <translation type="unfinished">Einstellungsdatei kann nicht geschrieben werden</translation>
+ </message>
+</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_de_AT.ts b/src/qt/locale/bitcoin_de_AT.ts
index 217bb92f60..72ec23d469 100644
--- a/src/qt/locale/bitcoin_de_AT.ts
+++ b/src/qt/locale/bitcoin_de_AT.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Auswählen</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Sendeadressen</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Empfangsadressen</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Dies sind Ihre Bitcoin-Adressen zum Tätigen von Überweisungen. Bitte prüfen Sie den Betrag und die Adresse des Empfängers, bevor Sie Bitcoins überweisen.</translation>
</message>
@@ -102,6 +94,14 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Beim Speichern der Adressliste nach %1 ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Sendeadressen - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Empfangsadressen - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Exportieren fehlgeschlagen</translation>
</message>
@@ -303,6 +303,18 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">unbekannt</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Eingebettet "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Standard Systemschriftart "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Benutzerdefiniert...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Betrag</translation>
</message>
@@ -524,6 +536,14 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Schließe alle Wallets</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Wallet migrieren</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Eine Wallet Migrieren</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Zeige den "%1"-Hilfetext, um eine Liste mit möglichen Kommandozeilenoptionen zu erhalten</translation>
</message>
@@ -620,8 +640,12 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Netzwerk Aktivität einschalten</translation>
</message>
<message>
- <source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Synchronisiere Header (%1%)…</translation>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Fehler beim Erstellen der Wallet</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Es kann keine neue Wallet erstellt werden, die Software wurde ohne SQLite-Unterstützung kompiliert (erforderlich für Deskriptor-Wallets)</translation>
</message>
<message>
<source>Error: %1</source>
@@ -720,10 +744,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Gebühr:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">"Staub":</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Abzüglich Gebühr:</translation>
</message>
@@ -812,10 +832,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Bytes kopieren</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">"Staub" kopieren</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Wechselgeld kopieren</translation>
</message>
@@ -824,18 +840,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">(%1 gesperrt)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ja</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">nein</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Diese Bezeichnung wird rot, wenn irgendein Empfänger einen Betrag kleiner als die derzeitige "Staubgrenze" erhält.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Kann pro Eingabe um +/- %1 Satoshi(s) abweichen.</translation>
</message>
@@ -895,6 +899,57 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Wallet migrieren</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Sicher, dass die Wallet migriert werden soll? &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Durch die Migration der Wallet wird diese Wallet in eine oder mehrere Deskriptor-Wallets umgewandelt. Es muss ein neues Wallet-Backup erstellt werden.
+Wenn diese Wallet Watchonly-Skripte enthält, wird eine neue Wallet erstellt, die diese Watchonly-Skripte enthält.
+Wenn diese Wallet lösbare, aber nicht beobachtete Skripte enthält, wird eine andere und neue Wallet erstellt, die diese Skripte enthält.
+
+Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet erstellt. Diese Backup-Datei heißt &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak und befindet sich im Verzeichnis für diese Wallet. Im Falle einer fehlerhaften Migration kann das Backup mit der Funktion "Wallet wiederherstellen" wiederhergestellt werden.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Wallet migrieren</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Wallet migrieren &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Die Wallet '%1' wurde erfolgreich migriert.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Nur-beobachten Scripts wurden in eine neue Wallet namens '%1' überführt.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Lösbare aber nicht beobachtete Scripts wurde in eine neue Wallet namens '%1' überführt.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migration fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migration erfolgreich</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -909,11 +964,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Standard-Wallet</translation>
</message>
<message>
- <source>Open Wallet</source>
- <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Wallet öffnen</translation>
- </message>
- <message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
<translation type="unfinished">Öffne Wallet &lt;b&gt;%1&lt;/b&gt;…</translation>
@@ -950,10 +1000,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<context>
<name>WalletController</name>
<message>
- <source>Close wallet</source>
- <translation type="unfinished">Wallet schließen</translation>
- </message>
- <message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
<translation type="unfinished">Sind Sie sich sicher, dass Sie die Wallet &lt;i&gt;%1&lt;/i&gt; schließen möchten?</translation>
</message>
@@ -977,6 +1023,14 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Wallet erstellen</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Nur noch einen Schritt entfernt, das neue Wallet zu erstellen!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Bitte einen Namen angeben und, falls gewünscht, alle erweiterten Optionen aktivieren</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Wallet-Name</translation>
</message>
@@ -1013,14 +1067,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Eine leere Wallet erstellen</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Deskriptoren für scriptPubKey Verwaltung nutzen</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Deskriptor-Brieftasche</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Verwenden Sie ein externes Signiergerät, z. B. eine Hardware-Wallet. Konfigurieren Sie zunächst das Skript für den externen Signierer in den Wallet-Einstellungen.</translation>
</message>
@@ -1033,10 +1079,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Erstellen</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Ohne SQLite-Unterstützung (erforderlich für Deskriptor-Brieftaschen) kompiliert</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Ohne Unterstützung für die Signierung durch externe Geräte Dritter kompiliert (notwendig für Signierung durch externe Geräte Dritter)</translation>
@@ -1364,6 +1406,10 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Minimiert die Anwendung anstatt sie zu beenden wenn das Fenster geschlossen wird. Wenn dies aktiviert ist, müssen Sie die Anwendung über "Beenden" im Menü schließen.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Schriftart im Überblicks-Tab:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Einstellungen in diesem Dialog werden von der Kommandozeile überschrieben:</translation>
</message>
@@ -1576,18 +1622,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Nutze separaten SOCKS&amp;5-Proxy um Gegenstellen über Tor-Onion-Dienste zu erreichen:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Monospace Font im Übersichtsreiter:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">eingebettet "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">nächstliegende Übereinstimmung "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Abbrechen</translation>
</message>
@@ -1825,8 +1859,12 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">PSBT auf Platte gespeichert.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Sende %1 an %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Schickt %1 an %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">eigene Adresse</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2093,6 +2131,14 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Gegenstelle auswählen, um detaillierte Informationen zu erhalten.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Die Transportschicht-Version: %1</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Die BIP324-Sitzungs-ID-Zeichenfolge in hexadezimaler Form, falls vorhanden.</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Ob wir Adressen an diese Gegenstelle weiterleiten.</translation>
</message>
@@ -2314,6 +2360,21 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Ausgehende Adressensammlung: kurzlebig, zum Anfragen von Adressen</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Erkennen: Peer könnte v1 oder v2 sein</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">V1: Unverschlüsseltes Klartext-Transportprotokoll</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 verschlüsseltes Transportprotokoll</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">Wir haben die Gegenstelle zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
</message>
@@ -2404,6 +2465,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Strg+P</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Node-Fenster - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Befehl wird mit Wallet "%1" ausgeführt</translation>
</message>
@@ -2754,10 +2819,6 @@ Für weitere Informationen über diese Konsole, tippe %6.
<translation type="unfinished">Eingaben...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">"Staub":</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Auswählen...</translation>
</message>
@@ -2834,10 +2895,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Bytes kopieren</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">"Staub" kopieren</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Wechselgeld kopieren</translation>
</message>
@@ -2868,10 +2925,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Erzeugt eine teilsignierte Bitcoin Transaktion (PSBT) zur Benutzung mit z.B. einem Offline %1 Wallet, oder einem kompatiblen Hardware Wallet.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">von der Wallet '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 an '%2'</translation>
</message>
@@ -2929,6 +2982,10 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Überprüfen Sie bitte Ihr Transaktionsvorhaben. Dadurch wird eine Partiell Signierte Bitcoin-Transaktion (PSBT) erstellt, die Sie speichern oder kopieren und dann z. B. mit einer Offline-Wallet %1 oder einer PSBT-kompatible Hardware-Wallet nutzen können.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 von Wallet '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Möchtest du diese Transaktion erstellen?</translation>
@@ -3385,8 +3442,8 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Ausgabeindex</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Zertifikat wurde nicht verifiziert)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Zertifikat wurde nicht verifiziert)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3487,10 +3544,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Überwiesen an</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Eigenüberweisung</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Erarbeitet</translation>
</message>
@@ -3566,10 +3619,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Überwiesen an</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Eigenüberweisung</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Erarbeitet</translation>
</message>
@@ -3704,7 +3753,7 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
</message>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Neue Wallet erstellen</translation>
+ <translation type="unfinished">Neues Wallet erstellen</translation>
</message>
<message>
<source>Error</source>
@@ -3851,6 +3900,10 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">%s korrupt. Versuche mit dem Wallet-Werkzeug bitcoin-wallet zu retten, oder eine Sicherung wiederherzustellen.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s konnte den -assumeutxo-Snapshot-Status nicht validieren. Dies deutet auf ein Hardwareproblem, einen Fehler in der Software oder eine fehlerhafte Softwareänderung hin, die das Laden eines ungültigen Schnappschusses ermöglichte. Infolgedessen wird der Knoten heruntergefahren und verwendet keinen Zustand mehr, der auf dem Snapshot aufgebaut wurde, wodurch die Chain Height von %d auf %d zurückgesetzt wird. Beim nächsten Neustart nimmt der Knoten die Synchronisierung ab %d ohne Verwendung von Snapshot-Daten wieder auf. Bitte melden Sie diesen Vorfall an %s und geben Sie an, wie Sie den Snapshot erhalten haben. Der ungültige Snapshot-Chainstatus wird auf der Festplatte belassen, falls er bei der Diagnose des Problems, das diesen Fehler verursacht hat, hilfreich ist.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s Aufforderung, auf Port %u zu lauschen. Dieser Port wird als "schlecht" eingeschätzt und es ist daher unwahrscheinlich, dass sich Bitcoin Core Gegenstellen mit ihm verbinden. Siehe doc/p2p-bad-ports.md für Details und eine vollständige Liste.</translation>
</message>
@@ -3879,10 +3932,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">Fehler beim Laden der Wallet. Wallet erfordert das Herunterladen von Blöcken, und die Software unterstützt derzeit nicht das Laden von Wallets, während Blöcke außer der Reihe heruntergeladen werden, wenn assumeutxo-Snapshots verwendet werden. Die Wallet sollte erfolgreich geladen werden können, nachdem die Node-Synchronisation die Höhe %s erreicht hat.</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Lesen von %s fehlgeschlagen! Alle Schlüssel wurden korrekt gelesen, Transaktionsdaten bzw. Adressbucheinträge fehlen aber möglicherweise oder sind inkorrekt.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Fehler beim Lesen von %s! Transaktionsdaten fehlen oder sind nicht korrekt. Wallet wird erneut gescannt.</translation>
</message>
@@ -3951,6 +4000,10 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">Prune (Kürzung): Die letzte Synchronisation der Wallet liegt vor gekürzten (gelöschten) Blöcken. Es ist ein -reindex (erneuter Download der gesamten Blockchain im Fall eines gekürzten Nodes) notwendig.</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Umbenennung von '%s' -&gt; '%s' fehlgeschlagen. Sie sollten dieses Problem beheben, indem Sie das ungültige Snapshot-Verzeichnis %s manuell verschieben oder löschen, andernfalls wird der gleiche Fehler beim nächsten Start erneut auftreten.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLite-Datenbank: Unbekannte SQLite-Wallet-Schema-Version %d. Nur Version %d wird unterstützt.</translation>
</message>
@@ -3959,10 +4012,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">Die Block-Datenbank enthält einen Block, der scheinbar aus der Zukunft kommt. Dies kann daran liegen, dass die Systemzeit Ihres Computers falsch eingestellt ist. Stellen Sie die Block-Datenbank erst dann wieder her, wenn Sie sich sicher sind, dass Ihre Systemzeit korrekt eingestellt ist.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">Die Blockindexdatenbank enthält einen veralteten 'txindex'. Um den belegten Speicherplatz frei zu geben, führen Sie ein vollständiges -reindex aus, ansonsten ignorieren Sie diesen Fehler. Diese Fehlermeldung wird nicht noch einmal angezeigt.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Der Transaktionsbetrag ist zu klein, um ihn nach Abzug der Gebühr zu senden.</translation>
</message>
@@ -4000,6 +4049,10 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Nicht unterstützte kategoriespezifische Protokollierungsebene %1$s=%2$s. Erwartet %1$s=&lt;category&gt;:&lt;loglevel&gt;. Gültige Kategorien: %3$s. Gültige Loglevels: %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Nicht unterstütztes Chainstate-Datenbankformat gefunden. Bitte starte mit -reindex-chainstate neu. Dadurch wird die Chainstate-Datenbank neu erstellt.</translation>
</message>
@@ -4008,6 +4061,10 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Wallet erfolgreich erstellt. Der Legacy-Wallet-Typ ist veraltet und die Unterstützung für das Erstellen und Öffnen von Legacy-Wallets wird in Zukunft entfernt.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Wallet erfolgreich geladen. Der Legacy-Wallet-Typ ist veraltet und die Unterstützung für das Erstellen und Öffnen von Legacy-Wallets wird in Zukunft entfernt. Legacy-Wallets können mit migratewallet auf eine Deskriptor-Wallet migriert werden.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Warnung: Dumpdatei Wallet Format "%s" passt nicht zum auf der Kommandozeile angegebenen Format "%s".</translation>
</message>
@@ -4052,30 +4109,10 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Es konnte nicht in das Datenverzeichnis '%s' geschrieben werden; Überprüfen Sie die Berechtigungen.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">Das von einer früheren Version gestartete -txindex-Upgrade kann nicht abgeschlossen werden. Starten Sie mit der vorherigen Version neu oder führen Sie ein vollständiges -reindex aus.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s konnte den Snapshot-Status -assumeutxo nicht validieren. Dies weist auf ein Hardwareproblem, einen Fehler in der Software oder eine fehlerhafte Softwaremodifikation hin, die das Laden eines ungültigen Snapshots ermöglicht hat. Infolgedessen wird der Knoten heruntergefahren und verwendet keinen Status mehr, der auf dem Snapshot erstellt wurde, wodurch die Kettenhöhe von %d auf %d zurückgesetzt wird. Beim nächsten Neustart setzt der Knoten die Synchronisierung ab %d fort, ohne Snapshot-Daten zu verwenden. Bitte melden Sie diesen Vorfall an %s und geben Sie an, wie Sie den Snapshot erhalten haben. Der ungültige Snapshot-Kettenstatus wurde auf der Festplatte belassen, falls dies bei der Diagnose des Problems hilfreich ist, das diesen Fehler verursacht hat.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s ist sehr hoch gesetzt! Gebühren dieser Höhe könnten für eine einzelne Transaktion gezahlt werden.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Die Option -reindex-chainstate ist nicht mit -coinstatsindex kompatibel. Bitte deaktiviere coinstatsindex vorübergehend, während du -reindex-chainstate verwendest oder ersetze -reindex-chainstate durch -reindex, um alle Indexe vollständig neu zu erstellen.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Die Option -reindex-chainstate ist nicht mit -txindex kompatibel. Bitte deaktiviere txindex vorübergehend, während du -reindex-chainstate verwendest oder ersetze -reindex-chainstate durch -reindex, um alle Indexe vollständig neu zu erstellen.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Die Option -reindex-chainstate ist nicht mit -txindex kompatibel. Bitte deaktiviere txindex vorübergehend, während du -reindex-chainstate verwendest oder ersetze -reindex-chainstate durch -reindex, um alle Indexe vollständig neu zu erstellen.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Es ist nicht möglich, bestimmte Verbindungen anzubieten und gleichzeitig addrman ausgehende Verbindungen finden zu lassen.</translation>
</message>
@@ -4084,6 +4121,10 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Fehler beim Laden von %s: Externe Unterzeichner-Brieftasche wird geladen, ohne dass die Unterstützung für externe Unterzeichner kompiliert wurde</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Fehler beim Lesen von %s! Alle Schlüssel wurden korrekt gelesen, aber Transaktionsdaten oder Adressmetadaten fehlen oder sind falsch.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Fehler: Adressbuchdaten im Wallet können nicht als zum migrierten Wallet gehörend identifiziert werden</translation>
</message>
@@ -4096,6 +4137,10 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Fehler: Transaktion in\m Wallet %s kann nicht als zu migrierten Wallet gehörend identifiziert werden</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Es war nicht möglich, die Bump-Gebühren zu berechnen, da unbestätigte UTXOs von einem enormen Cluster unbestätigter Transaktionen abhängen.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Kann ungültige Datei peers.dat nicht umbenennen. Bitte Verschieben oder Löschen und noch einmal versuchen.</translation>
</message>
@@ -4170,10 +4215,6 @@ Bitte mit der neuesten Softwareversion versuchen.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Nicht unterstützter kategoriespezifischer logging level -loglevel=%s. Erwarteter -loglevel=&lt;category&gt; :&lt;loglevel&gt;. Gültige Kategorien:%s. Gültige Log-Ebenen:%s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4222,6 +4263,10 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Speicherauszugsdatei %sexistiert nicht.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Bestätigen der Datenbanktransaktion für die Entfernung der Wallet-transaktionen.</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error beim Erstellen von %s</translation>
</message>
@@ -4270,16 +4315,12 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Fehler beim Lesen des nächsten Eintrags aus der Wallet Datenbank</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Starten der Datenbanktransaktion für die Entfernung der Wallet-Transaktionen.</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Fehler: watchonly tx konnte nicht zu watchonly Wallet hinzugefügt werden</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4319,10 +4360,6 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Keine %s Adressen verfügbar..</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Fehler: Nicht alle watchonly txs konnten gelöscht werden</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Fehler: Diese Wallet verwendet bereits SQLite</translation>
</message>
@@ -4347,6 +4384,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Alle Datensätze in der Datenbank können nicht gelesen werden</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht lesen.</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Fehler: Watchonly-Adressbuchdaten können nicht entfernt werden</translation>
</message>
@@ -4355,6 +4396,22 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Kann neuen Eintrag nicht in Wallet schreiben</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten-Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Fehler: Adressbuchkopie für Wallet %s fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Fehler: Datenbank-Transaktion kann für Wallet %s nicht ausgeführt werden.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fehler: Es konnte kein Port abgehört werden. Wenn dies so gewünscht wird -listen=0 verwenden.</translation>
</message>
@@ -4363,10 +4420,18 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Wallet konnte während der Initialisierung nicht erneut gescannt werden.</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Start der Indizes fehlgeschlagen, wird beendet..</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Verifizierung der Datenbank fehlgeschlagen</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Fehler beim Entfernen der Transaktion: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Der Gebührensatz (%s) ist niedriger als die Mindestgebührensatz (%s) Einstellung.</translation>
</message>
@@ -4588,6 +4653,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Dies ist die Gebühr, die beim Senden einer Transaktion fällig wird.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Transaktion %s gehört nicht zu dieser Brieftasche</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Transaktionsbetrag zu niedrig</translation>
</message>
@@ -4600,10 +4669,6 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Ausgangsindex der Transaktionsänderung außerhalb des Bereichs</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Die Speicherpoolkette der Transaktion ist zu lang.</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Die Transaktion muss mindestens einen Empfänger enthalten.</translation>
</message>
@@ -4680,14 +4745,30 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Unbekannte neue Regeln aktiviert (Versionsbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Nicht unterstützter globaler Protokolliergrad -loglevel=%s. Gültige Werte:%s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Nicht unterstützte globale Protokollierungsebene %s=%s. Gültige Werte: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Wallet Datei konnte nicht angelegt werden: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates wird auf der %s Chain nicht unterstützt.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Nicht unterstützte Protokollkategorie %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten TX %s der Nur-beobachten-Wallet nicht hinzufügen.</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Der User Agent Kommentar (%s) enthält unsichere Zeichen.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_de_CH.ts b/src/qt/locale/bitcoin_de_CH.ts
index bf3bd6786d..2792a1bc98 100644
--- a/src/qt/locale/bitcoin_de_CH.ts
+++ b/src/qt/locale/bitcoin_de_CH.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Auswählen</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Sendeadressen</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Empfangsadressen</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Dies sind Ihre Bitcoin-Adressen zum Tätigen von Überweisungen. Bitte prüfen Sie den Betrag und die Adresse des Empfängers, bevor Sie Bitcoins überweisen.</translation>
</message>
@@ -102,6 +94,14 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Beim Speichern der Adressliste nach %1 ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Sendeadressen - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Empfangsadressen - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Exportieren fehlgeschlagen</translation>
</message>
@@ -303,6 +303,18 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">unbekannt</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Eingebettet "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Standard Systemschriftart "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Benutzerdefiniert...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Betrag</translation>
</message>
@@ -524,6 +536,14 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Schließe alle Wallets</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Wallet migrieren</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Eine Wallet Migrieren</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Zeige den "%1"-Hilfetext, um eine Liste mit möglichen Kommandozeilenoptionen zu erhalten</translation>
</message>
@@ -620,8 +640,12 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Netzwerk Aktivität einschalten</translation>
</message>
<message>
- <source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Synchronisiere Header (%1%)…</translation>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Fehler beim Erstellen der Wallet</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Es kann keine neue Wallet erstellt werden, die Software wurde ohne SQLite-Unterstützung kompiliert (erforderlich für Deskriptor-Wallets)</translation>
</message>
<message>
<source>Error: %1</source>
@@ -720,10 +744,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Gebühr:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">"Staub":</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Abzüglich Gebühr:</translation>
</message>
@@ -812,10 +832,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Bytes kopieren</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">"Staub" kopieren</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Wechselgeld kopieren</translation>
</message>
@@ -824,18 +840,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">(%1 gesperrt)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ja</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">nein</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Diese Bezeichnung wird rot, wenn irgendein Empfänger einen Betrag kleiner als die derzeitige "Staubgrenze" erhält.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Kann pro Eingabe um +/- %1 Satoshi(s) abweichen.</translation>
</message>
@@ -895,6 +899,57 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Wallet migrieren</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Sicher, dass die Wallet migriert werden soll? &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Durch die Migration der Wallet wird diese Wallet in eine oder mehrere Deskriptor-Wallets umgewandelt. Es muss ein neues Wallet-Backup erstellt werden.
+Wenn diese Wallet Watchonly-Skripte enthält, wird eine neue Wallet erstellt, die diese Watchonly-Skripte enthält.
+Wenn diese Wallet lösbare, aber nicht beobachtete Skripte enthält, wird eine andere und neue Wallet erstellt, die diese Skripte enthält.
+
+Während des Migrationsprozesses wird vor der Migration ein Backup der Wallet erstellt. Diese Backup-Datei heißt &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak und befindet sich im Verzeichnis für diese Wallet. Im Falle einer fehlerhaften Migration kann das Backup mit der Funktion "Wallet wiederherstellen" wiederhergestellt werden.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Wallet migrieren</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Wallet migrieren &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Die Wallet '%1' wurde erfolgreich migriert.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Nur-beobachten Scripts wurden in eine neue Wallet namens '%1' überführt.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Lösbare aber nicht beobachtete Scripts wurde in eine neue Wallet namens '%1' überführt.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migration fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migration erfolgreich</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -909,11 +964,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Standard-Wallet</translation>
</message>
<message>
- <source>Open Wallet</source>
- <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Wallet öffnen</translation>
- </message>
- <message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
<translation type="unfinished">Öffne Wallet &lt;b&gt;%1&lt;/b&gt;…</translation>
@@ -950,10 +1000,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<context>
<name>WalletController</name>
<message>
- <source>Close wallet</source>
- <translation type="unfinished">Wallet schließen</translation>
- </message>
- <message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
<translation type="unfinished">Sind Sie sich sicher, dass Sie die Wallet &lt;i&gt;%1&lt;/i&gt; schließen möchten?</translation>
</message>
@@ -977,6 +1023,14 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Wallet erstellen</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Nur noch einen Schritt entfernt, das neue Wallet zu erstellen!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Bitte einen Namen angeben und, falls gewünscht, alle erweiterten Optionen aktivieren</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Wallet-Name</translation>
</message>
@@ -1013,14 +1067,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Eine leere Wallet erstellen</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Deskriptoren für scriptPubKey Verwaltung nutzen</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Deskriptor-Brieftasche</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Verwenden Sie ein externes Signiergerät, z. B. eine Hardware-Wallet. Konfigurieren Sie zunächst das Skript für den externen Signierer in den Wallet-Einstellungen.</translation>
</message>
@@ -1033,10 +1079,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Erstellen</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Ohne SQLite-Unterstützung (erforderlich für Deskriptor-Brieftaschen) kompiliert</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Ohne Unterstützung für die Signierung durch externe Geräte Dritter kompiliert (notwendig für Signierung durch externe Geräte Dritter)</translation>
@@ -1364,6 +1406,10 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Minimiert die Anwendung anstatt sie zu beenden wenn das Fenster geschlossen wird. Wenn dies aktiviert ist, müssen Sie die Anwendung über "Beenden" im Menü schließen.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Schriftart im Überblicks-Tab:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Einstellungen in diesem Dialog werden von der Kommandozeile überschrieben:</translation>
</message>
@@ -1576,18 +1622,6 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">Nutze separaten SOCKS&amp;5-Proxy um Gegenstellen über Tor-Onion-Dienste zu erreichen:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Monospace Font im Übersichtsreiter:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">eingebettet "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">nächstliegende Übereinstimmung "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Abbrechen</translation>
</message>
@@ -1825,8 +1859,12 @@ Das Signieren ist nur mit Adressen vom Typ 'Legacy' möglich.</translation>
<translation type="unfinished">PSBT auf Platte gespeichert.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Sende %1 an %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Schickt %1 an %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">eigene Adresse</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2093,6 +2131,14 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Gegenstelle auswählen, um detaillierte Informationen zu erhalten.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Die Transportschicht-Version: %1</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Die BIP324-Sitzungs-ID-Zeichenfolge in hexadezimaler Form, falls vorhanden.</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Ob wir Adressen an diese Gegenstelle weiterleiten.</translation>
</message>
@@ -2314,6 +2360,21 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Ausgehende Adressensammlung: kurzlebig, zum Anfragen von Adressen</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Erkennen: Peer könnte v1 oder v2 sein</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">V1: Unverschlüsseltes Klartext-Transportprotokoll</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 verschlüsseltes Transportprotokoll</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">Wir haben die Gegenstelle zum Weiterleiten mit hoher Bandbreite ausgewählt</translation>
</message>
@@ -2404,6 +2465,10 @@ Wenn Sie diese Fehlermeldung erhalten, sollten Sie den Händler bitten, einen BI
<translation type="unfinished">Strg+P</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Node-Fenster - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Befehl wird mit Wallet "%1" ausgeführt</translation>
</message>
@@ -2754,10 +2819,6 @@ Für weitere Informationen über diese Konsole, tippe %6.
<translation type="unfinished">Eingaben...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">"Staub":</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Auswählen...</translation>
</message>
@@ -2834,10 +2895,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Bytes kopieren</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">"Staub" kopieren</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Wechselgeld kopieren</translation>
</message>
@@ -2868,10 +2925,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Erzeugt eine teilsignierte Bitcoin Transaktion (PSBT) zur Benutzung mit z.B. einem Offline %1 Wallet, oder einem kompatiblen Hardware Wallet.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">von der Wallet '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 an '%2'</translation>
</message>
@@ -2929,6 +2982,10 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Überprüfen Sie bitte Ihr Transaktionsvorhaben. Dadurch wird eine Partiell Signierte Bitcoin-Transaktion (PSBT) erstellt, die Sie speichern oder kopieren und dann z. B. mit einer Offline-Wallet %1 oder einer PSBT-kompatible Hardware-Wallet nutzen können.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 von Wallet '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Möchtest du diese Transaktion erstellen?</translation>
@@ -3385,8 +3442,8 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Ausgabeindex</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Zertifikat wurde nicht verifiziert)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Zertifikat wurde nicht verifiziert)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3487,10 +3544,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Überwiesen an</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Eigenüberweisung</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Erarbeitet</translation>
</message>
@@ -3566,10 +3619,6 @@ Hinweis: Da die Gebühr auf Basis der Bytes berechnet wird, führt eine Gebühre
<translation type="unfinished">Überwiesen an</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Eigenüberweisung</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Erarbeitet</translation>
</message>
@@ -3704,7 +3753,7 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
</message>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Neue Wallet erstellen</translation>
+ <translation type="unfinished">Neues Wallet erstellen</translation>
</message>
<message>
<source>Error</source>
@@ -3851,6 +3900,10 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">%s korrupt. Versuche mit dem Wallet-Werkzeug bitcoin-wallet zu retten, oder eine Sicherung wiederherzustellen.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s konnte den -assumeutxo-Snapshot-Status nicht validieren. Dies deutet auf ein Hardwareproblem, einen Fehler in der Software oder eine fehlerhafte Softwareänderung hin, die das Laden eines ungültigen Schnappschusses ermöglichte. Infolgedessen wird der Knoten heruntergefahren und verwendet keinen Zustand mehr, der auf dem Snapshot aufgebaut wurde, wodurch die Chain Height von %d auf %d zurückgesetzt wird. Beim nächsten Neustart nimmt der Knoten die Synchronisierung ab %d ohne Verwendung von Snapshot-Daten wieder auf. Bitte melden Sie diesen Vorfall an %s und geben Sie an, wie Sie den Snapshot erhalten haben. Der ungültige Snapshot-Chainstatus wird auf der Festplatte belassen, falls er bei der Diagnose des Problems, das diesen Fehler verursacht hat, hilfreich ist.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s Aufforderung, auf Port %u zu lauschen. Dieser Port wird als "schlecht" eingeschätzt und es ist daher unwahrscheinlich, dass sich Bitcoin Core Gegenstellen mit ihm verbinden. Siehe doc/p2p-bad-ports.md für Details und eine vollständige Liste.</translation>
</message>
@@ -3879,10 +3932,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">Fehler beim Laden der Wallet. Wallet erfordert das Herunterladen von Blöcken, und die Software unterstützt derzeit nicht das Laden von Wallets, während Blöcke außer der Reihe heruntergeladen werden, wenn assumeutxo-Snapshots verwendet werden. Die Wallet sollte erfolgreich geladen werden können, nachdem die Node-Synchronisation die Höhe %s erreicht hat.</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Lesen von %s fehlgeschlagen! Alle Schlüssel wurden korrekt gelesen, Transaktionsdaten bzw. Adressbucheinträge fehlen aber möglicherweise oder sind inkorrekt.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Fehler beim Lesen von %s! Transaktionsdaten fehlen oder sind nicht korrekt. Wallet wird erneut gescannt.</translation>
</message>
@@ -3951,6 +4000,10 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">Prune (Kürzung): Die letzte Synchronisation der Wallet liegt vor gekürzten (gelöschten) Blöcken. Es ist ein -reindex (erneuter Download der gesamten Blockchain im Fall eines gekürzten Nodes) notwendig.</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Umbenennung von '%s' -&gt; '%s' fehlgeschlagen. Sie sollten dieses Problem beheben, indem Sie das ungültige Snapshot-Verzeichnis %s manuell verschieben oder löschen, andernfalls wird der gleiche Fehler beim nächsten Start erneut auftreten.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLite-Datenbank: Unbekannte SQLite-Wallet-Schema-Version %d. Nur Version %d wird unterstützt.</translation>
</message>
@@ -3959,10 +4012,6 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
<translation type="unfinished">Die Block-Datenbank enthält einen Block, der scheinbar aus der Zukunft kommt. Dies kann daran liegen, dass die Systemzeit Ihres Computers falsch eingestellt ist. Stellen Sie die Block-Datenbank erst dann wieder her, wenn Sie sich sicher sind, dass Ihre Systemzeit korrekt eingestellt ist.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">Die Blockindexdatenbank enthält einen veralteten 'txindex'. Um den belegten Speicherplatz frei zu geben, führen Sie ein vollständiges -reindex aus, ansonsten ignorieren Sie diesen Fehler. Diese Fehlermeldung wird nicht noch einmal angezeigt.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Der Transaktionsbetrag ist zu klein, um ihn nach Abzug der Gebühr zu senden.</translation>
</message>
@@ -4000,6 +4049,10 @@ Gehen Sie zu Datei &gt; Wallet Öffnen, um eine Wallet zu laden.
Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Nicht unterstützte kategoriespezifische Protokollierungsebene %1$s=%2$s. Erwartet %1$s=&lt;category&gt;:&lt;loglevel&gt;. Gültige Kategorien: %3$s. Gültige Loglevels: %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Nicht unterstütztes Chainstate-Datenbankformat gefunden. Bitte starte mit -reindex-chainstate neu. Dadurch wird die Chainstate-Datenbank neu erstellt.</translation>
</message>
@@ -4008,6 +4061,10 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Wallet erfolgreich erstellt. Der Legacy-Wallet-Typ ist veraltet und die Unterstützung für das Erstellen und Öffnen von Legacy-Wallets wird in Zukunft entfernt.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Wallet erfolgreich geladen. Der Legacy-Wallet-Typ ist veraltet und die Unterstützung für das Erstellen und Öffnen von Legacy-Wallets wird in Zukunft entfernt. Legacy-Wallets können mit migratewallet auf eine Deskriptor-Wallet migriert werden.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Warnung: Dumpdatei Wallet Format "%s" passt nicht zum auf der Kommandozeile angegebenen Format "%s".</translation>
</message>
@@ -4056,30 +4113,10 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Es konnte nicht in das Datenverzeichnis '%s' geschrieben werden; Überprüfen Sie die Berechtigungen.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">Das von einer früheren Version gestartete -txindex-Upgrade kann nicht abgeschlossen werden. Starten Sie mit der vorherigen Version neu oder führen Sie ein vollständiges -reindex aus.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s konnte den Snapshot-Status -assumeutxo nicht validieren. Dies weist auf ein Hardwareproblem, einen Fehler in der Software oder eine fehlerhafte Softwaremodifikation hin, die das Laden eines ungültigen Snapshots ermöglicht hat. Infolgedessen wird der Knoten heruntergefahren und verwendet keinen Status mehr, der auf dem Snapshot erstellt wurde, wodurch die Kettenhöhe von %d auf %d zurückgesetzt wird. Beim nächsten Neustart setzt der Knoten die Synchronisierung ab %d fort, ohne Snapshot-Daten zu verwenden. Bitte melden Sie diesen Vorfall an %s und geben Sie an, wie Sie den Snapshot erhalten haben. Der ungültige Snapshot-Kettenstatus wurde auf der Festplatte belassen, falls dies bei der Diagnose des Problems hilfreich ist, das diesen Fehler verursacht hat.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s ist sehr hoch gesetzt! Gebühren dieser Höhe könnten für eine einzelne Transaktion gezahlt werden.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Die Option -reindex-chainstate ist nicht mit -coinstatsindex kompatibel. Bitte deaktiviere coinstatsindex vorübergehend, während du -reindex-chainstate verwendest oder ersetze -reindex-chainstate durch -reindex, um alle Indizes vollständig neu zu erstellen.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Die Option -reindex-chainstate ist nicht mit -txindex kompatibel. Bitte deaktiviere txindex vorübergehend, während du -reindex-chainstate verwendest oder ersetze -reindex-chainstate durch -reindex, um alle Indizes vollständig neu zu erstellen.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Die Option -reindex-chainstate ist nicht mit -txindex kompatibel. Bitte deaktiviere txindex vorübergehend, während du -reindex-chainstate verwendest oder ersetze -reindex-chainstate durch -reindex, um alle Indizes vollständig neu zu erstellen.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Es ist nicht möglich, bestimmte Verbindungen anzubieten und gleichzeitig addrman ausgehende Verbindungen finden zu lassen.</translation>
</message>
@@ -4088,6 +4125,10 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Fehler beim Laden von %s: Externe Unterzeichner-Wallet wird geladen, ohne dass die Unterstützung für externe Unterzeichner kompiliert wurde</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Fehler beim Lesen von %s! Alle Schlüssel wurden korrekt gelesen, aber Transaktionsdaten oder Adressmetadaten fehlen oder sind falsch.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Fehler: Adressbuchdaten im Wallet können nicht als zum migrierten Wallet gehörend identifiziert werden</translation>
</message>
@@ -4100,6 +4141,10 @@ Bitte nutzen Sie entweder "bdb" oder "sqlite".</translation>
<translation type="unfinished">Fehler: Transaktion in Wallet %s kann nicht als zu migrierten Wallet gehörend identifiziert werden</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Es war nicht möglich, die Bump-Gebühren zu berechnen, da unbestätigte UTXOs von einem enormen Cluster unbestätigter Transaktionen abhängen.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Kann ungültige Datei peers.dat nicht umbenennen. Bitte Verschieben oder Löschen und noch einmal versuchen.</translation>
</message>
@@ -4173,10 +4218,6 @@ Die Wallet wurde möglicherweise in einer neueren Version erstellt.
Bitte mit der neuesten Softwareversion versuchen.</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Nicht unterstützter kategoriespezifischer logging level -loglevel=%s. Erwarteter -loglevel=&lt;category&gt; :&lt;loglevel&gt;. Gültige Kategorien:%s. Gültige Log-Ebenen:%s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4225,6 +4266,10 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Speicherauszugsdatei %sexistiert nicht.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Bestätigen der Datenbanktransaktion für die Entfernung der Wallet-transaktionen.</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error beim Erstellen von %s</translation>
</message>
@@ -4273,16 +4318,12 @@ Die Sicherung der Wallet kann nicht wiederhergestellt werden.</translation>
<translation type="unfinished">Fehler beim Lesen des nächsten Eintrags aus der Wallet Datenbank</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Fehler beim Starten der Datenbanktransaktion für die Entfernung der Wallet-Transaktionen.</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Fehler: watchonly tx konnte nicht zu watchonly Wallet hinzugefügt werden</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Fehler: Das Ziel kann nicht aus dem generierten scriptpubkey extrahiert werden</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4322,10 +4363,6 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Keine %s Adressen verfügbar.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Fehler: Nicht alle nur-beobachten txs konnten gelöscht werden</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Fehler: Diese Wallet verwendet bereits SQLite</translation>
</message>
@@ -4350,6 +4387,10 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Nicht alle Datensätze in der Datenbank können gelesen werden</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht lesen.</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Fehler: Watchonly-Adressbuchdaten konnten nicht entfernt werden</translation>
</message>
@@ -4358,6 +4399,22 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Kann neuen Eintrag nicht in Wallet schreiben</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten-Wallet Eintrag für Ort des besten Blocks nicht schreiben.</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Fehler: Adressbuchkopie für Wallet %s fehlgeschlagen</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Fehler: Datenbank-Transaktion kann für Wallet %s nicht ausgeführt werden.</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fehler: Konnte auf keinem Port hören. Wenn dies so gewünscht wird -listen=0 verwenden.</translation>
</message>
@@ -4366,10 +4423,18 @@ Berechnet: %s, erwartet: %s</translation>
<translation type="unfinished">Fehler: Wallet konnte während der Initialisierung nicht erneut gescannt werden.</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Start der Indizes fehlgeschlagen, wird beendet..</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Verifizierung der Datenbank fehlgeschlagen</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Fehler beim Entfernen der Transaktion: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Der Gebührensatz (%s) ist niedriger als die Mindestgebührensatz (%s) Einstellung.</translation>
</message>
@@ -4591,6 +4656,10 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Dies ist die Gebühr, die beim Senden einer Transaktion fällig wird.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Transaktion %s gehört nicht zu dieser Brieftasche</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Transaktionsbetrag zu niedrig</translation>
</message>
@@ -4603,10 +4672,6 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Ausgangsindex des Wechselgelds außerhalb des Bereichs</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Die Speicherpoolkette der Transaktion ist zu lang.</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Die Transaktion muss mindestens einen Empfänger enthalten.</translation>
</message>
@@ -4683,14 +4748,30 @@ Verifikations-Error: %s</translation>
<translation type="unfinished">Unbekannte neue Regeln aktiviert (Versionsbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Nicht unterstützter globaler Protokolliergrad -loglevel=%s. Gültige Werte:%s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Nicht unterstützte globale Protokollierungsebene %s=%s. Gültige Werte: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Wallet Datei konnte nicht angelegt werden: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates wird auf der %s Chain nicht unterstützt.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Nicht unterstützte Protokollkategorie %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Fehler: Konnte Nur-beobachten TX %s der Nur-beobachten-Wallet nicht hinzufügen.</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Fehler: Watchonly-Transaktionen konnten nicht gelöscht werden.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Der User Agent Kommentar (%s) enthält unsichere Zeichen.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_el.ts b/src/qt/locale/bitcoin_el.ts
index 037bb81e3e..61d6807947 100644
--- a/src/qt/locale/bitcoin_el.ts
+++ b/src/qt/locale/bitcoin_el.ts
@@ -2,14 +2,6 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">Δεξί-κλικ για επεξεργασία της διεύθυνσης ή της ετικέτας</translation>
- </message>
- <message>
- <source>Create a new address</source>
- <translation type="unfinished">Δημιουργία νέας διεύθυνσης</translation>
- </message>
- <message>
<source>&amp;New</source>
<translation type="unfinished">&amp;Νέo</translation>
</message>
@@ -58,14 +50,6 @@
<translation type="unfinished">Ε&amp;πιλογή</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Διευθύνσεις αποστολής</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Διευθύνσεις λήψης</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Αυτές είναι οι Bitcoin διευθύνσεις σας για να στέλνετε πληρωμές. Να ελέγχετε πάντα το ποσό, καθώς και τη διεύθυνση παραλήπτη πριν στείλετε νομίσματα.</translation>
</message>
@@ -224,6 +208,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Η φράση πρόσβασης που καταχωρήθηκε για την αποκρυπτογράφηση του πορτοφολιού δεν ήταν σωστή.</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">Η φράση πρόσβασης που εισήχθη για την αποκρυπτογράφηση του πορτοφολιού είναι εσφαλμένη. Περιέχει έναν μηδενικό χαρακτήρα (δηλαδή - ένα byte μηδέν). Εάν η φράση πρόσβασης ορίστηκε με μια έκδοση αυτού του λογισμικού πριν από την 25.0, δοκιμάστε ξανά μόνο με τους χαρακτήρες έως — αλλά χωρίς να συμπεριλαμβάνεται — ο πρώτος μηδενικός χαρακτήρας. Εάν αυτό είναι επιτυχές, ορίστε μια νέα φράση πρόσβασης για να αποφύγετε αυτό το ζήτημα στο μέλλον.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Η φράση πρόσβασης άλλαξε επιτυχώς.</translation>
</message>
@@ -232,6 +220,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Η αλλαγή της φράσης πρόσβασης απέτυχε</translation>
</message>
<message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">Ο παλιός κωδικός που εισήχθη για την αποκρυπτογράφηση του πορτοφολιού είναι εσφαλμένος. Περιέχει έναν χαρακτήρα null (δηλαδή, ένα μηδενικό byte). Εάν ο κωδικός ορίστηκε πριν από την έκδοση 25.0 του λογισμικού, δοκιμάστε ξανά εισαγάγοντας μόνο τους χαρακτήρες έως τον πρώτο χαρακτήρα null — αλλά όχι αυτόν.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Προσοχη: το πλήκτρο Caps Lock είναι ενεργο.</translation>
</message>
@@ -250,6 +242,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Το αρχείο Ρυθμίσεων %1 ενδέχεται να είναι κατεστραμμένο ή μη έγκυρο.</translation>
</message>
<message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Αδυναμία αποθήκευσης παλιών δεδομένων πορτοφολιού</translation>
+ </message>
+ <message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
<translation type="unfinished">Συνέβη ενα μοιραίο σφάλμα. %1 δε μπορεί να συνεχιστεί με ασφάλεια και θα σταματήσει</translation>
</message>
@@ -299,6 +295,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Αδρομολόγητο</translation>
</message>
<message>
+ <source>Onion</source>
+ <comment>network name</comment>
+ <extracomment>Name of Tor network in peer info</extracomment>
+ <translation type="unfinished">Onion (κρυφές υπηρεσίες)</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">Εισερχόμενα</translation>
@@ -324,6 +326,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Χειροκίνητα</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">Feeler (εξερχόμενη σύνδεση βραχείας διάρκειας)</translation>
+ </message>
+ <message>
<source>Address Fetch</source>
<extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
<translation type="unfinished">Λήψη Διεύθυνσης</translation>
@@ -676,6 +683,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Κλείσιμο όλων των πορτοφολιών</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Μεταφορά Πορτοφολιού</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Μεταφορά ενός πορτοφολιού</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Εμφάνισε το %1 βοηθητικό μήνυμα για λήψη μιας λίστας με διαθέσιμες επιλογές για Bitcoin εντολές </translation>
</message>
@@ -743,8 +758,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>1%n ενεργές συνδέσεις στο δίκτυο Bitcoin.</numerusform>
+ <numerusform>%n ενεργές συνδέσεις στο δίκτυο Bitcoin.</numerusform>
</translation>
</message>
<message>
@@ -768,6 +783,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ενεργοποίηση δραστηριότητας δικτύου</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Προ-συγχρονισμός Επικεφαλίδων (%1%)...</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Σφάλμα δημιουργίας πορτοφολιού</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Δεν είναι δυνατή η δημιουργία νέου πορτοφολιού, το λογισμικό μεταγλωττίστηκε χωρίς SQLite υποστήριξη (απαιτείται για κρυπτογραφημένα πορτοφόλια)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Σφάλμα: %1</translation>
</message>
@@ -870,10 +897,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ταρίφα:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Σκόνη:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Ταρίφα αλλαγής:</translation>
</message>
@@ -962,10 +985,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Αντιγραφή των bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Αντιγραφή σκόνης</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Αντιγραφή αλλαγής</translation>
</message>
@@ -974,18 +993,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 κλειδωμένο)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ναι</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">όχι</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Αυτή η ετικέτα γίνεται κόκκινη εάν οποιοσδήποτε παραλήπτης λάβει ένα ποσό μικρότερο από το τρέχον όριο σκόνης.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Μπορεί να ποικίλει +/-%1 satoshi(s) ανά είσοδο.</translation>
</message>
@@ -1026,7 +1033,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Can't list signers</source>
<translation type="unfinished">Αδυναμία απαρίθμησης εγγεγραμμένων </translation>
</message>
- </context>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">Βρέθηκαν πάρα πολλοί εξωτερικοί υπογράφοντες</translation>
+ </message>
+</context>
<context>
<name>LoadWalletsActivity</name>
<message>
@@ -1041,6 +1052,57 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Μετεγκατάσταση πορτοφολιού</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Είστε σίγουρος/η ότι θέλετε να μετεγκαταστήσετε το πορτοφόλι σας; &lt;i&gt;%1&lt;/i&gt;;</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Η μετεγκατάσταση του πορτοφολιού θα μετατρέψει αυτό το πορτοφόλι σε ένα ή περισσότερα περιγραφικά πορτοφόλια. Θα χρειαστεί να δημιουργηθεί ένα νέο αντίγραφο ασφαλείας πορτοφολιού.
+Εάν αυτό το πορτοφόλι περιέχει σενάρια μόνο για παρακολούθηση, θα δημιουργηθεί ένα νέο πορτοφόλι το οποίο περιέχει αυτά τα σενάρια παρακολούθησης.
+Εάν αυτό το πορτοφόλι περιέχει επιλύσιμα αλλά όχι για παρακολούθηση σενάρια, θα δημιουργηθεί ένα διαφορετικό και νέο πορτοφόλι που περιέχει αυτά τα σενάρια.
+
+Η διαδικασία μετεγκατάστασης θα δημιουργήσει ένα αντίγραφο ασφαλείας του πορτοφολιού πριν από τη μετεγκατάσταση. Αυτό το αρχείο αντιγράφου ασφαλείας θα ονομάζεται &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak και μπορεί να βρεθεί στον κατάλογο αυτού του πορτοφολιού. Σε περίπτωση εσφαλμένης μετεγκατάστασης, το αντίγραφο ασφαλείας μπορεί να αποκατασταθεί με τη λειτουργία "Επαναφορά Πορτοφολιού".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Μετεγκατάσταση Πορτοφολιού</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Μετεγκατάσταση Πορτοφολιού &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Το πορτοφόλι '%1' μετεγκαταστάθηκε επιτυχώς.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Τα σενάρια παρακολούθησης μόνο μετεγκαταστάθηκαν σε νέο πορτοφόλι ονόματι '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Τα επιλύσιμα αλλά όχι για παρακολούθηση σενάρια μετεγκαταστάθηκαν σε νέο πορτοφόλι ονόματι '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Αποτυχία μετεγκατάστασης</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Επιτυχής Μετεγκατάσταση</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1123,6 +1185,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Δημιουργία Πορτοφολιού</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Απέχετε ένα βήμα από τη δημιουργία του νέου σας πορτοφολιού!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Παρακαλώ εισαγάγετε ένα όνομα και, εάν θέλετε, ενεργοποιήστε τυχόν προηγμένες επιλογές</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Όνομα Πορτοφολιού</translation>
</message>
@@ -1159,14 +1229,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Δημιουργία Άδειου Πορτοφολιού</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">χρήση περιγραφέων για την διαχείριση του scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Πορτοφόλι Περιγραφέα </translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Χρησιμοποιήστε μια εξωτερική συσκευή υπογραφής, όπως ένα πορτοφόλι υλικού. Ρυθμίστε πρώτα στις προτιμήσεις του πορτοφολιού το εξωτερικό script υπογραφής.</translation>
</message>
@@ -1179,10 +1241,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Δημιουργία</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Μεταγλωτίστηκε χωρίς την υποστήριξη sqlite (απαραίτητη για περιγραφικά πορτοφόλια )</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Συντάχθηκε χωρίς την υποστήριξη εξωτερικής υπογραφής (απαιτείται για εξωτερική υπογραφή)</translation>
@@ -1305,8 +1363,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>(επαρκεί για την επαναφορά αντιγράφων ασφαλείας %n ημερών)</numerusform>
+ <numerusform>(επαρκεί για την επαναφορά αντιγράφων ασφαλείας %n ημερών)</numerusform>
</translation>
</message>
<message>
@@ -1346,6 +1404,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Αυτός ο αρχικός συγχρονισμός είναι πολύ απαιτητικός και μπορεί να εκθέσει προβλήματα υλικού με τον υπολογιστή σας, τα οποία προηγουμένως είχαν περάσει απαρατήρητα. Κάθε φορά που θα εκτελέσετε το %1, θα συνεχίσει να κατεβαίνει εκεί όπου έχει σταματήσει.</translation>
</message>
<message>
+ <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
+ <translation type="unfinished">Αφού πατήσετε OK, το %1 θα ξεκινήσει τη λήψη και την επεξεργασία της πλήρους αλυσίδας μπλοκ %4 (%2GB) ξεκινώντας με τις πρώτες συναλλαγές στο %3 όταν πρωτο-ξεκίνησε το %4.</translation>
+ </message>
+ <message>
<source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
<translation type="unfinished">Αν έχετε επιλέξει να περιορίσετε την αποθήκευση της αλυσίδας μπλοκ (κλάδεμα), τα ιστορικά δεδομένα θα πρέπει ακόμα να κατεβάσετε και να επεξεργαστείτε, αλλά θα διαγραφούν αργότερα για να διατηρήσετε τη χρήση του δίσκου σας χαμηλή.</translation>
</message>
@@ -1442,7 +1504,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
<translation type="unfinished">Άγνωστο. Συγχρονισμός επικεφαλίδων (%1, %2%)...</translation>
</message>
- </context>
+ <message>
+ <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Άγνωστο. Συγχρονισμός επικεφαλίδων (%1, %2%)...</translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -1486,6 +1552,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Αριθμός script και γραμμές επαλήθευσης</translation>
</message>
<message>
+ <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
+ <translation type="unfinished">Πλήρης διαδρομή ενός script συμβατού με το %1 (π.χ.: C:\Downloads\hwi.exe ή /Users/you/Downloads/hwi.py). Προσοχή: ένα κακόβουλο λογισμικό μπορεί να κλέψει τα νομίσματά σας!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">Διεύθυνση IP του διαμεσολαβητή (π.χ. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
@@ -1530,14 +1600,29 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Η επαναφορά αυτής της ρύθμισης απαιτεί εκ νέου λήψη ολόκληρου του μπλοκ αλυσίδας.</translation>
</message>
<message>
+ <source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
+ <extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
+ <translation type="unfinished">Μέγιστο μέγεθος βάσης δεδομένων προσωρινής μνήμης. Μια μεγαλύτερη προσωρινή μνήμη μπορεί να συμβάλει στον ταχύτερο συγχρονισμό, μετά τον οποίο το όφελος είναι λιγότερο έντονο για τις περισσότερες περιπτώσεις χρήσης. Η μείωση του μεγέθους της προσωρινής μνήμης θα μειώσει τη χρήση της μνήμης. Η αχρησιμοποίητη μνήμη mempool είναι κοινόχρηστη για αυτήν την προσωρινή μνήμη.</translation>
+ </message>
+ <message>
<source>MiB</source>
<translation type="unfinished">MebiBytes</translation>
</message>
<message>
+ <source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
+ <extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
+ <translation type="unfinished">Ορίστε τον αριθμό των νημάτων επαλήθευσης σεναρίου. Οι αρνητικές τιμές αντιστοιχούν στον αριθμό των πυρήνων που θέλετε να αφήσετε ελεύθερους στο σύστημα.</translation>
+ </message>
+ <message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
<translation type="unfinished">(0 = αυτόματο, &lt;0 = ελεύθεροι πυρήνες)</translation>
</message>
<message>
+ <source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
+ <extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
+ <translation type="unfinished">Αυτό επιτρέπει σε εσάς ή ένα εργαλείο τρίτων να επικοινωνεί με τον κόμβο μέσω κώδικα γραμμής εντολών και JSON-RPC.</translation>
+ </message>
+ <message>
<source>Enable R&amp;PC server</source>
<extracomment>An Options window setting to enable the RPC server.</extracomment>
<translation type="unfinished">Ενεργοποίηση R&amp;PC σέρβερ</translation>
@@ -1552,6 +1637,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Να τεθεί ο φόρος αφαίρεσης από το ποσό στην προκαθορισμένη τιμή ή οχι. </translation>
</message>
<message>
+ <source>Subtract &amp;fee from amount by default</source>
+ <extracomment>An Options window setting to set subtracting the fee from a sending amount as default.</extracomment>
+ <translation type="unfinished">Αφαιρέστε &amp;τέλος από το ποσό προεπιλογής</translation>
+ </message>
+ <message>
<source>Expert</source>
<translation type="unfinished">Έμπειρος</translation>
</message>
@@ -1573,10 +1663,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ενεργοποίηση ελέγχων &amp;PSBT</translation>
</message>
<message>
+ <source>Whether to show PSBT controls.</source>
+ <extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
+ <translation type="unfinished">Αν θα εμφανιστούν στοιχεία ελέγχου PSBT.</translation>
+ </message>
+ <message>
<source>External Signer (e.g. hardware wallet)</source>
<translation type="unfinished">Εξωτερική συσκευή υπογραφής (π.χ. πορτοφόλι υλικού)</translation>
</message>
<message>
+ <source>&amp;External signer script path</source>
+ <translation type="unfinished">&amp;Διαδρομή σεναρίου εξωτερικού υπογράφοντος</translation>
+ </message>
+ <message>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation type="unfinished">Αυτόματο άνοιγμα των θυρών Bitcoin στον δρομολογητή. Λειτουργεί μόνο αν ο δρομολογητής σας υποστηρίζει τη λειτουργία UPnP.</translation>
</message>
@@ -1669,6 +1768,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Διαλέξτε την προεπιλεγμένη υποδιαίρεση που θα εμφανίζεται όταν στέλνετε νομίσματα.</translation>
</message>
<message>
+ <source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
+ <translation type="unfinished">Διευθύνσεις URL τρίτων (π.χ. μπλοκ explorer) που εμφανίζονται στην καρτέλα συναλλαγών ως συμφραζόμενα στοιχεία μενού. %sστο URL αντικαθίσταται από κατακερματισμό συναλλαγής. Πολλαπλές διευθύνσεις URL διαχωρίζονται με κάθετη γραμμή |.</translation>
+ </message>
+ <message>
+ <source>&amp;Third-party transaction URLs</source>
+ <translation type="unfinished">&amp;Διευθύνσεις URL συναλλαγών τρίτων</translation>
+ </message>
+ <message>
<source>Whether to show coin control features or not.</source>
<translation type="unfinished">Επιλογή κατά πόσο να αναδείχνονται οι δυνατότητες ελέγχου κερμάτων.</translation>
</message>
@@ -1681,14 +1788,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Χρησιμοποιήστε ξεχωριστό διακομιστή μεσολάβησης SOCKS&amp;5 για σύνδεση με αποδέκτες μέσω των υπηρεσιών onion του Tor:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">ενσωματωμένο "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">πλησιέστερη αντιστοίχιση "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;ΟΚ</translation>
</message>
@@ -1720,6 +1819,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Χρειάζεται επανεκκίνηση του προγράμματος για να ενεργοποιηθούν οι αλλαγές.</translation>
</message>
<message>
+ <source>Current settings will be backed up at "%1".</source>
+ <extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
+ <translation type="unfinished">Θα δημιουργηθούν αντίγραφα ασφαλείας για τις τρέχουσες ρυθμίσεις στο "%1".</translation>
+ </message>
+ <message>
<source>Client will be shut down. Do you want to proceed?</source>
<extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
<translation type="unfinished">Ο πελάτης θα τερματιστεί. Θέλετε να συνεχίσετε?</translation>
@@ -1849,6 +1953,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>PSBTOperationsDialog</name>
<message>
+ <source>PSBT Operations</source>
+ <translation type="unfinished">Λειτουργίες PSBT</translation>
+ </message>
+ <message>
<source>Sign Tx</source>
<translation type="unfinished">Υπόγραψε Tx</translation>
</message>
@@ -1923,8 +2031,12 @@ ID Συναλλαγής: %1</translation>
<translation type="unfinished">PSBT αποθηκεύτηκε στο δίσκο.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Στέλνει %1 προς %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Αποστέλλει %1 στο %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">δική σας διεύθυνση</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -1994,6 +2106,14 @@ ID Συναλλαγής: %1</translation>
<translation type="unfinished">Το 'bitcoin://' δεν είναι έγκυρο URI. Αντ' αυτού χρησιμοποιήστε το 'bitcoin:'.</translation>
</message>
<message>
+ <source>Cannot process payment request because BIP70 is not supported.
+Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
+If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
+ <translation type="unfinished">Αδυναμία επεξεργασίας αιτήματος πληρωμής επειδή το BIP70 δεν υποστηρίζεται.
+Λόγω των εκτεταμένων ελαττωμάτων ασφαλείας στο BIP70, συνιστάται να αγνοούνται τυχόν οδηγίες του εμπόρου για αλλαγή πορτοφολιού.
+Εάν λαμβάνετε αυτό το σφάλμα, θα πρέπει να ζητήσετε από τον έμπορο να παρέχει ένα URI συμβατό με το BIP21.</translation>
+ </message>
+ <message>
<source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
<translation type="unfinished">Δεν είναι δυνατή η ανάλυση του URI! Αυτό μπορεί να προκληθεί από μη έγκυρη διεύθυνση Bitcoin ή παραμορφωμένες παραμέτρους URI.</translation>
</message>
@@ -2187,6 +2307,18 @@ ID Συναλλαγής: %1</translation>
<translation type="unfinished">Επιλέξτε έναν χρήστη για να δείτε αναλυτικές πληροφορίες.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Πρωτόκολλο μεταφοράς: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Μεταφορά</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Η συμβολοσειρά αναγνωριστικού περιόδου σύνδεσης BIP324 σε δεκαεξαδική μορφή, εάν υπάρχει.</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Έκδοση</translation>
</message>
@@ -2701,10 +2833,6 @@ ID Συναλλαγής: %1</translation>
<translation type="unfinished">Προσθήκες...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Σκόνη:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Επιλογή...</translation>
</message>
@@ -2781,10 +2909,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Αντιγραφή των bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Αντιγραφή σκόνης</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Αντιγραφή αλλαγής</translation>
</message>
@@ -2806,10 +2930,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Δη&amp;μιουργία Ανυπόγραφου</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">από πορτοφόλι '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 προς το '%2'</translation>
</message>
@@ -3290,10 +3410,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Δείκτης εξόδου</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Το πιστοποιητικό δεν επαληθεύτηκε)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Έμπορος</translation>
</message>
@@ -3392,10 +3508,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Αποστέλλονται προς</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Πληρωμή στον εαυτό σας</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Εξόρυξη</translation>
</message>
@@ -3471,10 +3583,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Αποστέλλονται προς</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Στον εαυτό σου</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Εξόρυξη</translation>
</message>
@@ -3758,10 +3866,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Διανέμεται υπό την άδεια χρήσης του λογισμικού MIT, δείτε το συνοδευτικό αρχείο %s ή %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Σφάλμα κατά την ανάγνωση %s! Όλα τα κλειδιά διαβάζονται σωστά, αλλά τα δεδομένα των συναλλαγών ή οι καταχωρίσεις του βιβλίου διευθύνσεων ενδέχεται να λείπουν ή να είναι εσφαλμένα.</translation>
- </message>
- <message>
<source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
<translation type="unfinished">Σφάλμα: Η καταγραφή του φορμά του αρχείου dump είναι εσφαλμένη. Ελήφθη: «%s», αναμενόταν: «φορμά».</translation>
</message>
@@ -4126,10 +4230,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Τα ποσά των συναλλαγών δεν πρέπει να είναι αρνητικά</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Η συναλλαγή έχει πολύ μακρά αλυσίδα mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Η συναλλαγή πρέπει να έχει τουλάχιστον έναν παραλήπτη</translation>
</message>
diff --git a/src/qt/locale/bitcoin_en.ts b/src/qt/locale/bitcoin_en.ts
index fcba44f809..01b428d46e 100644
--- a/src/qt/locale/bitcoin_en.ts
+++ b/src/qt/locale/bitcoin_en.ts
@@ -427,7 +427,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+412"/>
+ <location line="+417"/>
<source>Network activity disabled.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished"></translation>
@@ -438,7 +438,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-1194"/>
+ <location line="-1199"/>
<source>Send coins to a Bitcoin address</source>
<translation>Send coins to a Bitcoin address</translation>
</message>
@@ -553,7 +553,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation>Tabs toolbar</translation>
</message>
<message>
- <location line="+476"/>
+ <location line="+481"/>
<source>Syncing Headers (%1%)…</source>
<translation type="unfinished"></translation>
</message>
@@ -578,7 +578,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-852"/>
+ <location line="-857"/>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation type="unfinished"></translation>
</message>
@@ -598,7 +598,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
- <location line="+764"/>
+ <location line="+769"/>
<source>Processed %n block(s) of transaction history.</source>
<translation>
<numerusform>Processed %n block of transaction history.</numerusform>
@@ -646,7 +646,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation>Up to date</translation>
</message>
<message>
- <location line="-837"/>
+ <location line="-842"/>
<source>Ctrl+Q</source>
<translation type="unfinished"></translation>
</message>
@@ -802,7 +802,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+274"/>
+ <location line="+279"/>
<source>%1 client</source>
<translation type="unfinished"></translation>
</message>
@@ -1099,7 +1099,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+153"/>
+ <location line="+165"/>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished"></translation>
</message>
@@ -1416,7 +1416,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<translation type="unfinished">Bitcoin</translation>
</message>
<message numerus="yes">
- <location line="+162"/>
+ <location line="+164"/>
<source>%n GB of space available</source>
<translation type="unfinished">
<numerusform>%n GB of space available</numerusform>
@@ -1537,12 +1537,12 @@ The migration process will create a backup of the wallet before migrating. This
</message>
<message>
<location line="+2"/>
- <source> Watchonly scripts have been migrated to a new wallet named &apos;%1&apos;.</source>
+ <source>Watchonly scripts have been migrated to a new wallet named &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+3"/>
- <source> Solvable but not watched scripts have been migrated to a new wallet named &apos;%1&apos;.</source>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named &apos;%1&apos;.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -1747,7 +1747,12 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+227"/>
+ <location line="+107"/>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+45"/>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished"></translation>
</message>
@@ -1772,7 +1777,7 @@ The migration process will create a backup of the wallet before migrating. This
<translation>&amp;Reset Options</translation>
</message>
<message>
- <location line="-645"/>
+ <location line="-570"/>
<source>&amp;Network</source>
<translation>&amp;Network</translation>
</message>
@@ -2044,22 +2049,7 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+236"/>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+8"/>
- <source>embedded &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+49"/>
- <source>closest matching &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+206"/>
+ <location line="+424"/>
<source>&amp;OK</source>
<translation>&amp;OK</translation>
</message>
@@ -2069,7 +2059,7 @@ The migration process will create a backup of the wallet before migrating. This
<translation>&amp;Cancel</translation>
</message>
<message>
- <location filename="../optionsdialog.cpp" line="+96"/>
+ <location filename="../optionsdialog.cpp" line="+152"/>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>&quot;External signing&quot; means using devices such as hardware wallets.</extracomment>
<translation type="unfinished"></translation>
@@ -2080,25 +2070,25 @@ The migration process will create a backup of the wallet before migrating. This
<translation>default</translation>
</message>
<message>
- <location line="+86"/>
+ <location line="+74"/>
<source>none</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+107"/>
+ <location line="+109"/>
<source>Confirm options reset</source>
<extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
<translation>Confirm options reset</translation>
</message>
<message>
<location line="-9"/>
- <location line="+79"/>
+ <location line="+81"/>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-75"/>
+ <location line="-77"/>
<source>Current settings will be backed up at &quot;%1&quot;.</source>
<extracomment>Text explaining to the user that the client&apos;s current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location&apos;s path.</extracomment>
<translation type="unfinished"></translation>
@@ -2142,7 +2132,7 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+40"/>
+ <location line="+42"/>
<source>This change would require a client restart.</source>
<translation type="unfinished"></translation>
</message>
@@ -2155,7 +2145,7 @@ The migration process will create a backup of the wallet before migrating. This
<context>
<name>OptionsModel</name>
<message>
- <location filename="../optionsmodel.cpp" line="+198"/>
+ <location filename="../optionsmodel.cpp" line="+230"/>
<source>Could not read setting &quot;%1&quot;, %2.</source>
<translation type="unfinished"></translation>
</message>
@@ -2358,8 +2348,8 @@ The migration process will create a backup of the wallet before migrating. This
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+16"/>
- <source> * Sends %1 to %2</source>
+ <location line="+17"/>
+ <source>Sends %1 to %2</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -2647,7 +2637,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+13"/>
+ <location line="+12"/>
<location line="+12"/>
<source>%1 d</source>
<translation type="unfinished"></translation>
@@ -2747,7 +2737,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<location line="+2"/>
- <location filename="../rpcconsole.cpp" line="+1004"/>
+ <location filename="../rpcconsole.cpp" line="+1006"/>
<source>%1 kB</source>
<translation type="unfinished"></translation>
</message>
@@ -2775,12 +2765,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+395"/>
+ <location line="+423"/>
<source>Error: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+70"/>
+ <location line="+73"/>
<source>%1 didn&apos;t yet exit safely…</source>
<translation type="unfinished"></translation>
</message>
@@ -2789,6 +2779,21 @@ If you are receiving this error you should request the merchant provide a BIP21
<source>unknown</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <location filename="../optionsdialog.cpp" line="-389"/>
+ <source>Embedded &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Default system font &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Custom…</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QRImageWidget</name>
@@ -3293,7 +3298,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../rpcconsole.cpp" line="-473"/>
+ <location filename="../rpcconsole.cpp" line="-475"/>
<source>Inbound: initiated by peer</source>
<extracomment>Explanatory text for an inbound peer connection.</extracomment>
<translation type="unfinished"></translation>
@@ -3386,7 +3391,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+151"/>
+ <location line="+153"/>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished"></translation>
@@ -3458,7 +3463,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-330"/>
+ <location line="+18"/>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="-348"/>
<source>Executing command using &quot;%1&quot; wallet</source>
<translation type="unfinished"></translation>
</message>
@@ -4047,12 +4057,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+92"/>
- <source> from wallet &apos;%1&apos;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+11"/>
+ <location line="+103"/>
<source>%1 to &apos;%2&apos;</source>
<translation type="unfinished"></translation>
</message>
@@ -4122,7 +4127,12 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-6"/>
+ <location line="-30"/>
+ <source>%1 from wallet &apos;%2&apos;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+24"/>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished"></translation>
@@ -4363,7 +4373,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
<context>
<name>ShutdownWindow</name>
<message>
- <location filename="../utilitydialog.cpp" line="+85"/>
+ <location filename="../utilitydialog.cpp" line="+86"/>
<source>%1 is shutting down…</source>
<translation type="unfinished"></translation>
</message>
@@ -4771,7 +4781,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</message>
<message>
<location line="+16"/>
- <source> (Certificate was not verified)</source>
+ <source>%1 (Certificate was not verified)</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -4800,7 +4810,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+21"/>
+ <location line="+19"/>
<source>Amount</source>
<translation type="unfinished">Amount</translation>
</message>
@@ -5139,7 +5149,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+170"/>
+ <location line="+173"/>
<source>Range:</source>
<translation type="unfinished"></translation>
</message>
@@ -5235,13 +5245,13 @@ Go to File &gt; Open Wallet to load a wallet.
<context>
<name>WalletModel</name>
<message>
- <location filename="../walletmodel.cpp" line="+228"/>
+ <location filename="../walletmodel.cpp" line="+227"/>
<location line="+13"/>
<source>Send Coins</source>
<translation type="unfinished">Send Coins</translation>
</message>
<message>
- <location line="+247"/>
+ <location line="+254"/>
<location line="+55"/>
<location line="+15"/>
<location line="+5"/>
@@ -5833,6 +5843,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Error creating %s</source>
<translation type="unfinished"></translation>
</message>
@@ -5893,21 +5908,16 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
+ <source>Error starting db txn for wallet transactions removal</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
- <source>Error: Could not delete watchonly transactions</source>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+3"/>
<source>Error: Couldn&apos;t create cursor into database</source>
<translation type="unfinished"></translation>
</message>
@@ -5953,11 +5963,6 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location line="+1"/>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished"></translation>
</message>
@@ -5988,6 +5993,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Error: Unable to read wallet&apos;s best block locator record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished"></translation>
</message>
@@ -5998,6 +6008,26 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished"></translation>
</message>
@@ -6018,6 +6048,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+1"/>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished"></translation>
</message>
@@ -6293,22 +6328,22 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<location line="+1"/>
- <source>Transaction amount too small</source>
+ <source>Transaction %s does not belong to this wallet</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
- <source>Transaction amounts must not be negative</source>
+ <source>Transaction amount too small</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
- <source>Transaction change output index out of range</source>
+ <source>Transaction amounts must not be negative</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="+1"/>
- <source>Transaction has too long of a mempool chain</source>
+ <source>Transaction change output index out of range</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -6412,17 +6447,32 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+6"/>
+ <location line="+5"/>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+2"/>
<source>acceptstalefeeestimates is not supported on %s chain.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-5"/>
+ <location line="-6"/>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished"></translation>
</message>
<message>
+ <location line="-110"/>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location line="+1"/>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location line="+110"/>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished"></translation>
</message>
@@ -6437,12 +6487,12 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="+1"/>
+ <location line="+2"/>
<source>Wallet needed to be rewritten: restart %s to complete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location line="-44"/>
+ <location line="-45"/>
<source>Settings file could not be read</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src/qt/locale/bitcoin_en.xlf b/src/qt/locale/bitcoin_en.xlf
index b1a01cb4a1..2bab80e3dd 100644
--- a/src/qt/locale/bitcoin_en.xlf
+++ b/src/qt/locale/bitcoin_en.xlf
@@ -313,11 +313,11 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</trans-unit>
<trans-unit id="_msg68">
<source xml:space="preserve">Error: %1</source>
- <context-group purpose="location"><context context-type="linenumber">598</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">626</context></context-group>
</trans-unit>
<trans-unit id="_msg69">
<source xml:space="preserve">%1 didn&apos;t yet exit safely…</source>
- <context-group purpose="location"><context context-type="linenumber">668</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">699</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -381,12 +381,12 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</trans-unit>
<trans-unit id="_msg84">
<source xml:space="preserve">Network activity disabled.</source>
- <context-group purpose="location"><context context-type="linenumber">1001</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1006</context></context-group>
<note annotates="source" from="developer">A substring of the tooltip.</note>
</trans-unit>
<trans-unit id="_msg85">
<source xml:space="preserve">Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <context-group purpose="location"><context context-type="linenumber">1452</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1457</context></context-group>
</trans-unit>
<trans-unit id="_msg86">
<source xml:space="preserve">Send coins to a Bitcoin address</source>
@@ -482,23 +482,23 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</trans-unit>
<trans-unit id="_msg109">
<source xml:space="preserve">Syncing Headers (%1%)…</source>
- <context-group purpose="location"><context context-type="linenumber">1045</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1050</context></context-group>
</trans-unit>
<trans-unit id="_msg110">
<source xml:space="preserve">Synchronizing with network…</source>
- <context-group purpose="location"><context context-type="linenumber">1103</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1108</context></context-group>
</trans-unit>
<trans-unit id="_msg111">
<source xml:space="preserve">Indexing blocks on disk…</source>
- <context-group purpose="location"><context context-type="linenumber">1108</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1113</context></context-group>
</trans-unit>
<trans-unit id="_msg112">
<source xml:space="preserve">Processing blocks on disk…</source>
- <context-group purpose="location"><context context-type="linenumber">1110</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1115</context></context-group>
</trans-unit>
<trans-unit id="_msg113">
<source xml:space="preserve">Connecting to peers…</source>
- <context-group purpose="location"><context context-type="linenumber">1117</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1122</context></context-group>
</trans-unit>
<trans-unit id="_msg114">
<source xml:space="preserve">Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -517,7 +517,7 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
<context-group purpose="location"><context context-type="linenumber">362</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">1126</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1131</context></context-group>
<trans-unit id="_msg118[0]">
<source xml:space="preserve">Processed %n block(s) of transaction history.</source>
</trans-unit>
@@ -527,35 +527,35 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</group>
<trans-unit id="_msg119">
<source xml:space="preserve">%1 behind</source>
- <context-group purpose="location"><context context-type="linenumber">1149</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1154</context></context-group>
</trans-unit>
<trans-unit id="_msg120">
<source xml:space="preserve">Catching up…</source>
- <context-group purpose="location"><context context-type="linenumber">1154</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1159</context></context-group>
</trans-unit>
<trans-unit id="_msg121">
<source xml:space="preserve">Last received block was generated %1 ago.</source>
- <context-group purpose="location"><context context-type="linenumber">1173</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1178</context></context-group>
</trans-unit>
<trans-unit id="_msg122">
<source xml:space="preserve">Transactions after this will not yet be visible.</source>
- <context-group purpose="location"><context context-type="linenumber">1175</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1180</context></context-group>
</trans-unit>
<trans-unit id="_msg123">
<source xml:space="preserve">Error</source>
- <context-group purpose="location"><context context-type="linenumber">1215</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1220</context></context-group>
</trans-unit>
<trans-unit id="_msg124">
<source xml:space="preserve">Warning</source>
- <context-group purpose="location"><context context-type="linenumber">1219</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1224</context></context-group>
</trans-unit>
<trans-unit id="_msg125">
<source xml:space="preserve">Information</source>
- <context-group purpose="location"><context context-type="linenumber">1223</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1228</context></context-group>
</trans-unit>
<trans-unit id="_msg126">
<source xml:space="preserve">Up to date</source>
- <context-group purpose="location"><context context-type="linenumber">1130</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1135</context></context-group>
</trans-unit>
<trans-unit id="_msg127">
<source xml:space="preserve">Ctrl+Q</source>
@@ -685,18 +685,18 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</trans-unit>
<trans-unit id="_msg157">
<source xml:space="preserve">%1 client</source>
- <context-group purpose="location"><context context-type="linenumber">812</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">817</context></context-group>
</trans-unit>
<trans-unit id="_msg158">
<source xml:space="preserve">&amp;Hide</source>
- <context-group purpose="location"><context context-type="linenumber">880</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">885</context></context-group>
</trans-unit>
<trans-unit id="_msg159">
<source xml:space="preserve">S&amp;how</source>
- <context-group purpose="location"><context context-type="linenumber">881</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">886</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">998</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1003</context></context-group>
<note annotates="source" from="developer">A substring of the tooltip.</note>
<trans-unit id="_msg160[0]">
<source xml:space="preserve">%n active connection(s) to Bitcoin network.</source>
@@ -707,111 +707,111 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</group>
<trans-unit id="_msg161">
<source xml:space="preserve">Click for more actions.</source>
- <context-group purpose="location"><context context-type="linenumber">1008</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1013</context></context-group>
<note annotates="source" from="developer">A substring of the tooltip. &quot;More actions&quot; are available via the context menu.</note>
</trans-unit>
<trans-unit id="_msg162">
<source xml:space="preserve">Show Peers tab</source>
- <context-group purpose="location"><context context-type="linenumber">1025</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1030</context></context-group>
<note annotates="source" from="developer">A context menu item. The &quot;Peers tab&quot; is an element of the &quot;Node window&quot;.</note>
</trans-unit>
<trans-unit id="_msg163">
<source xml:space="preserve">Disable network activity</source>
- <context-group purpose="location"><context context-type="linenumber">1033</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1038</context></context-group>
<note annotates="source" from="developer">A context menu item.</note>
</trans-unit>
<trans-unit id="_msg164">
<source xml:space="preserve">Enable network activity</source>
- <context-group purpose="location"><context context-type="linenumber">1035</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1040</context></context-group>
<note annotates="source" from="developer">A context menu item. The network activity was disabled previously.</note>
</trans-unit>
<trans-unit id="_msg165">
<source xml:space="preserve">Pre-syncing Headers (%1%)…</source>
- <context-group purpose="location"><context context-type="linenumber">1052</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1057</context></context-group>
</trans-unit>
<trans-unit id="_msg166">
<source xml:space="preserve">Error creating wallet</source>
- <context-group purpose="location"><context context-type="linenumber">1191</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1196</context></context-group>
</trans-unit>
<trans-unit id="_msg167">
<source xml:space="preserve">Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
- <context-group purpose="location"><context context-type="linenumber">1191</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1196</context></context-group>
</trans-unit>
<trans-unit id="_msg168">
<source xml:space="preserve">Error: %1</source>
- <context-group purpose="location"><context context-type="linenumber">1216</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1221</context></context-group>
</trans-unit>
<trans-unit id="_msg169">
<source xml:space="preserve">Warning: %1</source>
- <context-group purpose="location"><context context-type="linenumber">1220</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1225</context></context-group>
</trans-unit>
<trans-unit id="_msg170">
<source xml:space="preserve">Date: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1328</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1333</context></context-group>
</trans-unit>
<trans-unit id="_msg171">
<source xml:space="preserve">Amount: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1329</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1334</context></context-group>
</trans-unit>
<trans-unit id="_msg172">
<source xml:space="preserve">Wallet: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1331</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1336</context></context-group>
</trans-unit>
<trans-unit id="_msg173">
<source xml:space="preserve">Type: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1333</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1338</context></context-group>
</trans-unit>
<trans-unit id="_msg174">
<source xml:space="preserve">Label: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1335</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1340</context></context-group>
</trans-unit>
<trans-unit id="_msg175">
<source xml:space="preserve">Address: %1
</source>
- <context-group purpose="location"><context context-type="linenumber">1337</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1342</context></context-group>
</trans-unit>
<trans-unit id="_msg176">
<source xml:space="preserve">Sent transaction</source>
- <context-group purpose="location"><context context-type="linenumber">1338</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1343</context></context-group>
</trans-unit>
<trans-unit id="_msg177">
<source xml:space="preserve">Incoming transaction</source>
- <context-group purpose="location"><context context-type="linenumber">1338</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1343</context></context-group>
</trans-unit>
<trans-unit id="_msg178">
<source xml:space="preserve">HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1390</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1395</context></context-group>
</trans-unit>
<trans-unit id="_msg179">
<source xml:space="preserve">HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1390</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1395</context></context-group>
</trans-unit>
<trans-unit id="_msg180">
<source xml:space="preserve">Private key &lt;b&gt;disabled&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1390</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1395</context></context-group>
</trans-unit>
<trans-unit id="_msg181">
<source xml:space="preserve">Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1413</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1418</context></context-group>
</trans-unit>
<trans-unit id="_msg182">
<source xml:space="preserve">Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <context-group purpose="location"><context context-type="linenumber">1421</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1426</context></context-group>
</trans-unit>
<trans-unit id="_msg183">
<source xml:space="preserve">Original message:</source>
- <context-group purpose="location"><context context-type="linenumber">1540</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1545</context></context-group>
</trans-unit>
</group>
<group restype="x-trolltech-linguist-context" resname="UnitDisplayStatusBarControl">
<trans-unit id="_msg184">
<source xml:space="preserve">Unit to show amounts in. Click to select another unit.</source>
- <context-group purpose="location"><context context-type="linenumber">1579</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1584</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -939,20 +939,20 @@ Signing is only possible with addresses of the type &apos;legacy&apos;.</source>
</trans-unit>
<trans-unit id="_msg214">
<source xml:space="preserve">Can vary +/- %1 satoshi(s) per input.</source>
- <context-group purpose="location"><context context-type="linenumber">524</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">536</context></context-group>
</trans-unit>
<trans-unit id="_msg215">
<source xml:space="preserve">(no label)</source>
- <context-group purpose="location"><context context-type="linenumber">569</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">623</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">581</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">635</context></context-group>
</trans-unit>
<trans-unit id="_msg216">
<source xml:space="preserve">change from %1 (%2)</source>
- <context-group purpose="location"><context context-type="linenumber">616</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">628</context></context-group>
</trans-unit>
<trans-unit id="_msg217">
<source xml:space="preserve">(change)</source>
- <context-group purpose="location"><context context-type="linenumber">617</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">629</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -1027,11 +1027,11 @@ The migration process will create a backup of the wallet before migrating. This
<context-group purpose="location"><context context-type="linenumber">473</context></context-group>
</trans-unit>
<trans-unit id="_msg232">
- <source xml:space="preserve"> Watchonly scripts have been migrated to a new wallet named &apos;%1&apos;.</source>
+ <source xml:space="preserve">Watchonly scripts have been migrated to a new wallet named &apos;%1&apos;.</source>
<context-group purpose="location"><context context-type="linenumber">475</context></context-group>
</trans-unit>
<trans-unit id="_msg233">
- <source xml:space="preserve"> Solvable but not watched scripts have been migrated to a new wallet named &apos;%1&apos;.</source>
+ <source xml:space="preserve">Solvable but not watched scripts have been migrated to a new wallet named &apos;%1&apos;.</source>
<context-group purpose="location"><context context-type="linenumber">478</context></context-group>
</trans-unit>
<trans-unit id="_msg234">
@@ -1279,7 +1279,7 @@ The migration process will create a backup of the wallet before migrating. This
<context-group purpose="location"><context context-type="linenumber">139</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">301</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">303</context></context-group>
<trans-unit id="_msg286[0]">
<source xml:space="preserve">%n GB of space available</source>
</trans-unit>
@@ -1288,7 +1288,7 @@ The migration process will create a backup of the wallet before migrating. This
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">303</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">305</context></context-group>
<trans-unit id="_msg287[0]">
<source xml:space="preserve">(of %n GB needed)</source>
</trans-unit>
@@ -1297,7 +1297,7 @@ The migration process will create a backup of the wallet before migrating. This
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">306</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">308</context></context-group>
<trans-unit id="_msg288[0]">
<source xml:space="preserve">(%n GB needed for full chain)</source>
</trans-unit>
@@ -1307,18 +1307,18 @@ The migration process will create a backup of the wallet before migrating. This
</group>
<trans-unit id="_msg289">
<source xml:space="preserve">Choose data directory</source>
- <context-group purpose="location"><context context-type="linenumber">323</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">325</context></context-group>
</trans-unit>
<trans-unit id="_msg290">
<source xml:space="preserve">At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <context-group purpose="location"><context context-type="linenumber">378</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">380</context></context-group>
</trans-unit>
<trans-unit id="_msg291">
<source xml:space="preserve">Approximately %1 GB of data will be stored in this directory.</source>
- <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">383</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">390</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">392</context></context-group>
<note annotates="source" from="developer">Explanatory text on the capability of the current prune target.</note>
<trans-unit id="_msg292[0]">
<source xml:space="preserve">(sufficient to restore backups %n day(s) old)</source>
@@ -1329,19 +1329,19 @@ The migration process will create a backup of the wallet before migrating. This
</group>
<trans-unit id="_msg293">
<source xml:space="preserve">%1 will download and store a copy of the Bitcoin block chain.</source>
- <context-group purpose="location"><context context-type="linenumber">392</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">394</context></context-group>
</trans-unit>
<trans-unit id="_msg294">
<source xml:space="preserve">The wallet will also be stored in this directory.</source>
- <context-group purpose="location"><context context-type="linenumber">394</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">396</context></context-group>
</trans-unit>
<trans-unit id="_msg295">
<source xml:space="preserve">Error: Specified data directory &quot;%1&quot; cannot be created.</source>
- <context-group purpose="location"><context context-type="linenumber">250</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">252</context></context-group>
</trans-unit>
<trans-unit id="_msg296">
<source xml:space="preserve">Error</source>
- <context-group purpose="location"><context context-type="linenumber">280</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">282</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -1363,11 +1363,11 @@ The migration process will create a backup of the wallet before migrating. This
<group restype="x-trolltech-linguist-context" resname="ShutdownWindow">
<trans-unit id="_msg300">
<source xml:space="preserve">%1 is shutting down…</source>
- <context-group purpose="location"><context context-type="linenumber">145</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
<trans-unit id="_msg301">
<source xml:space="preserve">Do not shut down the computer until this window disappears.</source>
- <context-group purpose="location"><context context-type="linenumber">146</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">147</context></context-group>
</trans-unit>
</group>
</body></file>
@@ -1563,419 +1563,425 @@ The migration process will create a backup of the wallet before migrating. This
<context-group purpose="location"><context context-type="linenumber">672</context></context-group>
</trans-unit>
<trans-unit id="_msg343">
- <source xml:space="preserve">Options set in this dialog are overridden by the command line:</source>
- <context-group purpose="location"><context context-type="linenumber">899</context></context-group>
+ <source xml:space="preserve">Font in the Overview tab: </source>
+ <context-group purpose="location"><context context-type="linenumber">779</context></context-group>
</trans-unit>
<trans-unit id="_msg344">
- <source xml:space="preserve">Open the %1 configuration file from the working directory.</source>
- <context-group purpose="location"><context context-type="linenumber">944</context></context-group>
+ <source xml:space="preserve">Options set in this dialog are overridden by the command line:</source>
+ <context-group purpose="location"><context context-type="linenumber">824</context></context-group>
</trans-unit>
<trans-unit id="_msg345">
- <source xml:space="preserve">Open Configuration File</source>
- <context-group purpose="location"><context context-type="linenumber">947</context></context-group>
+ <source xml:space="preserve">Open the %1 configuration file from the working directory.</source>
+ <context-group purpose="location"><context context-type="linenumber">869</context></context-group>
</trans-unit>
<trans-unit id="_msg346">
- <source xml:space="preserve">Reset all client options to default.</source>
- <context-group purpose="location"><context context-type="linenumber">957</context></context-group>
+ <source xml:space="preserve">Open Configuration File</source>
+ <context-group purpose="location"><context context-type="linenumber">872</context></context-group>
</trans-unit>
<trans-unit id="_msg347">
- <source xml:space="preserve">&amp;Reset Options</source>
- <context-group purpose="location"><context context-type="linenumber">960</context></context-group>
+ <source xml:space="preserve">Reset all client options to default.</source>
+ <context-group purpose="location"><context context-type="linenumber">882</context></context-group>
</trans-unit>
<trans-unit id="_msg348">
+ <source xml:space="preserve">&amp;Reset Options</source>
+ <context-group purpose="location"><context context-type="linenumber">885</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg349">
<source xml:space="preserve">&amp;Network</source>
<context-group purpose="location"><context context-type="linenumber">315</context></context-group>
</trans-unit>
- <trans-unit id="_msg349">
+ <trans-unit id="_msg350">
<source xml:space="preserve">Prune &amp;block storage to</source>
<context-group purpose="location"><context context-type="linenumber">61</context></context-group>
</trans-unit>
- <trans-unit id="_msg350">
+ <trans-unit id="_msg351">
<source xml:space="preserve">GB</source>
<context-group purpose="location"><context context-type="linenumber">71</context></context-group>
</trans-unit>
- <trans-unit id="_msg351">
+ <trans-unit id="_msg352">
<source xml:space="preserve">Reverting this setting requires re-downloading the entire blockchain.</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg352">
+ <trans-unit id="_msg353">
<source xml:space="preserve">Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
<context-group purpose="location"><context context-type="linenumber">108</context></context-group>
<note annotates="source" from="developer">Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</note>
</trans-unit>
- <trans-unit id="_msg353">
+ <trans-unit id="_msg354">
<source xml:space="preserve">MiB</source>
<context-group purpose="location"><context context-type="linenumber">127</context></context-group>
</trans-unit>
- <trans-unit id="_msg354">
+ <trans-unit id="_msg355">
<source xml:space="preserve">Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
<context-group purpose="location"><context context-type="linenumber">154</context></context-group>
<note annotates="source" from="developer">Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</note>
</trans-unit>
- <trans-unit id="_msg355">
+ <trans-unit id="_msg356">
<source xml:space="preserve">(0 = auto, &lt;0 = leave that many cores free)</source>
<context-group purpose="location"><context context-type="linenumber">170</context></context-group>
</trans-unit>
- <trans-unit id="_msg356">
+ <trans-unit id="_msg357">
<source xml:space="preserve">This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
<context-group purpose="location"><context context-type="linenumber">192</context></context-group>
<note annotates="source" from="developer">Tooltip text for Options window setting that enables the RPC server.</note>
</trans-unit>
- <trans-unit id="_msg357">
+ <trans-unit id="_msg358">
<source xml:space="preserve">Enable R&amp;PC server</source>
<context-group purpose="location"><context context-type="linenumber">195</context></context-group>
<note annotates="source" from="developer">An Options window setting to enable the RPC server.</note>
</trans-unit>
- <trans-unit id="_msg358">
+ <trans-unit id="_msg359">
<source xml:space="preserve">W&amp;allet</source>
<context-group purpose="location"><context context-type="linenumber">216</context></context-group>
</trans-unit>
- <trans-unit id="_msg359">
+ <trans-unit id="_msg360">
<source xml:space="preserve">Whether to set subtract fee from amount as default or not.</source>
<context-group purpose="location"><context context-type="linenumber">222</context></context-group>
<note annotates="source" from="developer">Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</note>
</trans-unit>
- <trans-unit id="_msg360">
+ <trans-unit id="_msg361">
<source xml:space="preserve">Subtract &amp;fee from amount by default</source>
<context-group purpose="location"><context context-type="linenumber">225</context></context-group>
<note annotates="source" from="developer">An Options window setting to set subtracting the fee from a sending amount as default.</note>
</trans-unit>
- <trans-unit id="_msg361">
+ <trans-unit id="_msg362">
<source xml:space="preserve">Expert</source>
<context-group purpose="location"><context context-type="linenumber">232</context></context-group>
</trans-unit>
- <trans-unit id="_msg362">
+ <trans-unit id="_msg363">
<source xml:space="preserve">Enable coin &amp;control features</source>
<context-group purpose="location"><context context-type="linenumber">241</context></context-group>
</trans-unit>
- <trans-unit id="_msg363">
+ <trans-unit id="_msg364">
<source xml:space="preserve">If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<context-group purpose="location"><context context-type="linenumber">248</context></context-group>
</trans-unit>
- <trans-unit id="_msg364">
+ <trans-unit id="_msg365">
<source xml:space="preserve">&amp;Spend unconfirmed change</source>
<context-group purpose="location"><context context-type="linenumber">251</context></context-group>
</trans-unit>
- <trans-unit id="_msg365">
+ <trans-unit id="_msg366">
<source xml:space="preserve">Enable &amp;PSBT controls</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
<note annotates="source" from="developer">An options window setting to enable PSBT controls.</note>
</trans-unit>
- <trans-unit id="_msg366">
+ <trans-unit id="_msg367">
<source xml:space="preserve">Whether to show PSBT controls.</source>
<context-group purpose="location"><context context-type="linenumber">261</context></context-group>
<note annotates="source" from="developer">Tooltip text for options window setting that enables PSBT controls.</note>
</trans-unit>
- <trans-unit id="_msg367">
+ <trans-unit id="_msg368">
<source xml:space="preserve">External Signer (e.g. hardware wallet)</source>
<context-group purpose="location"><context context-type="linenumber">271</context></context-group>
</trans-unit>
- <trans-unit id="_msg368">
+ <trans-unit id="_msg369">
<source xml:space="preserve">&amp;External signer script path</source>
<context-group purpose="location"><context context-type="linenumber">279</context></context-group>
</trans-unit>
- <trans-unit id="_msg369">
+ <trans-unit id="_msg370">
<source xml:space="preserve">Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg370">
+ <trans-unit id="_msg371">
<source xml:space="preserve">Map port using &amp;UPnP</source>
<context-group purpose="location"><context context-type="linenumber">324</context></context-group>
</trans-unit>
- <trans-unit id="_msg371">
+ <trans-unit id="_msg372">
<source xml:space="preserve">Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
<context-group purpose="location"><context context-type="linenumber">331</context></context-group>
</trans-unit>
- <trans-unit id="_msg372">
+ <trans-unit id="_msg373">
<source xml:space="preserve">Map port using NA&amp;T-PMP</source>
<context-group purpose="location"><context context-type="linenumber">334</context></context-group>
</trans-unit>
- <trans-unit id="_msg373">
+ <trans-unit id="_msg374">
<source xml:space="preserve">Accept connections from outside.</source>
<context-group purpose="location"><context context-type="linenumber">341</context></context-group>
</trans-unit>
- <trans-unit id="_msg374">
+ <trans-unit id="_msg375">
<source xml:space="preserve">Allow incomin&amp;g connections</source>
<context-group purpose="location"><context context-type="linenumber">344</context></context-group>
</trans-unit>
- <trans-unit id="_msg375">
+ <trans-unit id="_msg376">
<source xml:space="preserve">Connect to the Bitcoin network through a SOCKS5 proxy.</source>
<context-group purpose="location"><context context-type="linenumber">351</context></context-group>
</trans-unit>
- <trans-unit id="_msg376">
+ <trans-unit id="_msg377">
<source xml:space="preserve">&amp;Connect through SOCKS5 proxy (default proxy):</source>
<context-group purpose="location"><context context-type="linenumber">354</context></context-group>
</trans-unit>
- <trans-unit id="_msg377">
+ <trans-unit id="_msg378">
<source xml:space="preserve">Proxy &amp;IP:</source>
<context-group purpose="location"><context context-type="linenumber">363</context></context-group>
<context-group purpose="location"><context context-type="linenumber">550</context></context-group>
</trans-unit>
- <trans-unit id="_msg378">
+ <trans-unit id="_msg379">
<source xml:space="preserve">&amp;Port:</source>
<context-group purpose="location"><context context-type="linenumber">395</context></context-group>
<context-group purpose="location"><context context-type="linenumber">582</context></context-group>
</trans-unit>
- <trans-unit id="_msg379">
+ <trans-unit id="_msg380">
<source xml:space="preserve">Port of the proxy (e.g. 9050)</source>
<context-group purpose="location"><context context-type="linenumber">420</context></context-group>
<context-group purpose="location"><context context-type="linenumber">607</context></context-group>
</trans-unit>
- <trans-unit id="_msg380">
+ <trans-unit id="_msg381">
<source xml:space="preserve">Used for reaching peers via:</source>
<context-group purpose="location"><context context-type="linenumber">444</context></context-group>
</trans-unit>
- <trans-unit id="_msg381">
+ <trans-unit id="_msg382">
<source xml:space="preserve">IPv4</source>
<context-group purpose="location"><context context-type="linenumber">467</context></context-group>
</trans-unit>
- <trans-unit id="_msg382">
+ <trans-unit id="_msg383">
<source xml:space="preserve">IPv6</source>
<context-group purpose="location"><context context-type="linenumber">490</context></context-group>
</trans-unit>
- <trans-unit id="_msg383">
+ <trans-unit id="_msg384">
<source xml:space="preserve">Tor</source>
<context-group purpose="location"><context context-type="linenumber">513</context></context-group>
</trans-unit>
- <trans-unit id="_msg384">
+ <trans-unit id="_msg385">
<source xml:space="preserve">&amp;Window</source>
<context-group purpose="location"><context context-type="linenumber">643</context></context-group>
</trans-unit>
- <trans-unit id="_msg385">
+ <trans-unit id="_msg386">
<source xml:space="preserve">Show the icon in the system tray.</source>
<context-group purpose="location"><context context-type="linenumber">649</context></context-group>
</trans-unit>
- <trans-unit id="_msg386">
+ <trans-unit id="_msg387">
<source xml:space="preserve">&amp;Show tray icon</source>
<context-group purpose="location"><context context-type="linenumber">652</context></context-group>
</trans-unit>
- <trans-unit id="_msg387">
+ <trans-unit id="_msg388">
<source xml:space="preserve">Show only a tray icon after minimizing the window.</source>
<context-group purpose="location"><context context-type="linenumber">662</context></context-group>
</trans-unit>
- <trans-unit id="_msg388">
+ <trans-unit id="_msg389">
<source xml:space="preserve">&amp;Minimize to the tray instead of the taskbar</source>
<context-group purpose="location"><context context-type="linenumber">665</context></context-group>
</trans-unit>
- <trans-unit id="_msg389">
+ <trans-unit id="_msg390">
<source xml:space="preserve">M&amp;inimize on close</source>
<context-group purpose="location"><context context-type="linenumber">675</context></context-group>
</trans-unit>
- <trans-unit id="_msg390">
+ <trans-unit id="_msg391">
<source xml:space="preserve">&amp;Display</source>
<context-group purpose="location"><context context-type="linenumber">696</context></context-group>
</trans-unit>
- <trans-unit id="_msg391">
+ <trans-unit id="_msg392">
<source xml:space="preserve">User Interface &amp;language:</source>
<context-group purpose="location"><context context-type="linenumber">704</context></context-group>
</trans-unit>
- <trans-unit id="_msg392">
+ <trans-unit id="_msg393">
<source xml:space="preserve">The user interface language can be set here. This setting will take effect after restarting %1.</source>
<context-group purpose="location"><context context-type="linenumber">717</context></context-group>
</trans-unit>
- <trans-unit id="_msg393">
+ <trans-unit id="_msg394">
<source xml:space="preserve">&amp;Unit to show amounts in:</source>
<context-group purpose="location"><context context-type="linenumber">728</context></context-group>
</trans-unit>
- <trans-unit id="_msg394">
+ <trans-unit id="_msg395">
<source xml:space="preserve">Choose the default subdivision unit to show in the interface and when sending coins.</source>
<context-group purpose="location"><context context-type="linenumber">741</context></context-group>
</trans-unit>
- <trans-unit id="_msg395">
+ <trans-unit id="_msg396">
<source xml:space="preserve">Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
<context-group purpose="location"><context context-type="linenumber">752</context></context-group>
<context-group purpose="location"><context context-type="linenumber">765</context></context-group>
</trans-unit>
- <trans-unit id="_msg396">
+ <trans-unit id="_msg397">
<source xml:space="preserve">&amp;Third-party transaction URLs</source>
<context-group purpose="location"><context context-type="linenumber">755</context></context-group>
</trans-unit>
- <trans-unit id="_msg397">
+ <trans-unit id="_msg398">
<source xml:space="preserve">Whether to show coin control features or not.</source>
<context-group purpose="location"><context context-type="linenumber">238</context></context-group>
</trans-unit>
- <trans-unit id="_msg398">
+ <trans-unit id="_msg399">
<source xml:space="preserve">Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<context-group purpose="location"><context context-type="linenumber">538</context></context-group>
</trans-unit>
- <trans-unit id="_msg399">
+ <trans-unit id="_msg400">
<source xml:space="preserve">Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
<context-group purpose="location"><context context-type="linenumber">541</context></context-group>
</trans-unit>
- <trans-unit id="_msg400">
- <source xml:space="preserve">Monospaced font in the Overview tab:</source>
- <context-group purpose="location"><context context-type="linenumber">777</context></context-group>
- </trans-unit>
<trans-unit id="_msg401">
- <source xml:space="preserve">embedded &quot;%1&quot;</source>
- <context-group purpose="location"><context context-type="linenumber">785</context></context-group>
- </trans-unit>
- <trans-unit id="_msg402">
- <source xml:space="preserve">closest matching &quot;%1&quot;</source>
- <context-group purpose="location"><context context-type="linenumber">834</context></context-group>
- </trans-unit>
- <trans-unit id="_msg403">
<source xml:space="preserve">&amp;OK</source>
- <context-group purpose="location"><context context-type="linenumber">1040</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">965</context></context-group>
</trans-unit>
- <trans-unit id="_msg404">
+ <trans-unit id="_msg402">
<source xml:space="preserve">&amp;Cancel</source>
- <context-group purpose="location"><context context-type="linenumber">1053</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">978</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../optionsdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="OptionsDialog">
- <trans-unit id="_msg405">
+ <trans-unit id="_msg403">
<source xml:space="preserve">Compiled without external signing support (required for external signing)</source>
- <context-group purpose="location"><context context-type="linenumber">96</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">152</context></context-group>
<note annotates="source" from="developer">&quot;External signing&quot; means using devices such as hardware wallets.</note>
</trans-unit>
- <trans-unit id="_msg406">
+ <trans-unit id="_msg404">
<source xml:space="preserve">default</source>
- <context-group purpose="location"><context context-type="linenumber">108</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">164</context></context-group>
</trans-unit>
- <trans-unit id="_msg407">
+ <trans-unit id="_msg405">
<source xml:space="preserve">none</source>
- <context-group purpose="location"><context context-type="linenumber">194</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">238</context></context-group>
</trans-unit>
- <trans-unit id="_msg408">
+ <trans-unit id="_msg406">
<source xml:space="preserve">Confirm options reset</source>
- <context-group purpose="location"><context context-type="linenumber">301</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
<note annotates="source" from="developer">Window title text of pop-up window shown when the user has chosen to reset options.</note>
</trans-unit>
- <trans-unit id="_msg409">
+ <trans-unit id="_msg407">
<source xml:space="preserve">Client restart required to activate changes.</source>
- <context-group purpose="location"><context context-type="linenumber">292</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">338</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">419</context></context-group>
<note annotates="source" from="developer">Text explaining that the settings changed will not come into effect until the client is restarted.</note>
</trans-unit>
- <trans-unit id="_msg410">
+ <trans-unit id="_msg408">
<source xml:space="preserve">Current settings will be backed up at &quot;%1&quot;.</source>
- <context-group purpose="location"><context context-type="linenumber">296</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">342</context></context-group>
<note annotates="source" from="developer">Text explaining to the user that the client&apos;s current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location&apos;s path.</note>
</trans-unit>
- <trans-unit id="_msg411">
+ <trans-unit id="_msg409">
<source xml:space="preserve">Client will be shut down. Do you want to proceed?</source>
- <context-group purpose="location"><context context-type="linenumber">299</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
<note annotates="source" from="developer">Text asking the user to confirm if they would like to proceed with a client shutdown.</note>
</trans-unit>
- <trans-unit id="_msg412">
+ <trans-unit id="_msg410">
<source xml:space="preserve">Configuration options</source>
- <context-group purpose="location"><context context-type="linenumber">319</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">365</context></context-group>
<note annotates="source" from="developer">Window title text of pop-up box that allows opening up of configuration file.</note>
</trans-unit>
- <trans-unit id="_msg413">
+ <trans-unit id="_msg411">
<source xml:space="preserve">The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
- <context-group purpose="location"><context context-type="linenumber">322</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">368</context></context-group>
<note annotates="source" from="developer">Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</note>
</trans-unit>
- <trans-unit id="_msg414">
+ <trans-unit id="_msg412">
<source xml:space="preserve">Continue</source>
- <context-group purpose="location"><context context-type="linenumber">325</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">371</context></context-group>
</trans-unit>
- <trans-unit id="_msg415">
+ <trans-unit id="_msg413">
<source xml:space="preserve">Cancel</source>
- <context-group purpose="location"><context context-type="linenumber">326</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">372</context></context-group>
</trans-unit>
- <trans-unit id="_msg416">
+ <trans-unit id="_msg414">
<source xml:space="preserve">Error</source>
- <context-group purpose="location"><context context-type="linenumber">335</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg417">
+ <trans-unit id="_msg415">
<source xml:space="preserve">The configuration file could not be opened.</source>
- <context-group purpose="location"><context context-type="linenumber">335</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg418">
+ <trans-unit id="_msg416">
<source xml:space="preserve">This change would require a client restart.</source>
- <context-group purpose="location"><context context-type="linenumber">375</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">423</context></context-group>
</trans-unit>
- <trans-unit id="_msg419">
+ <trans-unit id="_msg417">
<source xml:space="preserve">The supplied proxy address is invalid.</source>
- <context-group purpose="location"><context context-type="linenumber">403</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">451</context></context-group>
+ </trans-unit>
+ </group>
+ <group restype="x-trolltech-linguist-context" resname="QObject">
+ <trans-unit id="_msg418">
+ <source xml:space="preserve">Embedded &quot;%1&quot;</source>
+ <context-group purpose="location"><context context-type="linenumber">62</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg419">
+ <source xml:space="preserve">Default system font &quot;%1&quot;</source>
+ <context-group purpose="location"><context context-type="linenumber">63</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg420">
+ <source xml:space="preserve">Custom…</source>
+ <context-group purpose="location"><context context-type="linenumber">64</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../optionsmodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="OptionsModel">
- <trans-unit id="_msg420">
+ <trans-unit id="_msg421">
<source xml:space="preserve">Could not read setting &quot;%1&quot;, %2.</source>
- <context-group purpose="location"><context context-type="linenumber">198</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">230</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../forms/overviewpage.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="OverviewPage">
- <trans-unit id="_msg421">
+ <trans-unit id="_msg422">
<source xml:space="preserve">Form</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg422">
+ <trans-unit id="_msg423">
<source xml:space="preserve">The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
<context-group purpose="location"><context context-type="linenumber">76</context></context-group>
<context-group purpose="location"><context context-type="linenumber">411</context></context-group>
</trans-unit>
- <trans-unit id="_msg423">
+ <trans-unit id="_msg424">
<source xml:space="preserve">Watch-only:</source>
<context-group purpose="location"><context context-type="linenumber">284</context></context-group>
</trans-unit>
- <trans-unit id="_msg424">
+ <trans-unit id="_msg425">
<source xml:space="preserve">Available:</source>
<context-group purpose="location"><context context-type="linenumber">294</context></context-group>
</trans-unit>
- <trans-unit id="_msg425">
+ <trans-unit id="_msg426">
<source xml:space="preserve">Your current spendable balance</source>
<context-group purpose="location"><context context-type="linenumber">304</context></context-group>
</trans-unit>
- <trans-unit id="_msg426">
+ <trans-unit id="_msg427">
<source xml:space="preserve">Pending:</source>
<context-group purpose="location"><context context-type="linenumber">339</context></context-group>
</trans-unit>
- <trans-unit id="_msg427">
+ <trans-unit id="_msg428">
<source xml:space="preserve">Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
<context-group purpose="location"><context context-type="linenumber">139</context></context-group>
</trans-unit>
- <trans-unit id="_msg428">
+ <trans-unit id="_msg429">
<source xml:space="preserve">Immature:</source>
<context-group purpose="location"><context context-type="linenumber">239</context></context-group>
</trans-unit>
- <trans-unit id="_msg429">
+ <trans-unit id="_msg430">
<source xml:space="preserve">Mined balance that has not yet matured</source>
<context-group purpose="location"><context context-type="linenumber">210</context></context-group>
</trans-unit>
- <trans-unit id="_msg430">
+ <trans-unit id="_msg431">
<source xml:space="preserve">Balances</source>
<context-group purpose="location"><context context-type="linenumber">60</context></context-group>
</trans-unit>
- <trans-unit id="_msg431">
+ <trans-unit id="_msg432">
<source xml:space="preserve">Total:</source>
<context-group purpose="location"><context context-type="linenumber">200</context></context-group>
</trans-unit>
- <trans-unit id="_msg432">
+ <trans-unit id="_msg433">
<source xml:space="preserve">Your current total balance</source>
<context-group purpose="location"><context context-type="linenumber">249</context></context-group>
</trans-unit>
- <trans-unit id="_msg433">
+ <trans-unit id="_msg434">
<source xml:space="preserve">Your current balance in watch-only addresses</source>
<context-group purpose="location"><context context-type="linenumber">323</context></context-group>
</trans-unit>
- <trans-unit id="_msg434">
+ <trans-unit id="_msg435">
<source xml:space="preserve">Spendable:</source>
<context-group purpose="location"><context context-type="linenumber">346</context></context-group>
</trans-unit>
- <trans-unit id="_msg435">
+ <trans-unit id="_msg436">
<source xml:space="preserve">Recent transactions</source>
<context-group purpose="location"><context context-type="linenumber">395</context></context-group>
</trans-unit>
- <trans-unit id="_msg436">
+ <trans-unit id="_msg437">
<source xml:space="preserve">Unconfirmed transactions to watch-only addresses</source>
<context-group purpose="location"><context context-type="linenumber">120</context></context-group>
</trans-unit>
- <trans-unit id="_msg437">
+ <trans-unit id="_msg438">
<source xml:space="preserve">Mined balance in watch-only addresses that has not yet matured</source>
<context-group purpose="location"><context context-type="linenumber">158</context></context-group>
</trans-unit>
- <trans-unit id="_msg438">
+ <trans-unit id="_msg439">
<source xml:space="preserve">Current total balance in watch-only addresses</source>
<context-group purpose="location"><context context-type="linenumber">268</context></context-group>
</trans-unit>
@@ -1983,7 +1989,7 @@ The migration process will create a backup of the wallet before migrating. This
</body></file>
<file original="../overviewpage.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="OverviewPage">
- <trans-unit id="_msg439">
+ <trans-unit id="_msg440">
<source xml:space="preserve">Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
<context-group purpose="location"><context context-type="linenumber">184</context></context-group>
</trans-unit>
@@ -1991,27 +1997,27 @@ The migration process will create a backup of the wallet before migrating. This
</body></file>
<file original="../forms/psbtoperationsdialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="PSBTOperationsDialog">
- <trans-unit id="_msg440">
+ <trans-unit id="_msg441">
<source xml:space="preserve">PSBT Operations</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg441">
+ <trans-unit id="_msg442">
<source xml:space="preserve">Sign Tx</source>
<context-group purpose="location"><context context-type="linenumber">86</context></context-group>
</trans-unit>
- <trans-unit id="_msg442">
+ <trans-unit id="_msg443">
<source xml:space="preserve">Broadcast Tx</source>
<context-group purpose="location"><context context-type="linenumber">102</context></context-group>
</trans-unit>
- <trans-unit id="_msg443">
+ <trans-unit id="_msg444">
<source xml:space="preserve">Copy to Clipboard</source>
<context-group purpose="location"><context context-type="linenumber">122</context></context-group>
</trans-unit>
- <trans-unit id="_msg444">
+ <trans-unit id="_msg445">
<source xml:space="preserve">Save…</source>
<context-group purpose="location"><context context-type="linenumber">129</context></context-group>
</trans-unit>
- <trans-unit id="_msg445">
+ <trans-unit id="_msg446">
<source xml:space="preserve">Close</source>
<context-group purpose="location"><context context-type="linenumber">136</context></context-group>
</trans-unit>
@@ -2019,150 +2025,150 @@ The migration process will create a backup of the wallet before migrating. This
</body></file>
<file original="../psbtoperationsdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="PSBTOperationsDialog">
- <trans-unit id="_msg446">
+ <trans-unit id="_msg447">
<source xml:space="preserve">Failed to load transaction: %1</source>
<context-group purpose="location"><context context-type="linenumber">60</context></context-group>
</trans-unit>
- <trans-unit id="_msg447">
+ <trans-unit id="_msg448">
<source xml:space="preserve">Failed to sign transaction: %1</source>
<context-group purpose="location"><context context-type="linenumber">85</context></context-group>
</trans-unit>
- <trans-unit id="_msg448">
+ <trans-unit id="_msg449">
<source xml:space="preserve">Cannot sign inputs while wallet is locked.</source>
<context-group purpose="location"><context context-type="linenumber">93</context></context-group>
</trans-unit>
- <trans-unit id="_msg449">
+ <trans-unit id="_msg450">
<source xml:space="preserve">Could not sign any more inputs.</source>
<context-group purpose="location"><context context-type="linenumber">95</context></context-group>
</trans-unit>
- <trans-unit id="_msg450">
+ <trans-unit id="_msg451">
<source xml:space="preserve">Signed %1 inputs, but more signatures are still required.</source>
<context-group purpose="location"><context context-type="linenumber">97</context></context-group>
</trans-unit>
- <trans-unit id="_msg451">
+ <trans-unit id="_msg452">
<source xml:space="preserve">Signed transaction successfully. Transaction is ready to broadcast.</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg452">
+ <trans-unit id="_msg453">
<source xml:space="preserve">Unknown error processing transaction.</source>
<context-group purpose="location"><context context-type="linenumber">112</context></context-group>
</trans-unit>
- <trans-unit id="_msg453">
+ <trans-unit id="_msg454">
<source xml:space="preserve">Transaction broadcast successfully! Transaction ID: %1</source>
<context-group purpose="location"><context context-type="linenumber">122</context></context-group>
</trans-unit>
- <trans-unit id="_msg454">
+ <trans-unit id="_msg455">
<source xml:space="preserve">Transaction broadcast failed: %1</source>
<context-group purpose="location"><context context-type="linenumber">125</context></context-group>
</trans-unit>
- <trans-unit id="_msg455">
+ <trans-unit id="_msg456">
<source xml:space="preserve">PSBT copied to clipboard.</source>
<context-group purpose="location"><context context-type="linenumber">134</context></context-group>
</trans-unit>
- <trans-unit id="_msg456">
+ <trans-unit id="_msg457">
<source xml:space="preserve">Save Transaction Data</source>
<context-group purpose="location"><context context-type="linenumber">157</context></context-group>
</trans-unit>
- <trans-unit id="_msg457">
+ <trans-unit id="_msg458">
<source xml:space="preserve">Partially Signed Transaction (Binary)</source>
<context-group purpose="location"><context context-type="linenumber">159</context></context-group>
<note annotates="source" from="developer">Expanded name of the binary PSBT file format. See: BIP 174.</note>
</trans-unit>
- <trans-unit id="_msg458">
+ <trans-unit id="_msg459">
<source xml:space="preserve">PSBT saved to disk.</source>
<context-group purpose="location"><context context-type="linenumber">166</context></context-group>
</trans-unit>
- <trans-unit id="_msg459">
- <source xml:space="preserve"> * Sends %1 to %2</source>
- <context-group purpose="location"><context context-type="linenumber">182</context></context-group>
- </trans-unit>
<trans-unit id="_msg460">
- <source xml:space="preserve">own address</source>
- <context-group purpose="location"><context context-type="linenumber">186</context></context-group>
+ <source xml:space="preserve">Sends %1 to %2</source>
+ <context-group purpose="location"><context context-type="linenumber">183</context></context-group>
</trans-unit>
<trans-unit id="_msg461">
- <source xml:space="preserve">Unable to calculate transaction fee or total transaction amount.</source>
- <context-group purpose="location"><context context-type="linenumber">194</context></context-group>
+ <source xml:space="preserve">own address</source>
+ <context-group purpose="location"><context context-type="linenumber">187</context></context-group>
</trans-unit>
<trans-unit id="_msg462">
- <source xml:space="preserve">Pays transaction fee: </source>
- <context-group purpose="location"><context context-type="linenumber">196</context></context-group>
+ <source xml:space="preserve">Unable to calculate transaction fee or total transaction amount.</source>
+ <context-group purpose="location"><context context-type="linenumber">195</context></context-group>
</trans-unit>
<trans-unit id="_msg463">
- <source xml:space="preserve">Total Amount</source>
- <context-group purpose="location"><context context-type="linenumber">208</context></context-group>
+ <source xml:space="preserve">Pays transaction fee: </source>
+ <context-group purpose="location"><context context-type="linenumber">197</context></context-group>
</trans-unit>
<trans-unit id="_msg464">
- <source xml:space="preserve">or</source>
- <context-group purpose="location"><context context-type="linenumber">211</context></context-group>
+ <source xml:space="preserve">Total Amount</source>
+ <context-group purpose="location"><context context-type="linenumber">209</context></context-group>
</trans-unit>
<trans-unit id="_msg465">
- <source xml:space="preserve">Transaction has %1 unsigned inputs.</source>
- <context-group purpose="location"><context context-type="linenumber">217</context></context-group>
+ <source xml:space="preserve">or</source>
+ <context-group purpose="location"><context context-type="linenumber">212</context></context-group>
</trans-unit>
<trans-unit id="_msg466">
- <source xml:space="preserve">Transaction is missing some information about inputs.</source>
- <context-group purpose="location"><context context-type="linenumber">263</context></context-group>
+ <source xml:space="preserve">Transaction has %1 unsigned inputs.</source>
+ <context-group purpose="location"><context context-type="linenumber">218</context></context-group>
</trans-unit>
<trans-unit id="_msg467">
- <source xml:space="preserve">Transaction still needs signature(s).</source>
- <context-group purpose="location"><context context-type="linenumber">267</context></context-group>
+ <source xml:space="preserve">Transaction is missing some information about inputs.</source>
+ <context-group purpose="location"><context context-type="linenumber">264</context></context-group>
</trans-unit>
<trans-unit id="_msg468">
- <source xml:space="preserve">(But no wallet is loaded.)</source>
- <context-group purpose="location"><context context-type="linenumber">270</context></context-group>
+ <source xml:space="preserve">Transaction still needs signature(s).</source>
+ <context-group purpose="location"><context context-type="linenumber">268</context></context-group>
</trans-unit>
<trans-unit id="_msg469">
- <source xml:space="preserve">(But this wallet cannot sign transactions.)</source>
- <context-group purpose="location"><context context-type="linenumber">273</context></context-group>
+ <source xml:space="preserve">(But no wallet is loaded.)</source>
+ <context-group purpose="location"><context context-type="linenumber">271</context></context-group>
</trans-unit>
<trans-unit id="_msg470">
- <source xml:space="preserve">(But this wallet does not have the right keys.)</source>
- <context-group purpose="location"><context context-type="linenumber">276</context></context-group>
+ <source xml:space="preserve">(But this wallet cannot sign transactions.)</source>
+ <context-group purpose="location"><context context-type="linenumber">274</context></context-group>
</trans-unit>
<trans-unit id="_msg471">
- <source xml:space="preserve">Transaction is fully signed and ready for broadcast.</source>
- <context-group purpose="location"><context context-type="linenumber">284</context></context-group>
+ <source xml:space="preserve">(But this wallet does not have the right keys.)</source>
+ <context-group purpose="location"><context context-type="linenumber">277</context></context-group>
</trans-unit>
<trans-unit id="_msg472">
+ <source xml:space="preserve">Transaction is fully signed and ready for broadcast.</source>
+ <context-group purpose="location"><context context-type="linenumber">285</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg473">
<source xml:space="preserve">Transaction status is unknown.</source>
- <context-group purpose="location"><context context-type="linenumber">288</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">289</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../paymentserver.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="PaymentServer">
- <trans-unit id="_msg473">
+ <trans-unit id="_msg474">
<source xml:space="preserve">Payment request error</source>
<context-group purpose="location"><context context-type="linenumber">149</context></context-group>
</trans-unit>
- <trans-unit id="_msg474">
+ <trans-unit id="_msg475">
<source xml:space="preserve">Cannot start bitcoin: click-to-pay handler</source>
<context-group purpose="location"><context context-type="linenumber">150</context></context-group>
</trans-unit>
- <trans-unit id="_msg475">
+ <trans-unit id="_msg476">
<source xml:space="preserve">URI handling</source>
<context-group purpose="location"><context context-type="linenumber">198</context></context-group>
<context-group purpose="location"><context context-type="linenumber">214</context></context-group>
<context-group purpose="location"><context context-type="linenumber">220</context></context-group>
<context-group purpose="location"><context context-type="linenumber">227</context></context-group>
</trans-unit>
- <trans-unit id="_msg476">
+ <trans-unit id="_msg477">
<source xml:space="preserve">&apos;bitcoin://&apos; is not a valid URI. Use &apos;bitcoin:&apos; instead.</source>
<context-group purpose="location"><context context-type="linenumber">198</context></context-group>
</trans-unit>
- <trans-unit id="_msg477">
+ <trans-unit id="_msg478">
<source xml:space="preserve">Cannot process payment request because BIP70 is not supported.
Due to widespread security flaws in BIP70 it&apos;s strongly recommended that any merchant instructions to switch wallets be ignored.
If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
<context-group purpose="location"><context context-type="linenumber">215</context></context-group>
<context-group purpose="location"><context context-type="linenumber">238</context></context-group>
</trans-unit>
- <trans-unit id="_msg478">
+ <trans-unit id="_msg479">
<source xml:space="preserve">URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
<context-group purpose="location"><context context-type="linenumber">228</context></context-group>
</trans-unit>
- <trans-unit id="_msg479">
+ <trans-unit id="_msg480">
<source xml:space="preserve">Payment request file handling</source>
<context-group purpose="location"><context context-type="linenumber">237</context></context-group>
</trans-unit>
@@ -2170,52 +2176,52 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../peertablemodel.h" datatype="c" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="PeerTableModel">
- <trans-unit id="_msg480">
+ <trans-unit id="_msg481">
<source xml:space="preserve">User Agent</source>
<context-group purpose="location"><context context-type="linenumber">112</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which contains the peer&apos;s User Agent string.</note>
</trans-unit>
- <trans-unit id="_msg481">
+ <trans-unit id="_msg482">
<source xml:space="preserve">Ping</source>
<context-group purpose="location"><context context-type="linenumber">103</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which indicates the current latency of the connection with the peer.</note>
</trans-unit>
- <trans-unit id="_msg482">
+ <trans-unit id="_msg483">
<source xml:space="preserve">Peer</source>
<context-group purpose="location"><context context-type="linenumber">85</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which contains a unique number used to identify a connection.</note>
</trans-unit>
- <trans-unit id="_msg483">
+ <trans-unit id="_msg484">
<source xml:space="preserve">Age</source>
<context-group purpose="location"><context context-type="linenumber">88</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</note>
</trans-unit>
- <trans-unit id="_msg484">
+ <trans-unit id="_msg485">
<source xml:space="preserve">Direction</source>
<context-group purpose="location"><context context-type="linenumber">94</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which indicates the direction the peer connection was initiated from.</note>
</trans-unit>
- <trans-unit id="_msg485">
+ <trans-unit id="_msg486">
<source xml:space="preserve">Sent</source>
<context-group purpose="location"><context context-type="linenumber">106</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</note>
</trans-unit>
- <trans-unit id="_msg486">
+ <trans-unit id="_msg487">
<source xml:space="preserve">Received</source>
<context-group purpose="location"><context context-type="linenumber">109</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which indicates the total amount of network information we have received from the peer.</note>
</trans-unit>
- <trans-unit id="_msg487">
+ <trans-unit id="_msg488">
<source xml:space="preserve">Address</source>
<context-group purpose="location"><context context-type="linenumber">91</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</note>
</trans-unit>
- <trans-unit id="_msg488">
+ <trans-unit id="_msg489">
<source xml:space="preserve">Type</source>
<context-group purpose="location"><context context-type="linenumber">97</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which describes the type of peer connection. The &quot;type&quot; describes why the connection exists.</note>
</trans-unit>
- <trans-unit id="_msg489">
+ <trans-unit id="_msg490">
<source xml:space="preserve">Network</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
<note annotates="source" from="developer">Title of Peers Table column which states the network the peer connected through.</note>
@@ -2224,12 +2230,12 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../peertablemodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="PeerTableModel">
- <trans-unit id="_msg490">
+ <trans-unit id="_msg491">
<source xml:space="preserve">Inbound</source>
<context-group purpose="location"><context context-type="linenumber">77</context></context-group>
<note annotates="source" from="developer">An Inbound Connection from a Peer.</note>
</trans-unit>
- <trans-unit id="_msg491">
+ <trans-unit id="_msg492">
<source xml:space="preserve">Outbound</source>
<context-group purpose="location"><context context-type="linenumber">79</context></context-group>
<note annotates="source" from="developer">An Outbound Connection to a Peer.</note>
@@ -2238,7 +2244,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../bitcoinunits.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="QObject">
- <trans-unit id="_msg492">
+ <trans-unit id="_msg493">
<source xml:space="preserve">Amount</source>
<context-group purpose="location"><context context-type="linenumber">197</context></context-group>
</trans-unit>
@@ -2246,222 +2252,222 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../guiutil.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="QObject">
- <trans-unit id="_msg493">
+ <trans-unit id="_msg494">
<source xml:space="preserve">Enter a Bitcoin address (e.g. %1)</source>
<context-group purpose="location"><context context-type="linenumber">133</context></context-group>
</trans-unit>
- <trans-unit id="_msg494">
+ <trans-unit id="_msg495">
<source xml:space="preserve">Ctrl+W</source>
<context-group purpose="location"><context context-type="linenumber">421</context></context-group>
</trans-unit>
- <trans-unit id="_msg495">
+ <trans-unit id="_msg496">
<source xml:space="preserve">Unroutable</source>
<context-group purpose="location"><context context-type="linenumber">678</context></context-group>
</trans-unit>
- <trans-unit id="_msg496">
+ <trans-unit id="_msg497">
<source xml:space="preserve">IPv4</source>
<context-group purpose="location"><context context-type="linenumber">680</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">network name</context></context-group>
<note annotates="source" from="developer">Name of IPv4 network in peer info</note>
</trans-unit>
- <trans-unit id="_msg497">
+ <trans-unit id="_msg498">
<source xml:space="preserve">IPv6</source>
<context-group purpose="location"><context context-type="linenumber">682</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">network name</context></context-group>
<note annotates="source" from="developer">Name of IPv6 network in peer info</note>
</trans-unit>
- <trans-unit id="_msg498">
+ <trans-unit id="_msg499">
<source xml:space="preserve">Onion</source>
<context-group purpose="location"><context context-type="linenumber">684</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">network name</context></context-group>
<note annotates="source" from="developer">Name of Tor network in peer info</note>
</trans-unit>
- <trans-unit id="_msg499">
+ <trans-unit id="_msg500">
<source xml:space="preserve">I2P</source>
<context-group purpose="location"><context context-type="linenumber">686</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">network name</context></context-group>
<note annotates="source" from="developer">Name of I2P network in peer info</note>
</trans-unit>
- <trans-unit id="_msg500">
+ <trans-unit id="_msg501">
<source xml:space="preserve">CJDNS</source>
<context-group purpose="location"><context context-type="linenumber">688</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">network name</context></context-group>
<note annotates="source" from="developer">Name of CJDNS network in peer info</note>
</trans-unit>
- <trans-unit id="_msg501">
+ <trans-unit id="_msg502">
<source xml:space="preserve">Inbound</source>
<context-group purpose="location"><context context-type="linenumber">702</context></context-group>
<note annotates="source" from="developer">An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</note>
</trans-unit>
- <trans-unit id="_msg502">
+ <trans-unit id="_msg503">
<source xml:space="preserve">Outbound</source>
<context-group purpose="location"><context context-type="linenumber">705</context></context-group>
<note annotates="source" from="developer">An outbound connection to a peer. An outbound connection is a connection initiated by us.</note>
</trans-unit>
- <trans-unit id="_msg503">
+ <trans-unit id="_msg504">
<source xml:space="preserve">Full Relay</source>
<context-group purpose="location"><context context-type="linenumber">710</context></context-group>
<note annotates="source" from="developer">Peer connection type that relays all network information.</note>
</trans-unit>
- <trans-unit id="_msg504">
+ <trans-unit id="_msg505">
<source xml:space="preserve">Block Relay</source>
<context-group purpose="location"><context context-type="linenumber">713</context></context-group>
<note annotates="source" from="developer">Peer connection type that relays network information about blocks and not transactions or addresses.</note>
</trans-unit>
- <trans-unit id="_msg505">
+ <trans-unit id="_msg506">
<source xml:space="preserve">Manual</source>
<context-group purpose="location"><context context-type="linenumber">715</context></context-group>
<note annotates="source" from="developer">Peer connection type established manually through one of several methods.</note>
</trans-unit>
- <trans-unit id="_msg506">
+ <trans-unit id="_msg507">
<source xml:space="preserve">Feeler</source>
<context-group purpose="location"><context context-type="linenumber">717</context></context-group>
<note annotates="source" from="developer">Short-lived peer connection type that tests the aliveness of known addresses.</note>
</trans-unit>
- <trans-unit id="_msg507">
+ <trans-unit id="_msg508">
<source xml:space="preserve">Address Fetch</source>
<context-group purpose="location"><context context-type="linenumber">719</context></context-group>
<note annotates="source" from="developer">Short-lived peer connection type that solicits known addresses from a peer.</note>
</trans-unit>
- <trans-unit id="_msg508">
+ <trans-unit id="_msg509">
<source xml:space="preserve">%1 d</source>
+ <context-group purpose="location"><context context-type="linenumber">731</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">743</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg510">
+ <source xml:space="preserve">%1 h</source>
<context-group purpose="location"><context context-type="linenumber">732</context></context-group>
<context-group purpose="location"><context context-type="linenumber">744</context></context-group>
</trans-unit>
- <trans-unit id="_msg509">
- <source xml:space="preserve">%1 h</source>
+ <trans-unit id="_msg511">
+ <source xml:space="preserve">%1 m</source>
<context-group purpose="location"><context context-type="linenumber">733</context></context-group>
<context-group purpose="location"><context context-type="linenumber">745</context></context-group>
</trans-unit>
- <trans-unit id="_msg510">
- <source xml:space="preserve">%1 m</source>
- <context-group purpose="location"><context context-type="linenumber">734</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">746</context></context-group>
- </trans-unit>
- <trans-unit id="_msg511">
+ <trans-unit id="_msg512">
<source xml:space="preserve">%1 s</source>
- <context-group purpose="location"><context context-type="linenumber">736</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">747</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">773</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">735</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">746</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">772</context></context-group>
</trans-unit>
- <trans-unit id="_msg512">
+ <trans-unit id="_msg513">
<source xml:space="preserve">None</source>
- <context-group purpose="location"><context context-type="linenumber">761</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">760</context></context-group>
</trans-unit>
- <trans-unit id="_msg513">
+ <trans-unit id="_msg514">
<source xml:space="preserve">N/A</source>
- <context-group purpose="location"><context context-type="linenumber">767</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">766</context></context-group>
</trans-unit>
- <trans-unit id="_msg514">
+ <trans-unit id="_msg515">
<source xml:space="preserve">%1 ms</source>
- <context-group purpose="location"><context context-type="linenumber">768</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">767</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">786</context></context-group>
- <trans-unit id="_msg515[0]">
+ <context-group purpose="location"><context context-type="linenumber">785</context></context-group>
+ <trans-unit id="_msg516[0]">
<source xml:space="preserve">%n second(s)</source>
</trans-unit>
- <trans-unit id="_msg515[1]">
+ <trans-unit id="_msg516[1]">
<source xml:space="preserve">%n second(s)</source>
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">790</context></context-group>
- <trans-unit id="_msg516[0]">
+ <context-group purpose="location"><context context-type="linenumber">789</context></context-group>
+ <trans-unit id="_msg517[0]">
<source xml:space="preserve">%n minute(s)</source>
</trans-unit>
- <trans-unit id="_msg516[1]">
+ <trans-unit id="_msg517[1]">
<source xml:space="preserve">%n minute(s)</source>
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">794</context></context-group>
- <trans-unit id="_msg517[0]">
+ <context-group purpose="location"><context context-type="linenumber">793</context></context-group>
+ <trans-unit id="_msg518[0]">
<source xml:space="preserve">%n hour(s)</source>
</trans-unit>
- <trans-unit id="_msg517[1]">
+ <trans-unit id="_msg518[1]">
<source xml:space="preserve">%n hour(s)</source>
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">798</context></context-group>
- <trans-unit id="_msg518[0]">
+ <context-group purpose="location"><context context-type="linenumber">797</context></context-group>
+ <trans-unit id="_msg519[0]">
<source xml:space="preserve">%n day(s)</source>
</trans-unit>
- <trans-unit id="_msg518[1]">
+ <trans-unit id="_msg519[1]">
<source xml:space="preserve">%n day(s)</source>
</trans-unit>
</group>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">802</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">808</context></context-group>
- <trans-unit id="_msg519[0]">
+ <context-group purpose="location"><context context-type="linenumber">801</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">807</context></context-group>
+ <trans-unit id="_msg520[0]">
<source xml:space="preserve">%n week(s)</source>
</trans-unit>
- <trans-unit id="_msg519[1]">
+ <trans-unit id="_msg520[1]">
<source xml:space="preserve">%n week(s)</source>
</trans-unit>
</group>
- <trans-unit id="_msg520">
+ <trans-unit id="_msg521">
<source xml:space="preserve">%1 and %2</source>
- <context-group purpose="location"><context context-type="linenumber">808</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">807</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
- <context-group purpose="location"><context context-type="linenumber">808</context></context-group>
- <trans-unit id="_msg521[0]">
+ <context-group purpose="location"><context context-type="linenumber">807</context></context-group>
+ <trans-unit id="_msg522[0]">
<source xml:space="preserve">%n year(s)</source>
</trans-unit>
- <trans-unit id="_msg521[1]">
+ <trans-unit id="_msg522[1]">
<source xml:space="preserve">%n year(s)</source>
</trans-unit>
</group>
- <trans-unit id="_msg522">
- <source xml:space="preserve">%1 B</source>
- <context-group purpose="location"><context context-type="linenumber">816</context></context-group>
- </trans-unit>
<trans-unit id="_msg523">
- <source xml:space="preserve">%1 kB</source>
- <context-group purpose="location"><context context-type="linenumber">818</context></context-group>
- <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1004</context></context-group>
+ <source xml:space="preserve">%1 B</source>
+ <context-group purpose="location"><context context-type="linenumber">815</context></context-group>
</trans-unit>
<trans-unit id="_msg524">
- <source xml:space="preserve">%1 MB</source>
- <context-group purpose="location"><context context-type="linenumber">820</context></context-group>
+ <source xml:space="preserve">%1 kB</source>
+ <context-group purpose="location"><context context-type="linenumber">817</context></context-group>
<context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1006</context></context-group>
</trans-unit>
<trans-unit id="_msg525">
+ <source xml:space="preserve">%1 MB</source>
+ <context-group purpose="location"><context context-type="linenumber">819</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1008</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg526">
<source xml:space="preserve">%1 GB</source>
- <context-group purpose="location"><context context-type="linenumber">822</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">821</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../qrimagewidget.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="QRImageWidget">
- <trans-unit id="_msg526">
+ <trans-unit id="_msg527">
<source xml:space="preserve">&amp;Save Image…</source>
<context-group purpose="location"><context context-type="linenumber">30</context></context-group>
</trans-unit>
- <trans-unit id="_msg527">
+ <trans-unit id="_msg528">
<source xml:space="preserve">&amp;Copy Image</source>
<context-group purpose="location"><context context-type="linenumber">31</context></context-group>
</trans-unit>
- <trans-unit id="_msg528">
+ <trans-unit id="_msg529">
<source xml:space="preserve">Resulting URI too long, try to reduce the text for label / message.</source>
<context-group purpose="location"><context context-type="linenumber">42</context></context-group>
</trans-unit>
- <trans-unit id="_msg529">
+ <trans-unit id="_msg530">
<source xml:space="preserve">Error encoding URI into QR Code.</source>
<context-group purpose="location"><context context-type="linenumber">49</context></context-group>
</trans-unit>
- <trans-unit id="_msg530">
+ <trans-unit id="_msg531">
<source xml:space="preserve">QR code support not available.</source>
<context-group purpose="location"><context context-type="linenumber">90</context></context-group>
</trans-unit>
- <trans-unit id="_msg531">
+ <trans-unit id="_msg532">
<source xml:space="preserve">Save QR Code</source>
<context-group purpose="location"><context context-type="linenumber">120</context></context-group>
</trans-unit>
- <trans-unit id="_msg532">
+ <trans-unit id="_msg533">
<source xml:space="preserve">PNG Image</source>
<context-group purpose="location"><context context-type="linenumber">123</context></context-group>
<note annotates="source" from="developer">Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</note>
@@ -2470,7 +2476,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../forms/debugwindow.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="RPCConsole">
- <trans-unit id="_msg533">
+ <trans-unit id="_msg534">
<source xml:space="preserve">N/A</source>
<context-group purpose="location"><context context-type="linenumber">75</context></context-group>
<context-group purpose="location"><context context-type="linenumber">101</context></context-group>
@@ -2513,307 +2519,307 @@ If you are receiving this error you should request the merchant provide a BIP21
<context-group purpose="location"><context context-type="linenumber">1714</context></context-group>
<context-group purpose="location"><context context-type="sourcefile">../rpcconsole.h</context><context context-type="linenumber">147</context></context-group>
</trans-unit>
- <trans-unit id="_msg534">
+ <trans-unit id="_msg535">
<source xml:space="preserve">Client version</source>
<context-group purpose="location"><context context-type="linenumber">65</context></context-group>
</trans-unit>
- <trans-unit id="_msg535">
+ <trans-unit id="_msg536">
<source xml:space="preserve">&amp;Information</source>
<context-group purpose="location"><context context-type="linenumber">43</context></context-group>
</trans-unit>
- <trans-unit id="_msg536">
+ <trans-unit id="_msg537">
<source xml:space="preserve">General</source>
<context-group purpose="location"><context context-type="linenumber">58</context></context-group>
</trans-unit>
- <trans-unit id="_msg537">
+ <trans-unit id="_msg538">
<source xml:space="preserve">Datadir</source>
<context-group purpose="location"><context context-type="linenumber">114</context></context-group>
</trans-unit>
- <trans-unit id="_msg538">
+ <trans-unit id="_msg539">
<source xml:space="preserve">To specify a non-default location of the data directory use the &apos;%1&apos; option.</source>
<context-group purpose="location"><context context-type="linenumber">124</context></context-group>
</trans-unit>
- <trans-unit id="_msg539">
+ <trans-unit id="_msg540">
<source xml:space="preserve">Blocksdir</source>
<context-group purpose="location"><context context-type="linenumber">143</context></context-group>
</trans-unit>
- <trans-unit id="_msg540">
+ <trans-unit id="_msg541">
<source xml:space="preserve">To specify a non-default location of the blocks directory use the &apos;%1&apos; option.</source>
<context-group purpose="location"><context context-type="linenumber">153</context></context-group>
</trans-unit>
- <trans-unit id="_msg541">
+ <trans-unit id="_msg542">
<source xml:space="preserve">Startup time</source>
<context-group purpose="location"><context context-type="linenumber">172</context></context-group>
</trans-unit>
- <trans-unit id="_msg542">
+ <trans-unit id="_msg543">
<source xml:space="preserve">Network</source>
<context-group purpose="location"><context context-type="linenumber">201</context></context-group>
<context-group purpose="location"><context context-type="linenumber">1145</context></context-group>
</trans-unit>
- <trans-unit id="_msg543">
+ <trans-unit id="_msg544">
<source xml:space="preserve">Name</source>
<context-group purpose="location"><context context-type="linenumber">208</context></context-group>
</trans-unit>
- <trans-unit id="_msg544">
+ <trans-unit id="_msg545">
<source xml:space="preserve">Number of connections</source>
<context-group purpose="location"><context context-type="linenumber">231</context></context-group>
</trans-unit>
- <trans-unit id="_msg545">
+ <trans-unit id="_msg546">
<source xml:space="preserve">Block chain</source>
<context-group purpose="location"><context context-type="linenumber">260</context></context-group>
</trans-unit>
- <trans-unit id="_msg546">
+ <trans-unit id="_msg547">
<source xml:space="preserve">Memory Pool</source>
<context-group purpose="location"><context context-type="linenumber">319</context></context-group>
</trans-unit>
- <trans-unit id="_msg547">
+ <trans-unit id="_msg548">
<source xml:space="preserve">Current number of transactions</source>
<context-group purpose="location"><context context-type="linenumber">326</context></context-group>
</trans-unit>
- <trans-unit id="_msg548">
+ <trans-unit id="_msg549">
<source xml:space="preserve">Memory usage</source>
<context-group purpose="location"><context context-type="linenumber">349</context></context-group>
</trans-unit>
- <trans-unit id="_msg549">
+ <trans-unit id="_msg550">
<source xml:space="preserve">Wallet: </source>
<context-group purpose="location"><context context-type="linenumber">443</context></context-group>
</trans-unit>
- <trans-unit id="_msg550">
+ <trans-unit id="_msg551">
<source xml:space="preserve">(none)</source>
<context-group purpose="location"><context context-type="linenumber">454</context></context-group>
</trans-unit>
- <trans-unit id="_msg551">
+ <trans-unit id="_msg552">
<source xml:space="preserve">&amp;Reset</source>
<context-group purpose="location"><context context-type="linenumber">665</context></context-group>
</trans-unit>
- <trans-unit id="_msg552">
+ <trans-unit id="_msg553">
<source xml:space="preserve">Received</source>
<context-group purpose="location"><context context-type="linenumber">745</context></context-group>
<context-group purpose="location"><context context-type="linenumber">1505</context></context-group>
</trans-unit>
- <trans-unit id="_msg553">
+ <trans-unit id="_msg554">
<source xml:space="preserve">Sent</source>
<context-group purpose="location"><context context-type="linenumber">825</context></context-group>
<context-group purpose="location"><context context-type="linenumber">1482</context></context-group>
</trans-unit>
- <trans-unit id="_msg554">
+ <trans-unit id="_msg555">
<source xml:space="preserve">&amp;Peers</source>
<context-group purpose="location"><context context-type="linenumber">866</context></context-group>
</trans-unit>
- <trans-unit id="_msg555">
+ <trans-unit id="_msg556">
<source xml:space="preserve">Banned peers</source>
<context-group purpose="location"><context context-type="linenumber">942</context></context-group>
</trans-unit>
- <trans-unit id="_msg556">
+ <trans-unit id="_msg557">
<source xml:space="preserve">Select a peer to view detailed information.</source>
<context-group purpose="location"><context context-type="linenumber">1010</context></context-group>
- <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1171</context></context-group>
+ <context-group purpose="location"><context context-type="sourcefile">../rpcconsole.cpp</context><context context-type="linenumber">1173</context></context-group>
</trans-unit>
- <trans-unit id="_msg557">
+ <trans-unit id="_msg558">
<source xml:space="preserve">The transport layer version: %1</source>
<context-group purpose="location"><context context-type="linenumber">1090</context></context-group>
</trans-unit>
- <trans-unit id="_msg558">
+ <trans-unit id="_msg559">
<source xml:space="preserve">Transport</source>
<context-group purpose="location"><context context-type="linenumber">1093</context></context-group>
</trans-unit>
- <trans-unit id="_msg559">
+ <trans-unit id="_msg560">
<source xml:space="preserve">The BIP324 session ID string in hex, if any.</source>
<context-group purpose="location"><context context-type="linenumber">1116</context></context-group>
</trans-unit>
- <trans-unit id="_msg560">
+ <trans-unit id="_msg561">
<source xml:space="preserve">Session ID</source>
<context-group purpose="location"><context context-type="linenumber">1119</context></context-group>
</trans-unit>
- <trans-unit id="_msg561">
+ <trans-unit id="_msg562">
<source xml:space="preserve">Version</source>
<context-group purpose="location"><context context-type="linenumber">1168</context></context-group>
</trans-unit>
- <trans-unit id="_msg562">
+ <trans-unit id="_msg563">
<source xml:space="preserve">Whether we relay transactions to this peer.</source>
<context-group purpose="location"><context context-type="linenumber">1240</context></context-group>
</trans-unit>
- <trans-unit id="_msg563">
+ <trans-unit id="_msg564">
<source xml:space="preserve">Transaction Relay</source>
<context-group purpose="location"><context context-type="linenumber">1243</context></context-group>
</trans-unit>
- <trans-unit id="_msg564">
+ <trans-unit id="_msg565">
<source xml:space="preserve">Starting Block</source>
<context-group purpose="location"><context context-type="linenumber">1292</context></context-group>
</trans-unit>
- <trans-unit id="_msg565">
+ <trans-unit id="_msg566">
<source xml:space="preserve">Synced Headers</source>
<context-group purpose="location"><context context-type="linenumber">1315</context></context-group>
</trans-unit>
- <trans-unit id="_msg566">
+ <trans-unit id="_msg567">
<source xml:space="preserve">Synced Blocks</source>
<context-group purpose="location"><context context-type="linenumber">1338</context></context-group>
</trans-unit>
- <trans-unit id="_msg567">
+ <trans-unit id="_msg568">
<source xml:space="preserve">Last Transaction</source>
<context-group purpose="location"><context context-type="linenumber">1413</context></context-group>
</trans-unit>
- <trans-unit id="_msg568">
+ <trans-unit id="_msg569">
<source xml:space="preserve">The mapped Autonomous System used for diversifying peer selection.</source>
<context-group purpose="location"><context context-type="linenumber">1623</context></context-group>
</trans-unit>
- <trans-unit id="_msg569">
+ <trans-unit id="_msg570">
<source xml:space="preserve">Mapped AS</source>
<context-group purpose="location"><context context-type="linenumber">1626</context></context-group>
</trans-unit>
- <trans-unit id="_msg570">
+ <trans-unit id="_msg571">
<source xml:space="preserve">Whether we relay addresses to this peer.</source>
<context-group purpose="location"><context context-type="linenumber">1649</context></context-group>
<note annotates="source" from="developer">Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</note>
</trans-unit>
- <trans-unit id="_msg571">
+ <trans-unit id="_msg572">
<source xml:space="preserve">Address Relay</source>
<context-group purpose="location"><context context-type="linenumber">1652</context></context-group>
<note annotates="source" from="developer">Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</note>
</trans-unit>
- <trans-unit id="_msg572">
+ <trans-unit id="_msg573">
<source xml:space="preserve">The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
<context-group purpose="location"><context context-type="linenumber">1675</context></context-group>
<note annotates="source" from="developer">Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</note>
</trans-unit>
- <trans-unit id="_msg573">
+ <trans-unit id="_msg574">
<source xml:space="preserve">The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
<context-group purpose="location"><context context-type="linenumber">1701</context></context-group>
<note annotates="source" from="developer">Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</note>
</trans-unit>
- <trans-unit id="_msg574">
+ <trans-unit id="_msg575">
<source xml:space="preserve">Addresses Processed</source>
<context-group purpose="location"><context context-type="linenumber">1678</context></context-group>
<note annotates="source" from="developer">Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</note>
</trans-unit>
- <trans-unit id="_msg575">
+ <trans-unit id="_msg576">
<source xml:space="preserve">Addresses Rate-Limited</source>
<context-group purpose="location"><context context-type="linenumber">1704</context></context-group>
<note annotates="source" from="developer">Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</note>
</trans-unit>
- <trans-unit id="_msg576">
+ <trans-unit id="_msg577">
<source xml:space="preserve">User Agent</source>
<context-group purpose="location"><context context-type="linenumber">88</context></context-group>
<context-group purpose="location"><context context-type="linenumber">1191</context></context-group>
</trans-unit>
- <trans-unit id="_msg577">
+ <trans-unit id="_msg578">
<source xml:space="preserve">Node window</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg578">
+ <trans-unit id="_msg579">
<source xml:space="preserve">Current block height</source>
<context-group purpose="location"><context context-type="linenumber">267</context></context-group>
</trans-unit>
- <trans-unit id="_msg579">
+ <trans-unit id="_msg580">
<source xml:space="preserve">Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
<context-group purpose="location"><context context-type="linenumber">397</context></context-group>
</trans-unit>
- <trans-unit id="_msg580">
+ <trans-unit id="_msg581">
<source xml:space="preserve">Decrease font size</source>
<context-group purpose="location"><context context-type="linenumber">475</context></context-group>
</trans-unit>
- <trans-unit id="_msg581">
+ <trans-unit id="_msg582">
<source xml:space="preserve">Increase font size</source>
<context-group purpose="location"><context context-type="linenumber">495</context></context-group>
</trans-unit>
- <trans-unit id="_msg582">
+ <trans-unit id="_msg583">
<source xml:space="preserve">Permissions</source>
<context-group purpose="location"><context context-type="linenumber">1041</context></context-group>
</trans-unit>
- <trans-unit id="_msg583">
+ <trans-unit id="_msg584">
<source xml:space="preserve">The direction and type of peer connection: %1</source>
<context-group purpose="location"><context context-type="linenumber">1064</context></context-group>
</trans-unit>
- <trans-unit id="_msg584">
+ <trans-unit id="_msg585">
<source xml:space="preserve">Direction/Type</source>
<context-group purpose="location"><context context-type="linenumber">1067</context></context-group>
</trans-unit>
- <trans-unit id="_msg585">
+ <trans-unit id="_msg586">
<source xml:space="preserve">The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
<context-group purpose="location"><context context-type="linenumber">1142</context></context-group>
</trans-unit>
- <trans-unit id="_msg586">
+ <trans-unit id="_msg587">
<source xml:space="preserve">Services</source>
<context-group purpose="location"><context context-type="linenumber">1214</context></context-group>
</trans-unit>
- <trans-unit id="_msg587">
+ <trans-unit id="_msg588">
<source xml:space="preserve">High bandwidth BIP152 compact block relay: %1</source>
<context-group purpose="location"><context context-type="linenumber">1266</context></context-group>
</trans-unit>
- <trans-unit id="_msg588">
+ <trans-unit id="_msg589">
<source xml:space="preserve">High Bandwidth</source>
<context-group purpose="location"><context context-type="linenumber">1269</context></context-group>
</trans-unit>
- <trans-unit id="_msg589">
+ <trans-unit id="_msg590">
<source xml:space="preserve">Connection Time</source>
<context-group purpose="location"><context context-type="linenumber">1361</context></context-group>
</trans-unit>
- <trans-unit id="_msg590">
+ <trans-unit id="_msg591">
<source xml:space="preserve">Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
<context-group purpose="location"><context context-type="linenumber">1384</context></context-group>
</trans-unit>
- <trans-unit id="_msg591">
+ <trans-unit id="_msg592">
<source xml:space="preserve">Last Block</source>
<context-group purpose="location"><context context-type="linenumber">1387</context></context-group>
</trans-unit>
- <trans-unit id="_msg592">
+ <trans-unit id="_msg593">
<source xml:space="preserve">Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
<context-group purpose="location"><context context-type="linenumber">1410</context></context-group>
<note annotates="source" from="developer">Tooltip text for the Last Transaction field in the peer details area.</note>
</trans-unit>
- <trans-unit id="_msg593">
+ <trans-unit id="_msg594">
<source xml:space="preserve">Last Send</source>
<context-group purpose="location"><context context-type="linenumber">1436</context></context-group>
</trans-unit>
- <trans-unit id="_msg594">
+ <trans-unit id="_msg595">
<source xml:space="preserve">Last Receive</source>
<context-group purpose="location"><context context-type="linenumber">1459</context></context-group>
</trans-unit>
- <trans-unit id="_msg595">
+ <trans-unit id="_msg596">
<source xml:space="preserve">Ping Time</source>
<context-group purpose="location"><context context-type="linenumber">1528</context></context-group>
</trans-unit>
- <trans-unit id="_msg596">
+ <trans-unit id="_msg597">
<source xml:space="preserve">The duration of a currently outstanding ping.</source>
<context-group purpose="location"><context context-type="linenumber">1551</context></context-group>
</trans-unit>
- <trans-unit id="_msg597">
+ <trans-unit id="_msg598">
<source xml:space="preserve">Ping Wait</source>
<context-group purpose="location"><context context-type="linenumber">1554</context></context-group>
</trans-unit>
- <trans-unit id="_msg598">
+ <trans-unit id="_msg599">
<source xml:space="preserve">Min Ping</source>
<context-group purpose="location"><context context-type="linenumber">1577</context></context-group>
</trans-unit>
- <trans-unit id="_msg599">
+ <trans-unit id="_msg600">
<source xml:space="preserve">Time Offset</source>
<context-group purpose="location"><context context-type="linenumber">1600</context></context-group>
</trans-unit>
- <trans-unit id="_msg600">
+ <trans-unit id="_msg601">
<source xml:space="preserve">Last block time</source>
<context-group purpose="location"><context context-type="linenumber">290</context></context-group>
</trans-unit>
- <trans-unit id="_msg601">
+ <trans-unit id="_msg602">
<source xml:space="preserve">&amp;Open</source>
<context-group purpose="location"><context context-type="linenumber">400</context></context-group>
</trans-unit>
- <trans-unit id="_msg602">
+ <trans-unit id="_msg603">
<source xml:space="preserve">&amp;Console</source>
<context-group purpose="location"><context context-type="linenumber">426</context></context-group>
</trans-unit>
- <trans-unit id="_msg603">
+ <trans-unit id="_msg604">
<source xml:space="preserve">&amp;Network Traffic</source>
<context-group purpose="location"><context context-type="linenumber">613</context></context-group>
</trans-unit>
- <trans-unit id="_msg604">
+ <trans-unit id="_msg605">
<source xml:space="preserve">Totals</source>
<context-group purpose="location"><context context-type="linenumber">681</context></context-group>
</trans-unit>
- <trans-unit id="_msg605">
+ <trans-unit id="_msg606">
<source xml:space="preserve">Debug log file</source>
<context-group purpose="location"><context context-type="linenumber">390</context></context-group>
</trans-unit>
- <trans-unit id="_msg606">
+ <trans-unit id="_msg607">
<source xml:space="preserve">Clear console</source>
<context-group purpose="location"><context context-type="linenumber">515</context></context-group>
</trans-unit>
@@ -2821,154 +2827,158 @@ If you are receiving this error you should request the merchant provide a BIP21
</body></file>
<file original="../rpcconsole.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="RPCConsole">
- <trans-unit id="_msg607">
+ <trans-unit id="_msg608">
<source xml:space="preserve">In:</source>
- <context-group purpose="location"><context context-type="linenumber">968</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">970</context></context-group>
</trans-unit>
- <trans-unit id="_msg608">
+ <trans-unit id="_msg609">
<source xml:space="preserve">Out:</source>
- <context-group purpose="location"><context context-type="linenumber">969</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">971</context></context-group>
</trans-unit>
- <trans-unit id="_msg609">
+ <trans-unit id="_msg610">
<source xml:space="preserve">Inbound: initiated by peer</source>
<context-group purpose="location"><context context-type="linenumber">496</context></context-group>
<note annotates="source" from="developer">Explanatory text for an inbound peer connection.</note>
</trans-unit>
- <trans-unit id="_msg610">
+ <trans-unit id="_msg611">
<source xml:space="preserve">Outbound Full Relay: default</source>
<context-group purpose="location"><context context-type="linenumber">500</context></context-group>
<note annotates="source" from="developer">Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</note>
</trans-unit>
- <trans-unit id="_msg611">
+ <trans-unit id="_msg612">
<source xml:space="preserve">Outbound Block Relay: does not relay transactions or addresses</source>
<context-group purpose="location"><context context-type="linenumber">503</context></context-group>
<note annotates="source" from="developer">Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</note>
</trans-unit>
- <trans-unit id="_msg612">
+ <trans-unit id="_msg613">
<source xml:space="preserve">Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
<context-group purpose="location"><context context-type="linenumber">508</context></context-group>
<note annotates="source" from="developer">Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</note>
</trans-unit>
- <trans-unit id="_msg613">
+ <trans-unit id="_msg614">
<source xml:space="preserve">Outbound Feeler: short-lived, for testing addresses</source>
<context-group purpose="location"><context context-type="linenumber">514</context></context-group>
<note annotates="source" from="developer">Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</note>
</trans-unit>
- <trans-unit id="_msg614">
+ <trans-unit id="_msg615">
<source xml:space="preserve">Outbound Address Fetch: short-lived, for soliciting addresses</source>
<context-group purpose="location"><context context-type="linenumber">517</context></context-group>
<note annotates="source" from="developer">Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</note>
</trans-unit>
- <trans-unit id="_msg615">
+ <trans-unit id="_msg616">
<source xml:space="preserve">detecting: peer could be v1 or v2</source>
<context-group purpose="location"><context context-type="linenumber">522</context></context-group>
<note annotates="source" from="developer">Explanatory text for &quot;detecting&quot; transport type.</note>
</trans-unit>
- <trans-unit id="_msg616">
+ <trans-unit id="_msg617">
<source xml:space="preserve">v1: unencrypted, plaintext transport protocol</source>
<context-group purpose="location"><context context-type="linenumber">524</context></context-group>
<note annotates="source" from="developer">Explanatory text for v1 transport type.</note>
</trans-unit>
- <trans-unit id="_msg617">
+ <trans-unit id="_msg618">
<source xml:space="preserve">v2: BIP324 encrypted transport protocol</source>
<context-group purpose="location"><context context-type="linenumber">526</context></context-group>
<note annotates="source" from="developer">Explanatory text for v2 transport type.</note>
</trans-unit>
- <trans-unit id="_msg618">
+ <trans-unit id="_msg619">
<source xml:space="preserve">we selected the peer for high bandwidth relay</source>
<context-group purpose="location"><context context-type="linenumber">530</context></context-group>
</trans-unit>
- <trans-unit id="_msg619">
+ <trans-unit id="_msg620">
<source xml:space="preserve">the peer selected us for high bandwidth relay</source>
<context-group purpose="location"><context context-type="linenumber">531</context></context-group>
</trans-unit>
- <trans-unit id="_msg620">
+ <trans-unit id="_msg621">
<source xml:space="preserve">no high bandwidth relay selected</source>
<context-group purpose="location"><context context-type="linenumber">532</context></context-group>
</trans-unit>
- <trans-unit id="_msg621">
+ <trans-unit id="_msg622">
<source xml:space="preserve">Ctrl++</source>
<context-group purpose="location"><context context-type="linenumber">545</context></context-group>
<note annotates="source" from="developer">Main shortcut to increase the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg622">
+ <trans-unit id="_msg623">
<source xml:space="preserve">Ctrl+=</source>
<context-group purpose="location"><context context-type="linenumber">547</context></context-group>
<note annotates="source" from="developer">Secondary shortcut to increase the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg623">
+ <trans-unit id="_msg624">
<source xml:space="preserve">Ctrl+-</source>
<context-group purpose="location"><context context-type="linenumber">551</context></context-group>
<note annotates="source" from="developer">Main shortcut to decrease the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg624">
+ <trans-unit id="_msg625">
<source xml:space="preserve">Ctrl+_</source>
<context-group purpose="location"><context context-type="linenumber">553</context></context-group>
<note annotates="source" from="developer">Secondary shortcut to decrease the RPC console font size.</note>
</trans-unit>
- <trans-unit id="_msg625">
+ <trans-unit id="_msg626">
<source xml:space="preserve">&amp;Copy address</source>
- <context-group purpose="location"><context context-type="linenumber">704</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">706</context></context-group>
<note annotates="source" from="developer">Context menu action to copy the address of a peer.</note>
</trans-unit>
- <trans-unit id="_msg626">
+ <trans-unit id="_msg627">
<source xml:space="preserve">&amp;Disconnect</source>
- <context-group purpose="location"><context context-type="linenumber">708</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">710</context></context-group>
</trans-unit>
- <trans-unit id="_msg627">
+ <trans-unit id="_msg628">
<source xml:space="preserve">1 &amp;hour</source>
- <context-group purpose="location"><context context-type="linenumber">709</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">711</context></context-group>
</trans-unit>
- <trans-unit id="_msg628">
+ <trans-unit id="_msg629">
<source xml:space="preserve">1 d&amp;ay</source>
- <context-group purpose="location"><context context-type="linenumber">710</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">712</context></context-group>
</trans-unit>
- <trans-unit id="_msg629">
+ <trans-unit id="_msg630">
<source xml:space="preserve">1 &amp;week</source>
- <context-group purpose="location"><context context-type="linenumber">711</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">713</context></context-group>
</trans-unit>
- <trans-unit id="_msg630">
+ <trans-unit id="_msg631">
<source xml:space="preserve">1 &amp;year</source>
- <context-group purpose="location"><context context-type="linenumber">712</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">714</context></context-group>
</trans-unit>
- <trans-unit id="_msg631">
+ <trans-unit id="_msg632">
<source xml:space="preserve">&amp;Copy IP/Netmask</source>
- <context-group purpose="location"><context context-type="linenumber">738</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">740</context></context-group>
<note annotates="source" from="developer">Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer&apos;s IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</note>
</trans-unit>
- <trans-unit id="_msg632">
+ <trans-unit id="_msg633">
<source xml:space="preserve">&amp;Unban</source>
- <context-group purpose="location"><context context-type="linenumber">742</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">744</context></context-group>
</trans-unit>
- <trans-unit id="_msg633">
+ <trans-unit id="_msg634">
<source xml:space="preserve">Network activity disabled</source>
- <context-group purpose="location"><context context-type="linenumber">972</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">974</context></context-group>
</trans-unit>
- <trans-unit id="_msg634">
+ <trans-unit id="_msg635">
<source xml:space="preserve">Executing command without any wallet</source>
- <context-group purpose="location"><context context-type="linenumber">1051</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1053</context></context-group>
</trans-unit>
- <trans-unit id="_msg635">
+ <trans-unit id="_msg636">
<source xml:space="preserve">Ctrl+I</source>
- <context-group purpose="location"><context context-type="linenumber">1376</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1378</context></context-group>
</trans-unit>
- <trans-unit id="_msg636">
+ <trans-unit id="_msg637">
<source xml:space="preserve">Ctrl+T</source>
- <context-group purpose="location"><context context-type="linenumber">1377</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1379</context></context-group>
</trans-unit>
- <trans-unit id="_msg637">
+ <trans-unit id="_msg638">
<source xml:space="preserve">Ctrl+N</source>
- <context-group purpose="location"><context context-type="linenumber">1378</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1380</context></context-group>
</trans-unit>
- <trans-unit id="_msg638">
+ <trans-unit id="_msg639">
<source xml:space="preserve">Ctrl+P</source>
- <context-group purpose="location"><context context-type="linenumber">1379</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1381</context></context-group>
</trans-unit>
- <trans-unit id="_msg639">
+ <trans-unit id="_msg640">
+ <source xml:space="preserve">Node window - [%1]</source>
+ <context-group purpose="location"><context context-type="linenumber">1399</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg641">
<source xml:space="preserve">Executing command using &quot;%1&quot; wallet</source>
- <context-group purpose="location"><context context-type="linenumber">1049</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1051</context></context-group>
</trans-unit>
- <trans-unit id="_msg640">
+ <trans-unit id="_msg642">
<source xml:space="preserve">Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2976,51 +2986,51 @@ Type %5 for an overview of available commands.
For more information on using this console, type %6.
%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
- <context-group purpose="location"><context context-type="linenumber">902</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">904</context></context-group>
<note annotates="source" from="developer">RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</note>
</trans-unit>
- <trans-unit id="_msg641">
+ <trans-unit id="_msg643">
<source xml:space="preserve">Executing…</source>
- <context-group purpose="location"><context context-type="linenumber">1059</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1061</context></context-group>
<note annotates="source" from="developer">A console message indicating an entered command is currently being executed.</note>
</trans-unit>
- <trans-unit id="_msg642">
+ <trans-unit id="_msg644">
<source xml:space="preserve">(peer: %1)</source>
- <context-group purpose="location"><context context-type="linenumber">1177</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1179</context></context-group>
</trans-unit>
- <trans-unit id="_msg643">
+ <trans-unit id="_msg645">
<source xml:space="preserve">via %1</source>
- <context-group purpose="location"><context context-type="linenumber">1179</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">1181</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../rpcconsole.h" datatype="c" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="RPCConsole">
- <trans-unit id="_msg644">
+ <trans-unit id="_msg646">
<source xml:space="preserve">Yes</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg645">
+ <trans-unit id="_msg647">
<source xml:space="preserve">No</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg646">
+ <trans-unit id="_msg648">
<source xml:space="preserve">To</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg647">
+ <trans-unit id="_msg649">
<source xml:space="preserve">From</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg648">
+ <trans-unit id="_msg650">
<source xml:space="preserve">Ban for</source>
<context-group purpose="location"><context context-type="linenumber">147</context></context-group>
</trans-unit>
- <trans-unit id="_msg649">
+ <trans-unit id="_msg651">
<source xml:space="preserve">Never</source>
<context-group purpose="location"><context context-type="linenumber">189</context></context-group>
</trans-unit>
- <trans-unit id="_msg650">
+ <trans-unit id="_msg652">
<source xml:space="preserve">Unknown</source>
<context-group purpose="location"><context context-type="linenumber">147</context></context-group>
</trans-unit>
@@ -3028,72 +3038,72 @@ For more information on using this console, type %6.
</body></file>
<file original="../forms/receivecoinsdialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="ReceiveCoinsDialog">
- <trans-unit id="_msg651">
+ <trans-unit id="_msg653">
<source xml:space="preserve">&amp;Amount:</source>
<context-group purpose="location"><context context-type="linenumber">37</context></context-group>
</trans-unit>
- <trans-unit id="_msg652">
+ <trans-unit id="_msg654">
<source xml:space="preserve">&amp;Label:</source>
<context-group purpose="location"><context context-type="linenumber">83</context></context-group>
</trans-unit>
- <trans-unit id="_msg653">
+ <trans-unit id="_msg655">
<source xml:space="preserve">&amp;Message:</source>
<context-group purpose="location"><context context-type="linenumber">53</context></context-group>
</trans-unit>
- <trans-unit id="_msg654">
+ <trans-unit id="_msg656">
<source xml:space="preserve">An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
<context-group purpose="location"><context context-type="linenumber">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg655">
+ <trans-unit id="_msg657">
<source xml:space="preserve">An optional label to associate with the new receiving address.</source>
<context-group purpose="location"><context context-type="linenumber">80</context></context-group>
</trans-unit>
- <trans-unit id="_msg656">
+ <trans-unit id="_msg658">
<source xml:space="preserve">Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<context-group purpose="location"><context context-type="linenumber">73</context></context-group>
</trans-unit>
- <trans-unit id="_msg657">
+ <trans-unit id="_msg659">
<source xml:space="preserve">An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
<context-group purpose="location"><context context-type="linenumber">34</context></context-group>
<context-group purpose="location"><context context-type="linenumber">193</context></context-group>
</trans-unit>
- <trans-unit id="_msg658">
+ <trans-unit id="_msg660">
<source xml:space="preserve">An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
<context-group purpose="location"><context context-type="linenumber">66</context></context-group>
</trans-unit>
- <trans-unit id="_msg659">
+ <trans-unit id="_msg661">
<source xml:space="preserve">An optional message that is attached to the payment request and may be displayed to the sender.</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg660">
+ <trans-unit id="_msg662">
<source xml:space="preserve">&amp;Create new receiving address</source>
<context-group purpose="location"><context context-type="linenumber">111</context></context-group>
</trans-unit>
- <trans-unit id="_msg661">
+ <trans-unit id="_msg663">
<source xml:space="preserve">Clear all fields of the form.</source>
<context-group purpose="location"><context context-type="linenumber">134</context></context-group>
</trans-unit>
- <trans-unit id="_msg662">
+ <trans-unit id="_msg664">
<source xml:space="preserve">Clear</source>
<context-group purpose="location"><context context-type="linenumber">137</context></context-group>
</trans-unit>
- <trans-unit id="_msg663">
+ <trans-unit id="_msg665">
<source xml:space="preserve">Requested payments history</source>
<context-group purpose="location"><context context-type="linenumber">273</context></context-group>
</trans-unit>
- <trans-unit id="_msg664">
+ <trans-unit id="_msg666">
<source xml:space="preserve">Show the selected request (does the same as double clicking an entry)</source>
<context-group purpose="location"><context context-type="linenumber">298</context></context-group>
</trans-unit>
- <trans-unit id="_msg665">
+ <trans-unit id="_msg667">
<source xml:space="preserve">Show</source>
<context-group purpose="location"><context context-type="linenumber">301</context></context-group>
</trans-unit>
- <trans-unit id="_msg666">
+ <trans-unit id="_msg668">
<source xml:space="preserve">Remove the selected entries from the list</source>
<context-group purpose="location"><context context-type="linenumber">318</context></context-group>
</trans-unit>
- <trans-unit id="_msg667">
+ <trans-unit id="_msg669">
<source xml:space="preserve">Remove</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
@@ -3101,63 +3111,63 @@ For more information on using this console, type %6.
</body></file>
<file original="../receivecoinsdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="ReceiveCoinsDialog">
- <trans-unit id="_msg668">
+ <trans-unit id="_msg670">
<source xml:space="preserve">Copy &amp;URI</source>
<context-group purpose="location"><context context-type="linenumber">46</context></context-group>
</trans-unit>
- <trans-unit id="_msg669">
+ <trans-unit id="_msg671">
<source xml:space="preserve">&amp;Copy address</source>
<context-group purpose="location"><context context-type="linenumber">47</context></context-group>
</trans-unit>
- <trans-unit id="_msg670">
+ <trans-unit id="_msg672">
<source xml:space="preserve">Copy &amp;label</source>
<context-group purpose="location"><context context-type="linenumber">48</context></context-group>
</trans-unit>
- <trans-unit id="_msg671">
+ <trans-unit id="_msg673">
<source xml:space="preserve">Copy &amp;message</source>
<context-group purpose="location"><context context-type="linenumber">49</context></context-group>
</trans-unit>
- <trans-unit id="_msg672">
+ <trans-unit id="_msg674">
<source xml:space="preserve">Copy &amp;amount</source>
<context-group purpose="location"><context context-type="linenumber">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg673">
+ <trans-unit id="_msg675">
<source xml:space="preserve">Base58 (Legacy)</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg674">
+ <trans-unit id="_msg676">
<source xml:space="preserve">Not recommended due to higher fees and less protection against typos.</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg675">
+ <trans-unit id="_msg677">
<source xml:space="preserve">Base58 (P2SH-SegWit)</source>
<context-group purpose="location"><context context-type="linenumber">97</context></context-group>
</trans-unit>
- <trans-unit id="_msg676">
+ <trans-unit id="_msg678">
<source xml:space="preserve">Generates an address compatible with older wallets.</source>
<context-group purpose="location"><context context-type="linenumber">97</context></context-group>
</trans-unit>
- <trans-unit id="_msg677">
+ <trans-unit id="_msg679">
<source xml:space="preserve">Bech32 (SegWit)</source>
<context-group purpose="location"><context context-type="linenumber">98</context></context-group>
</trans-unit>
- <trans-unit id="_msg678">
+ <trans-unit id="_msg680">
<source xml:space="preserve">Generates a native segwit address (BIP-173). Some old wallets don&apos;t support it.</source>
<context-group purpose="location"><context context-type="linenumber">98</context></context-group>
</trans-unit>
- <trans-unit id="_msg679">
+ <trans-unit id="_msg681">
<source xml:space="preserve">Bech32m (Taproot)</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg680">
+ <trans-unit id="_msg682">
<source xml:space="preserve">Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg681">
+ <trans-unit id="_msg683">
<source xml:space="preserve">Could not unlock wallet.</source>
<context-group purpose="location"><context context-type="linenumber">175</context></context-group>
</trans-unit>
- <trans-unit id="_msg682">
+ <trans-unit id="_msg684">
<source xml:space="preserve">Could not generate new %1 address</source>
<context-group purpose="location"><context context-type="linenumber">180</context></context-group>
</trans-unit>
@@ -3165,51 +3175,51 @@ For more information on using this console, type %6.
</body></file>
<file original="../forms/receiverequestdialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="ReceiveRequestDialog">
- <trans-unit id="_msg683">
+ <trans-unit id="_msg685">
<source xml:space="preserve">Request payment to …</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg684">
+ <trans-unit id="_msg686">
<source xml:space="preserve">Address:</source>
<context-group purpose="location"><context context-type="linenumber">90</context></context-group>
</trans-unit>
- <trans-unit id="_msg685">
+ <trans-unit id="_msg687">
<source xml:space="preserve">Amount:</source>
<context-group purpose="location"><context context-type="linenumber">119</context></context-group>
</trans-unit>
- <trans-unit id="_msg686">
+ <trans-unit id="_msg688">
<source xml:space="preserve">Label:</source>
<context-group purpose="location"><context context-type="linenumber">148</context></context-group>
</trans-unit>
- <trans-unit id="_msg687">
+ <trans-unit id="_msg689">
<source xml:space="preserve">Message:</source>
<context-group purpose="location"><context context-type="linenumber">180</context></context-group>
</trans-unit>
- <trans-unit id="_msg688">
+ <trans-unit id="_msg690">
<source xml:space="preserve">Wallet:</source>
<context-group purpose="location"><context context-type="linenumber">212</context></context-group>
</trans-unit>
- <trans-unit id="_msg689">
+ <trans-unit id="_msg691">
<source xml:space="preserve">Copy &amp;URI</source>
<context-group purpose="location"><context context-type="linenumber">240</context></context-group>
</trans-unit>
- <trans-unit id="_msg690">
+ <trans-unit id="_msg692">
<source xml:space="preserve">Copy &amp;Address</source>
<context-group purpose="location"><context context-type="linenumber">250</context></context-group>
</trans-unit>
- <trans-unit id="_msg691">
+ <trans-unit id="_msg693">
<source xml:space="preserve">&amp;Verify</source>
<context-group purpose="location"><context context-type="linenumber">260</context></context-group>
</trans-unit>
- <trans-unit id="_msg692">
+ <trans-unit id="_msg694">
<source xml:space="preserve">Verify this address on e.g. a hardware wallet screen</source>
<context-group purpose="location"><context context-type="linenumber">263</context></context-group>
</trans-unit>
- <trans-unit id="_msg693">
+ <trans-unit id="_msg695">
<source xml:space="preserve">&amp;Save Image…</source>
<context-group purpose="location"><context context-type="linenumber">273</context></context-group>
</trans-unit>
- <trans-unit id="_msg694">
+ <trans-unit id="_msg696">
<source xml:space="preserve">Payment information</source>
<context-group purpose="location"><context context-type="linenumber">39</context></context-group>
</trans-unit>
@@ -3217,7 +3227,7 @@ For more information on using this console, type %6.
</body></file>
<file original="../receiverequestdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="ReceiveRequestDialog">
- <trans-unit id="_msg695">
+ <trans-unit id="_msg697">
<source xml:space="preserve">Request payment to %1</source>
<context-group purpose="location"><context context-type="linenumber">48</context></context-group>
</trans-unit>
@@ -3225,31 +3235,31 @@ For more information on using this console, type %6.
</body></file>
<file original="../recentrequeststablemodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="RecentRequestsTableModel">
- <trans-unit id="_msg696">
+ <trans-unit id="_msg698">
<source xml:space="preserve">Date</source>
<context-group purpose="location"><context context-type="linenumber">32</context></context-group>
</trans-unit>
- <trans-unit id="_msg697">
+ <trans-unit id="_msg699">
<source xml:space="preserve">Label</source>
<context-group purpose="location"><context context-type="linenumber">32</context></context-group>
</trans-unit>
- <trans-unit id="_msg698">
+ <trans-unit id="_msg700">
<source xml:space="preserve">Message</source>
<context-group purpose="location"><context context-type="linenumber">32</context></context-group>
</trans-unit>
- <trans-unit id="_msg699">
+ <trans-unit id="_msg701">
<source xml:space="preserve">(no label)</source>
<context-group purpose="location"><context context-type="linenumber">70</context></context-group>
</trans-unit>
- <trans-unit id="_msg700">
+ <trans-unit id="_msg702">
<source xml:space="preserve">(no message)</source>
<context-group purpose="location"><context context-type="linenumber">79</context></context-group>
</trans-unit>
- <trans-unit id="_msg701">
+ <trans-unit id="_msg703">
<source xml:space="preserve">(no amount requested)</source>
<context-group purpose="location"><context context-type="linenumber">87</context></context-group>
</trans-unit>
- <trans-unit id="_msg702">
+ <trans-unit id="_msg704">
<source xml:space="preserve">Requested</source>
<context-group purpose="location"><context context-type="linenumber">130</context></context-group>
</trans-unit>
@@ -3257,150 +3267,150 @@ For more information on using this console, type %6.
</body></file>
<file original="../forms/sendcoinsdialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SendCoinsDialog">
- <trans-unit id="_msg703">
+ <trans-unit id="_msg705">
<source xml:space="preserve">Send Coins</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
<context-group purpose="location"><context context-type="sourcefile">../sendcoinsdialog.cpp</context><context context-type="linenumber">762</context></context-group>
</trans-unit>
- <trans-unit id="_msg704">
+ <trans-unit id="_msg706">
<source xml:space="preserve">Coin Control Features</source>
<context-group purpose="location"><context context-type="linenumber">90</context></context-group>
</trans-unit>
- <trans-unit id="_msg705">
+ <trans-unit id="_msg707">
<source xml:space="preserve">automatically selected</source>
<context-group purpose="location"><context context-type="linenumber">120</context></context-group>
</trans-unit>
- <trans-unit id="_msg706">
+ <trans-unit id="_msg708">
<source xml:space="preserve">Insufficient funds!</source>
<context-group purpose="location"><context context-type="linenumber">139</context></context-group>
</trans-unit>
- <trans-unit id="_msg707">
+ <trans-unit id="_msg709">
<source xml:space="preserve">Quantity:</source>
<context-group purpose="location"><context context-type="linenumber">231</context></context-group>
</trans-unit>
- <trans-unit id="_msg708">
+ <trans-unit id="_msg710">
<source xml:space="preserve">Bytes:</source>
<context-group purpose="location"><context context-type="linenumber">266</context></context-group>
</trans-unit>
- <trans-unit id="_msg709">
+ <trans-unit id="_msg711">
<source xml:space="preserve">Amount:</source>
<context-group purpose="location"><context context-type="linenumber">314</context></context-group>
</trans-unit>
- <trans-unit id="_msg710">
+ <trans-unit id="_msg712">
<source xml:space="preserve">Fee:</source>
<context-group purpose="location"><context context-type="linenumber">365</context></context-group>
</trans-unit>
- <trans-unit id="_msg711">
+ <trans-unit id="_msg713">
<source xml:space="preserve">After Fee:</source>
<context-group purpose="location"><context context-type="linenumber">419</context></context-group>
</trans-unit>
- <trans-unit id="_msg712">
+ <trans-unit id="_msg714">
<source xml:space="preserve">Change:</source>
<context-group purpose="location"><context context-type="linenumber">451</context></context-group>
</trans-unit>
- <trans-unit id="_msg713">
+ <trans-unit id="_msg715">
<source xml:space="preserve">If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<context-group purpose="location"><context context-type="linenumber">495</context></context-group>
</trans-unit>
- <trans-unit id="_msg714">
+ <trans-unit id="_msg716">
<source xml:space="preserve">Custom change address</source>
<context-group purpose="location"><context context-type="linenumber">498</context></context-group>
</trans-unit>
- <trans-unit id="_msg715">
+ <trans-unit id="_msg717">
<source xml:space="preserve">Transaction Fee:</source>
<context-group purpose="location"><context context-type="linenumber">704</context></context-group>
</trans-unit>
- <trans-unit id="_msg716">
+ <trans-unit id="_msg718">
<source xml:space="preserve">Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
<context-group purpose="location"><context context-type="linenumber">742</context></context-group>
</trans-unit>
- <trans-unit id="_msg717">
+ <trans-unit id="_msg719">
<source xml:space="preserve">Warning: Fee estimation is currently not possible.</source>
<context-group purpose="location"><context context-type="linenumber">751</context></context-group>
</trans-unit>
- <trans-unit id="_msg718">
+ <trans-unit id="_msg720">
<source xml:space="preserve">per kilobyte</source>
<context-group purpose="location"><context context-type="linenumber">833</context></context-group>
</trans-unit>
- <trans-unit id="_msg719">
+ <trans-unit id="_msg721">
<source xml:space="preserve">Hide</source>
<context-group purpose="location"><context context-type="linenumber">780</context></context-group>
</trans-unit>
- <trans-unit id="_msg720">
+ <trans-unit id="_msg722">
<source xml:space="preserve">Recommended:</source>
<context-group purpose="location"><context context-type="linenumber">892</context></context-group>
</trans-unit>
- <trans-unit id="_msg721">
+ <trans-unit id="_msg723">
<source xml:space="preserve">Custom:</source>
<context-group purpose="location"><context context-type="linenumber">922</context></context-group>
</trans-unit>
- <trans-unit id="_msg722">
+ <trans-unit id="_msg724">
<source xml:space="preserve">Send to multiple recipients at once</source>
<context-group purpose="location"><context context-type="linenumber">1137</context></context-group>
</trans-unit>
- <trans-unit id="_msg723">
+ <trans-unit id="_msg725">
<source xml:space="preserve">Add &amp;Recipient</source>
<context-group purpose="location"><context context-type="linenumber">1140</context></context-group>
</trans-unit>
- <trans-unit id="_msg724">
+ <trans-unit id="_msg726">
<source xml:space="preserve">Clear all fields of the form.</source>
<context-group purpose="location"><context context-type="linenumber">1120</context></context-group>
</trans-unit>
- <trans-unit id="_msg725">
+ <trans-unit id="_msg727">
<source xml:space="preserve">Inputs…</source>
<context-group purpose="location"><context context-type="linenumber">110</context></context-group>
</trans-unit>
- <trans-unit id="_msg726">
+ <trans-unit id="_msg728">
<source xml:space="preserve">Choose…</source>
<context-group purpose="location"><context context-type="linenumber">718</context></context-group>
</trans-unit>
- <trans-unit id="_msg727">
+ <trans-unit id="_msg729">
<source xml:space="preserve">Hide transaction fee settings</source>
<context-group purpose="location"><context context-type="linenumber">777</context></context-group>
</trans-unit>
- <trans-unit id="_msg728">
+ <trans-unit id="_msg730">
<source xml:space="preserve">Specify a custom fee per kB (1,000 bytes) of the transaction&apos;s virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100 satoshis per kvB&quot; for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
<context-group purpose="location"><context context-type="linenumber">828</context></context-group>
</trans-unit>
- <trans-unit id="_msg729">
+ <trans-unit id="_msg731">
<source xml:space="preserve">When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
<context-group purpose="location"><context context-type="linenumber">863</context></context-group>
</trans-unit>
- <trans-unit id="_msg730">
+ <trans-unit id="_msg732">
<source xml:space="preserve">A too low fee might result in a never confirming transaction (read the tooltip)</source>
<context-group purpose="location"><context context-type="linenumber">866</context></context-group>
</trans-unit>
- <trans-unit id="_msg731">
+ <trans-unit id="_msg733">
<source xml:space="preserve">(Smart fee not initialized yet. This usually takes a few blocks…)</source>
<context-group purpose="location"><context context-type="linenumber">971</context></context-group>
</trans-unit>
- <trans-unit id="_msg732">
+ <trans-unit id="_msg734">
<source xml:space="preserve">Confirmation time target:</source>
<context-group purpose="location"><context context-type="linenumber">997</context></context-group>
</trans-unit>
- <trans-unit id="_msg733">
+ <trans-unit id="_msg735">
<source xml:space="preserve">Enable Replace-By-Fee</source>
<context-group purpose="location"><context context-type="linenumber">1055</context></context-group>
</trans-unit>
- <trans-unit id="_msg734">
+ <trans-unit id="_msg736">
<source xml:space="preserve">With Replace-By-Fee (BIP-125) you can increase a transaction&apos;s fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<context-group purpose="location"><context context-type="linenumber">1058</context></context-group>
</trans-unit>
- <trans-unit id="_msg735">
+ <trans-unit id="_msg737">
<source xml:space="preserve">Clear &amp;All</source>
<context-group purpose="location"><context context-type="linenumber">1123</context></context-group>
</trans-unit>
- <trans-unit id="_msg736">
+ <trans-unit id="_msg738">
<source xml:space="preserve">Balance:</source>
<context-group purpose="location"><context context-type="linenumber">1178</context></context-group>
</trans-unit>
- <trans-unit id="_msg737">
+ <trans-unit id="_msg739">
<source xml:space="preserve">Confirm the send action</source>
<context-group purpose="location"><context context-type="linenumber">1094</context></context-group>
</trans-unit>
- <trans-unit id="_msg738">
+ <trans-unit id="_msg740">
<source xml:space="preserve">S&amp;end</source>
<context-group purpose="location"><context context-type="linenumber">1097</context></context-group>
</trans-unit>
@@ -3408,231 +3418,231 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../sendcoinsdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SendCoinsDialog">
- <trans-unit id="_msg739">
+ <trans-unit id="_msg741">
<source xml:space="preserve">Copy quantity</source>
<context-group purpose="location"><context context-type="linenumber">95</context></context-group>
</trans-unit>
- <trans-unit id="_msg740">
+ <trans-unit id="_msg742">
<source xml:space="preserve">Copy amount</source>
<context-group purpose="location"><context context-type="linenumber">96</context></context-group>
</trans-unit>
- <trans-unit id="_msg741">
+ <trans-unit id="_msg743">
<source xml:space="preserve">Copy fee</source>
<context-group purpose="location"><context context-type="linenumber">97</context></context-group>
</trans-unit>
- <trans-unit id="_msg742">
+ <trans-unit id="_msg744">
<source xml:space="preserve">Copy after fee</source>
<context-group purpose="location"><context context-type="linenumber">98</context></context-group>
</trans-unit>
- <trans-unit id="_msg743">
+ <trans-unit id="_msg745">
<source xml:space="preserve">Copy bytes</source>
<context-group purpose="location"><context context-type="linenumber">99</context></context-group>
</trans-unit>
- <trans-unit id="_msg744">
+ <trans-unit id="_msg746">
<source xml:space="preserve">Copy change</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg745">
+ <trans-unit id="_msg747">
<source xml:space="preserve">%1 (%2 blocks)</source>
<context-group purpose="location"><context context-type="linenumber">172</context></context-group>
</trans-unit>
- <trans-unit id="_msg746">
+ <trans-unit id="_msg748">
<source xml:space="preserve">Sign on device</source>
<context-group purpose="location"><context context-type="linenumber">202</context></context-group>
<note annotates="source" from="developer">&quot;device&quot; usually means a hardware wallet.</note>
</trans-unit>
- <trans-unit id="_msg747">
+ <trans-unit id="_msg749">
<source xml:space="preserve">Connect your hardware wallet first.</source>
<context-group purpose="location"><context context-type="linenumber">205</context></context-group>
</trans-unit>
- <trans-unit id="_msg748">
+ <trans-unit id="_msg750">
<source xml:space="preserve">Set external signer script path in Options -&gt; Wallet</source>
<context-group purpose="location"><context context-type="linenumber">209</context></context-group>
<note annotates="source" from="developer">&quot;External signer&quot; means using devices such as hardware wallets.</note>
</trans-unit>
- <trans-unit id="_msg749">
+ <trans-unit id="_msg751">
<source xml:space="preserve">Cr&amp;eate Unsigned</source>
<context-group purpose="location"><context context-type="linenumber">212</context></context-group>
</trans-unit>
- <trans-unit id="_msg750">
+ <trans-unit id="_msg752">
<source xml:space="preserve">Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<context-group purpose="location"><context context-type="linenumber">213</context></context-group>
</trans-unit>
- <trans-unit id="_msg751">
- <source xml:space="preserve"> from wallet &apos;%1&apos;</source>
- <context-group purpose="location"><context context-type="linenumber">305</context></context-group>
- </trans-unit>
- <trans-unit id="_msg752">
+ <trans-unit id="_msg753">
<source xml:space="preserve">%1 to &apos;%2&apos;</source>
<context-group purpose="location"><context context-type="linenumber">316</context></context-group>
</trans-unit>
- <trans-unit id="_msg753">
+ <trans-unit id="_msg754">
<source xml:space="preserve">%1 to %2</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg754">
+ <trans-unit id="_msg755">
<source xml:space="preserve">To review recipient list click &quot;Show Details…&quot;</source>
<context-group purpose="location"><context context-type="linenumber">388</context></context-group>
</trans-unit>
- <trans-unit id="_msg755">
+ <trans-unit id="_msg756">
<source xml:space="preserve">Sign failed</source>
<context-group purpose="location"><context context-type="linenumber">450</context></context-group>
</trans-unit>
- <trans-unit id="_msg756">
+ <trans-unit id="_msg757">
<source xml:space="preserve">External signer not found</source>
<context-group purpose="location"><context context-type="linenumber">455</context></context-group>
<note annotates="source" from="developer">&quot;External signer&quot; means using devices such as hardware wallets.</note>
</trans-unit>
- <trans-unit id="_msg757">
+ <trans-unit id="_msg758">
<source xml:space="preserve">External signer failure</source>
<context-group purpose="location"><context context-type="linenumber">461</context></context-group>
<note annotates="source" from="developer">&quot;External signer&quot; means using devices such as hardware wallets.</note>
</trans-unit>
- <trans-unit id="_msg758">
+ <trans-unit id="_msg759">
<source xml:space="preserve">Save Transaction Data</source>
<context-group purpose="location"><context context-type="linenumber">425</context></context-group>
</trans-unit>
- <trans-unit id="_msg759">
+ <trans-unit id="_msg760">
<source xml:space="preserve">Partially Signed Transaction (Binary)</source>
<context-group purpose="location"><context context-type="linenumber">427</context></context-group>
<note annotates="source" from="developer">Expanded name of the binary PSBT file format. See: BIP 174.</note>
</trans-unit>
- <trans-unit id="_msg760">
+ <trans-unit id="_msg761">
<source xml:space="preserve">PSBT saved</source>
<context-group purpose="location"><context context-type="linenumber">435</context></context-group>
<note annotates="source" from="developer">Popup message when a PSBT has been saved to a file</note>
</trans-unit>
- <trans-unit id="_msg761">
+ <trans-unit id="_msg762">
<source xml:space="preserve">External balance:</source>
<context-group purpose="location"><context context-type="linenumber">708</context></context-group>
</trans-unit>
- <trans-unit id="_msg762">
+ <trans-unit id="_msg763">
<source xml:space="preserve">or</source>
<context-group purpose="location"><context context-type="linenumber">384</context></context-group>
</trans-unit>
- <trans-unit id="_msg763">
+ <trans-unit id="_msg764">
<source xml:space="preserve">You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
<context-group purpose="location"><context context-type="linenumber">366</context></context-group>
</trans-unit>
- <trans-unit id="_msg764">
+ <trans-unit id="_msg765">
<source xml:space="preserve">Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<context-group purpose="location"><context context-type="linenumber">335</context></context-group>
<note annotates="source" from="developer">Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</note>
</trans-unit>
- <trans-unit id="_msg765">
+ <trans-unit id="_msg766">
+ <source xml:space="preserve">%1 from wallet &apos;%2&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">305</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg767">
<source xml:space="preserve">Do you want to create this transaction?</source>
<context-group purpose="location"><context context-type="linenumber">329</context></context-group>
<note annotates="source" from="developer">Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</note>
</trans-unit>
- <trans-unit id="_msg766">
+ <trans-unit id="_msg768">
<source xml:space="preserve">Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<context-group purpose="location"><context context-type="linenumber">340</context></context-group>
<note annotates="source" from="developer">Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</note>
</trans-unit>
- <trans-unit id="_msg767">
+ <trans-unit id="_msg769">
<source xml:space="preserve">Please, review your transaction.</source>
<context-group purpose="location"><context context-type="linenumber">343</context></context-group>
<note annotates="source" from="developer">Text to prompt a user to review the details of the transaction they are attempting to send.</note>
</trans-unit>
- <trans-unit id="_msg768">
+ <trans-unit id="_msg770">
<source xml:space="preserve">Transaction fee</source>
<context-group purpose="location"><context context-type="linenumber">351</context></context-group>
</trans-unit>
- <trans-unit id="_msg769">
+ <trans-unit id="_msg771">
<source xml:space="preserve">%1 kvB</source>
<context-group purpose="location"><context context-type="linenumber">356</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">PSBT transaction creation</context></context-group>
<note annotates="source" from="developer">When reviewing a newly created PSBT (via Send flow), the transaction fee is shown, with &quot;virtual size&quot; of the transaction displayed for context</note>
</trans-unit>
- <trans-unit id="_msg770">
+ <trans-unit id="_msg772">
<source xml:space="preserve">Not signalling Replace-By-Fee, BIP-125.</source>
<context-group purpose="location"><context context-type="linenumber">368</context></context-group>
</trans-unit>
- <trans-unit id="_msg771">
+ <trans-unit id="_msg773">
<source xml:space="preserve">Total Amount</source>
<context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg772">
+ <trans-unit id="_msg774">
<source xml:space="preserve">Unsigned Transaction</source>
<context-group purpose="location"><context context-type="linenumber">405</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">PSBT copied</context></context-group>
<note annotates="source" from="developer">Caption of &quot;PSBT has been copied&quot; messagebox</note>
</trans-unit>
- <trans-unit id="_msg773">
+ <trans-unit id="_msg775">
<source xml:space="preserve">The PSBT has been copied to the clipboard. You can also save it.</source>
<context-group purpose="location"><context context-type="linenumber">406</context></context-group>
</trans-unit>
- <trans-unit id="_msg774">
+ <trans-unit id="_msg776">
<source xml:space="preserve">PSBT saved to disk</source>
<context-group purpose="location"><context context-type="linenumber">435</context></context-group>
</trans-unit>
- <trans-unit id="_msg775">
+ <trans-unit id="_msg777">
<source xml:space="preserve">Confirm send coins</source>
<context-group purpose="location"><context context-type="linenumber">484</context></context-group>
</trans-unit>
- <trans-unit id="_msg776">
+ <trans-unit id="_msg778">
<source xml:space="preserve">Watch-only balance:</source>
<context-group purpose="location"><context context-type="linenumber">711</context></context-group>
</trans-unit>
- <trans-unit id="_msg777">
+ <trans-unit id="_msg779">
<source xml:space="preserve">The recipient address is not valid. Please recheck.</source>
<context-group purpose="location"><context context-type="linenumber">735</context></context-group>
</trans-unit>
- <trans-unit id="_msg778">
+ <trans-unit id="_msg780">
<source xml:space="preserve">The amount to pay must be larger than 0.</source>
<context-group purpose="location"><context context-type="linenumber">738</context></context-group>
</trans-unit>
- <trans-unit id="_msg779">
+ <trans-unit id="_msg781">
<source xml:space="preserve">The amount exceeds your balance.</source>
<context-group purpose="location"><context context-type="linenumber">741</context></context-group>
</trans-unit>
- <trans-unit id="_msg780">
+ <trans-unit id="_msg782">
<source xml:space="preserve">The total exceeds your balance when the %1 transaction fee is included.</source>
<context-group purpose="location"><context context-type="linenumber">744</context></context-group>
</trans-unit>
- <trans-unit id="_msg781">
+ <trans-unit id="_msg783">
<source xml:space="preserve">Duplicate address found: addresses should only be used once each.</source>
<context-group purpose="location"><context context-type="linenumber">747</context></context-group>
</trans-unit>
- <trans-unit id="_msg782">
+ <trans-unit id="_msg784">
<source xml:space="preserve">Transaction creation failed!</source>
<context-group purpose="location"><context context-type="linenumber">750</context></context-group>
</trans-unit>
- <trans-unit id="_msg783">
+ <trans-unit id="_msg785">
<source xml:space="preserve">A fee higher than %1 is considered an absurdly high fee.</source>
<context-group purpose="location"><context context-type="linenumber">754</context></context-group>
</trans-unit>
- <trans-unit id="_msg784">
+ <trans-unit id="_msg786">
<source xml:space="preserve">%1/kvB</source>
<context-group purpose="location"><context context-type="linenumber">833</context></context-group>
<context-group purpose="location"><context context-type="linenumber">868</context></context-group>
</trans-unit>
<group restype="x-gettext-plurals">
<context-group purpose="location"><context context-type="linenumber">882</context></context-group>
- <trans-unit id="_msg785[0]">
+ <trans-unit id="_msg787[0]">
<source xml:space="preserve">Estimated to begin confirmation within %n block(s).</source>
</trans-unit>
- <trans-unit id="_msg785[1]">
+ <trans-unit id="_msg787[1]">
<source xml:space="preserve">Estimated to begin confirmation within %n block(s).</source>
</trans-unit>
</group>
- <trans-unit id="_msg786">
+ <trans-unit id="_msg788">
<source xml:space="preserve">Warning: Invalid Bitcoin address</source>
<context-group purpose="location"><context context-type="linenumber">977</context></context-group>
</trans-unit>
- <trans-unit id="_msg787">
+ <trans-unit id="_msg789">
<source xml:space="preserve">Warning: Unknown change address</source>
<context-group purpose="location"><context context-type="linenumber">982</context></context-group>
</trans-unit>
- <trans-unit id="_msg788">
+ <trans-unit id="_msg790">
<source xml:space="preserve">Confirm custom change address</source>
<context-group purpose="location"><context context-type="linenumber">985</context></context-group>
</trans-unit>
- <trans-unit id="_msg789">
+ <trans-unit id="_msg791">
<source xml:space="preserve">The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
<context-group purpose="location"><context context-type="linenumber">985</context></context-group>
</trans-unit>
- <trans-unit id="_msg790">
+ <trans-unit id="_msg792">
<source xml:space="preserve">(no label)</source>
<context-group purpose="location"><context context-type="linenumber">1006</context></context-group>
</trans-unit>
@@ -3640,68 +3650,68 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../forms/sendcoinsentry.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SendCoinsEntry">
- <trans-unit id="_msg791">
+ <trans-unit id="_msg793">
<source xml:space="preserve">A&amp;mount:</source>
<context-group purpose="location"><context context-type="linenumber">151</context></context-group>
</trans-unit>
- <trans-unit id="_msg792">
+ <trans-unit id="_msg794">
<source xml:space="preserve">Pay &amp;To:</source>
<context-group purpose="location"><context context-type="linenumber">35</context></context-group>
</trans-unit>
- <trans-unit id="_msg793">
+ <trans-unit id="_msg795">
<source xml:space="preserve">&amp;Label:</source>
<context-group purpose="location"><context context-type="linenumber">128</context></context-group>
</trans-unit>
- <trans-unit id="_msg794">
+ <trans-unit id="_msg796">
<source xml:space="preserve">Choose previously used address</source>
<context-group purpose="location"><context context-type="linenumber">60</context></context-group>
</trans-unit>
- <trans-unit id="_msg795">
+ <trans-unit id="_msg797">
<source xml:space="preserve">The Bitcoin address to send the payment to</source>
<context-group purpose="location"><context context-type="linenumber">53</context></context-group>
</trans-unit>
- <trans-unit id="_msg796">
+ <trans-unit id="_msg798">
<source xml:space="preserve">Alt+A</source>
<context-group purpose="location"><context context-type="linenumber">76</context></context-group>
</trans-unit>
- <trans-unit id="_msg797">
+ <trans-unit id="_msg799">
<source xml:space="preserve">Paste address from clipboard</source>
<context-group purpose="location"><context context-type="linenumber">83</context></context-group>
</trans-unit>
- <trans-unit id="_msg798">
+ <trans-unit id="_msg800">
<source xml:space="preserve">Alt+P</source>
<context-group purpose="location"><context context-type="linenumber">99</context></context-group>
</trans-unit>
- <trans-unit id="_msg799">
+ <trans-unit id="_msg801">
<source xml:space="preserve">Remove this entry</source>
<context-group purpose="location"><context context-type="linenumber">106</context></context-group>
</trans-unit>
- <trans-unit id="_msg800">
+ <trans-unit id="_msg802">
<source xml:space="preserve">The amount to send in the selected unit</source>
<context-group purpose="location"><context context-type="linenumber">166</context></context-group>
</trans-unit>
- <trans-unit id="_msg801">
+ <trans-unit id="_msg803">
<source xml:space="preserve">The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
<context-group purpose="location"><context context-type="linenumber">173</context></context-group>
</trans-unit>
- <trans-unit id="_msg802">
+ <trans-unit id="_msg804">
<source xml:space="preserve">S&amp;ubtract fee from amount</source>
<context-group purpose="location"><context context-type="linenumber">176</context></context-group>
</trans-unit>
- <trans-unit id="_msg803">
+ <trans-unit id="_msg805">
<source xml:space="preserve">Use available balance</source>
<context-group purpose="location"><context context-type="linenumber">183</context></context-group>
</trans-unit>
- <trans-unit id="_msg804">
+ <trans-unit id="_msg806">
<source xml:space="preserve">Message:</source>
<context-group purpose="location"><context context-type="linenumber">192</context></context-group>
</trans-unit>
- <trans-unit id="_msg805">
+ <trans-unit id="_msg807">
<source xml:space="preserve">Enter a label for this address to add it to the list of used addresses</source>
<context-group purpose="location"><context context-type="linenumber">141</context></context-group>
<context-group purpose="location"><context context-type="linenumber">144</context></context-group>
</trans-unit>
- <trans-unit id="_msg806">
+ <trans-unit id="_msg808">
<source xml:space="preserve">A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
<context-group purpose="location"><context context-type="linenumber">202</context></context-group>
</trans-unit>
@@ -3709,11 +3719,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../sendcoinsdialog.h" datatype="c" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SendConfirmationDialog">
- <trans-unit id="_msg807">
+ <trans-unit id="_msg809">
<source xml:space="preserve">Send</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg808">
+ <trans-unit id="_msg810">
<source xml:space="preserve">Create Unsigned</source>
<context-group purpose="location"><context context-type="linenumber">148</context></context-group>
</trans-unit>
@@ -3721,105 +3731,105 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../forms/signverifymessagedialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SignVerifyMessageDialog">
- <trans-unit id="_msg809">
+ <trans-unit id="_msg811">
<source xml:space="preserve">Signatures - Sign / Verify a Message</source>
<context-group purpose="location"><context context-type="linenumber">14</context></context-group>
</trans-unit>
- <trans-unit id="_msg810">
+ <trans-unit id="_msg812">
<source xml:space="preserve">&amp;Sign Message</source>
<context-group purpose="location"><context context-type="linenumber">27</context></context-group>
</trans-unit>
- <trans-unit id="_msg811">
+ <trans-unit id="_msg813">
<source xml:space="preserve">You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
<context-group purpose="location"><context context-type="linenumber">33</context></context-group>
</trans-unit>
- <trans-unit id="_msg812">
+ <trans-unit id="_msg814">
<source xml:space="preserve">The Bitcoin address to sign the message with</source>
<context-group purpose="location"><context context-type="linenumber">51</context></context-group>
</trans-unit>
- <trans-unit id="_msg813">
+ <trans-unit id="_msg815">
<source xml:space="preserve">Choose previously used address</source>
<context-group purpose="location"><context context-type="linenumber">58</context></context-group>
<context-group purpose="location"><context context-type="linenumber">274</context></context-group>
</trans-unit>
- <trans-unit id="_msg814">
+ <trans-unit id="_msg816">
<source xml:space="preserve">Alt+A</source>
<context-group purpose="location"><context context-type="linenumber">68</context></context-group>
<context-group purpose="location"><context context-type="linenumber">284</context></context-group>
</trans-unit>
- <trans-unit id="_msg815">
+ <trans-unit id="_msg817">
<source xml:space="preserve">Paste address from clipboard</source>
<context-group purpose="location"><context context-type="linenumber">78</context></context-group>
</trans-unit>
- <trans-unit id="_msg816">
+ <trans-unit id="_msg818">
<source xml:space="preserve">Alt+P</source>
<context-group purpose="location"><context context-type="linenumber">88</context></context-group>
</trans-unit>
- <trans-unit id="_msg817">
+ <trans-unit id="_msg819">
<source xml:space="preserve">Enter the message you want to sign here</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
<context-group purpose="location"><context context-type="linenumber">103</context></context-group>
</trans-unit>
- <trans-unit id="_msg818">
+ <trans-unit id="_msg820">
<source xml:space="preserve">Signature</source>
<context-group purpose="location"><context context-type="linenumber">110</context></context-group>
</trans-unit>
- <trans-unit id="_msg819">
+ <trans-unit id="_msg821">
<source xml:space="preserve">Copy the current signature to the system clipboard</source>
<context-group purpose="location"><context context-type="linenumber">140</context></context-group>
</trans-unit>
- <trans-unit id="_msg820">
+ <trans-unit id="_msg822">
<source xml:space="preserve">Sign the message to prove you own this Bitcoin address</source>
<context-group purpose="location"><context context-type="linenumber">161</context></context-group>
</trans-unit>
- <trans-unit id="_msg821">
+ <trans-unit id="_msg823">
<source xml:space="preserve">Sign &amp;Message</source>
<context-group purpose="location"><context context-type="linenumber">164</context></context-group>
</trans-unit>
- <trans-unit id="_msg822">
+ <trans-unit id="_msg824">
<source xml:space="preserve">Reset all sign message fields</source>
<context-group purpose="location"><context context-type="linenumber">178</context></context-group>
</trans-unit>
- <trans-unit id="_msg823">
+ <trans-unit id="_msg825">
<source xml:space="preserve">Clear &amp;All</source>
<context-group purpose="location"><context context-type="linenumber">181</context></context-group>
<context-group purpose="location"><context context-type="linenumber">338</context></context-group>
</trans-unit>
- <trans-unit id="_msg824">
+ <trans-unit id="_msg826">
<source xml:space="preserve">&amp;Verify Message</source>
<context-group purpose="location"><context context-type="linenumber">240</context></context-group>
</trans-unit>
- <trans-unit id="_msg825">
+ <trans-unit id="_msg827">
<source xml:space="preserve">Enter the receiver&apos;s address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
<context-group purpose="location"><context context-type="linenumber">246</context></context-group>
</trans-unit>
- <trans-unit id="_msg826">
+ <trans-unit id="_msg828">
<source xml:space="preserve">The Bitcoin address the message was signed with</source>
<context-group purpose="location"><context context-type="linenumber">267</context></context-group>
</trans-unit>
- <trans-unit id="_msg827">
+ <trans-unit id="_msg829">
<source xml:space="preserve">The signed message to verify</source>
<context-group purpose="location"><context context-type="linenumber">296</context></context-group>
<context-group purpose="location"><context context-type="linenumber">299</context></context-group>
</trans-unit>
- <trans-unit id="_msg828">
+ <trans-unit id="_msg830">
<source xml:space="preserve">The signature given when the message was signed</source>
<context-group purpose="location"><context context-type="linenumber">306</context></context-group>
<context-group purpose="location"><context context-type="linenumber">309</context></context-group>
</trans-unit>
- <trans-unit id="_msg829">
+ <trans-unit id="_msg831">
<source xml:space="preserve">Verify the message to ensure it was signed with the specified Bitcoin address</source>
<context-group purpose="location"><context context-type="linenumber">318</context></context-group>
</trans-unit>
- <trans-unit id="_msg830">
+ <trans-unit id="_msg832">
<source xml:space="preserve">Verify &amp;Message</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg831">
+ <trans-unit id="_msg833">
<source xml:space="preserve">Reset all verify message fields</source>
<context-group purpose="location"><context context-type="linenumber">335</context></context-group>
</trans-unit>
- <trans-unit id="_msg832">
+ <trans-unit id="_msg834">
<source xml:space="preserve">Click &quot;Sign Message&quot; to generate signature</source>
<context-group purpose="location"><context context-type="linenumber">125</context></context-group>
</trans-unit>
@@ -3827,61 +3837,61 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../signverifymessagedialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SignVerifyMessageDialog">
- <trans-unit id="_msg833">
+ <trans-unit id="_msg835">
<source xml:space="preserve">The entered address is invalid.</source>
<context-group purpose="location"><context context-type="linenumber">119</context></context-group>
<context-group purpose="location"><context context-type="linenumber">218</context></context-group>
</trans-unit>
- <trans-unit id="_msg834">
+ <trans-unit id="_msg836">
<source xml:space="preserve">Please check the address and try again.</source>
<context-group purpose="location"><context context-type="linenumber">119</context></context-group>
<context-group purpose="location"><context context-type="linenumber">126</context></context-group>
<context-group purpose="location"><context context-type="linenumber">219</context></context-group>
<context-group purpose="location"><context context-type="linenumber">226</context></context-group>
</trans-unit>
- <trans-unit id="_msg835">
+ <trans-unit id="_msg837">
<source xml:space="preserve">The entered address does not refer to a key.</source>
<context-group purpose="location"><context context-type="linenumber">126</context></context-group>
<context-group purpose="location"><context context-type="linenumber">225</context></context-group>
</trans-unit>
- <trans-unit id="_msg836">
+ <trans-unit id="_msg838">
<source xml:space="preserve">Wallet unlock was cancelled.</source>
<context-group purpose="location"><context context-type="linenumber">134</context></context-group>
</trans-unit>
- <trans-unit id="_msg837">
+ <trans-unit id="_msg839">
<source xml:space="preserve">No error</source>
<context-group purpose="location"><context context-type="linenumber">145</context></context-group>
</trans-unit>
- <trans-unit id="_msg838">
+ <trans-unit id="_msg840">
<source xml:space="preserve">Private key for the entered address is not available.</source>
<context-group purpose="location"><context context-type="linenumber">148</context></context-group>
</trans-unit>
- <trans-unit id="_msg839">
+ <trans-unit id="_msg841">
<source xml:space="preserve">Message signing failed.</source>
<context-group purpose="location"><context context-type="linenumber">151</context></context-group>
</trans-unit>
- <trans-unit id="_msg840">
+ <trans-unit id="_msg842">
<source xml:space="preserve">Message signed.</source>
<context-group purpose="location"><context context-type="linenumber">163</context></context-group>
</trans-unit>
- <trans-unit id="_msg841">
+ <trans-unit id="_msg843">
<source xml:space="preserve">The signature could not be decoded.</source>
<context-group purpose="location"><context context-type="linenumber">232</context></context-group>
</trans-unit>
- <trans-unit id="_msg842">
+ <trans-unit id="_msg844">
<source xml:space="preserve">Please check the signature and try again.</source>
<context-group purpose="location"><context context-type="linenumber">233</context></context-group>
<context-group purpose="location"><context context-type="linenumber">240</context></context-group>
</trans-unit>
- <trans-unit id="_msg843">
+ <trans-unit id="_msg845">
<source xml:space="preserve">The signature did not match the message digest.</source>
<context-group purpose="location"><context context-type="linenumber">239</context></context-group>
</trans-unit>
- <trans-unit id="_msg844">
+ <trans-unit id="_msg846">
<source xml:space="preserve">Message verification failed.</source>
<context-group purpose="location"><context context-type="linenumber">245</context></context-group>
</trans-unit>
- <trans-unit id="_msg845">
+ <trans-unit id="_msg847">
<source xml:space="preserve">Message verified.</source>
<context-group purpose="location"><context context-type="linenumber">213</context></context-group>
</trans-unit>
@@ -3889,11 +3899,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../splashscreen.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="SplashScreen">
- <trans-unit id="_msg846">
+ <trans-unit id="_msg848">
<source xml:space="preserve">(press q to shutdown and continue later)</source>
<context-group purpose="location"><context context-type="linenumber">177</context></context-group>
</trans-unit>
- <trans-unit id="_msg847">
+ <trans-unit id="_msg849">
<source xml:space="preserve">press q to shutdown</source>
<context-group purpose="location"><context context-type="linenumber">178</context></context-group>
</trans-unit>
@@ -3901,7 +3911,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../trafficgraphwidget.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TrafficGraphWidget">
- <trans-unit id="_msg848">
+ <trans-unit id="_msg850">
<source xml:space="preserve">kB/s</source>
<context-group purpose="location"><context context-type="linenumber">74</context></context-group>
</trans-unit>
@@ -3909,84 +3919,84 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../transactiondesc.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TransactionDesc">
- <trans-unit id="_msg849">
+ <trans-unit id="_msg851">
<source xml:space="preserve">conflicted with a transaction with %1 confirmations</source>
<context-group purpose="location"><context context-type="linenumber">44</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</note>
</trans-unit>
- <trans-unit id="_msg850">
+ <trans-unit id="_msg852">
<source xml:space="preserve">0/unconfirmed, in memory pool</source>
<context-group purpose="location"><context context-type="linenumber">51</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</note>
</trans-unit>
- <trans-unit id="_msg851">
+ <trans-unit id="_msg853">
<source xml:space="preserve">0/unconfirmed, not in memory pool</source>
<context-group purpose="location"><context context-type="linenumber">56</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</note>
</trans-unit>
- <trans-unit id="_msg852">
+ <trans-unit id="_msg854">
<source xml:space="preserve">abandoned</source>
<context-group purpose="location"><context context-type="linenumber">62</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</note>
</trans-unit>
- <trans-unit id="_msg853">
+ <trans-unit id="_msg855">
<source xml:space="preserve">%1/unconfirmed</source>
<context-group purpose="location"><context context-type="linenumber">70</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</note>
</trans-unit>
- <trans-unit id="_msg854">
+ <trans-unit id="_msg856">
<source xml:space="preserve">%1 confirmations</source>
<context-group purpose="location"><context context-type="linenumber">75</context></context-group>
<note annotates="source" from="developer">Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</note>
</trans-unit>
- <trans-unit id="_msg855">
+ <trans-unit id="_msg857">
<source xml:space="preserve">Status</source>
<context-group purpose="location"><context context-type="linenumber">125</context></context-group>
</trans-unit>
- <trans-unit id="_msg856">
+ <trans-unit id="_msg858">
<source xml:space="preserve">Date</source>
<context-group purpose="location"><context context-type="linenumber">128</context></context-group>
</trans-unit>
- <trans-unit id="_msg857">
+ <trans-unit id="_msg859">
<source xml:space="preserve">Source</source>
<context-group purpose="location"><context context-type="linenumber">135</context></context-group>
</trans-unit>
- <trans-unit id="_msg858">
+ <trans-unit id="_msg860">
<source xml:space="preserve">Generated</source>
<context-group purpose="location"><context context-type="linenumber">135</context></context-group>
</trans-unit>
- <trans-unit id="_msg859">
+ <trans-unit id="_msg861">
<source xml:space="preserve">From</source>
<context-group purpose="location"><context context-type="linenumber">140</context></context-group>
<context-group purpose="location"><context context-type="linenumber">154</context></context-group>
<context-group purpose="location"><context context-type="linenumber">226</context></context-group>
</trans-unit>
- <trans-unit id="_msg860">
+ <trans-unit id="_msg862">
<source xml:space="preserve">unknown</source>
<context-group purpose="location"><context context-type="linenumber">154</context></context-group>
</trans-unit>
- <trans-unit id="_msg861">
+ <trans-unit id="_msg863">
<source xml:space="preserve">To</source>
<context-group purpose="location"><context context-type="linenumber">155</context></context-group>
<context-group purpose="location"><context context-type="linenumber">175</context></context-group>
<context-group purpose="location"><context context-type="linenumber">245</context></context-group>
</trans-unit>
- <trans-unit id="_msg862">
+ <trans-unit id="_msg864">
<source xml:space="preserve">own address</source>
<context-group purpose="location"><context context-type="linenumber">157</context></context-group>
<context-group purpose="location"><context context-type="linenumber">252</context></context-group>
</trans-unit>
- <trans-unit id="_msg863">
+ <trans-unit id="_msg865">
<source xml:space="preserve">watch-only</source>
<context-group purpose="location"><context context-type="linenumber">157</context></context-group>
<context-group purpose="location"><context context-type="linenumber">226</context></context-group>
<context-group purpose="location"><context context-type="linenumber">254</context></context-group>
</trans-unit>
- <trans-unit id="_msg864">
+ <trans-unit id="_msg866">
<source xml:space="preserve">label</source>
<context-group purpose="location"><context context-type="linenumber">159</context></context-group>
</trans-unit>
- <trans-unit id="_msg865">
+ <trans-unit id="_msg867">
<source xml:space="preserve">Credit</source>
<context-group purpose="location"><context context-type="linenumber">195</context></context-group>
<context-group purpose="location"><context context-type="linenumber">207</context></context-group>
@@ -3996,107 +4006,107 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</trans-unit>
<group restype="x-gettext-plurals">
<context-group purpose="location"><context context-type="linenumber">197</context></context-group>
- <trans-unit id="_msg866[0]">
+ <trans-unit id="_msg868[0]">
<source xml:space="preserve">matures in %n more block(s)</source>
</trans-unit>
- <trans-unit id="_msg866[1]">
+ <trans-unit id="_msg868[1]">
<source xml:space="preserve">matures in %n more block(s)</source>
</trans-unit>
</group>
- <trans-unit id="_msg867">
+ <trans-unit id="_msg869">
<source xml:space="preserve">not accepted</source>
<context-group purpose="location"><context context-type="linenumber">199</context></context-group>
</trans-unit>
- <trans-unit id="_msg868">
+ <trans-unit id="_msg870">
<source xml:space="preserve">Debit</source>
<context-group purpose="location"><context context-type="linenumber">259</context></context-group>
<context-group purpose="location"><context context-type="linenumber">285</context></context-group>
<context-group purpose="location"><context context-type="linenumber">348</context></context-group>
</trans-unit>
- <trans-unit id="_msg869">
+ <trans-unit id="_msg871">
<source xml:space="preserve">Total debit</source>
<context-group purpose="location"><context context-type="linenumber">269</context></context-group>
</trans-unit>
- <trans-unit id="_msg870">
+ <trans-unit id="_msg872">
<source xml:space="preserve">Total credit</source>
<context-group purpose="location"><context context-type="linenumber">270</context></context-group>
</trans-unit>
- <trans-unit id="_msg871">
+ <trans-unit id="_msg873">
<source xml:space="preserve">Transaction fee</source>
<context-group purpose="location"><context context-type="linenumber">275</context></context-group>
</trans-unit>
- <trans-unit id="_msg872">
+ <trans-unit id="_msg874">
<source xml:space="preserve">Net amount</source>
<context-group purpose="location"><context context-type="linenumber">297</context></context-group>
</trans-unit>
- <trans-unit id="_msg873">
+ <trans-unit id="_msg875">
<source xml:space="preserve">Message</source>
<context-group purpose="location"><context context-type="linenumber">303</context></context-group>
<context-group purpose="location"><context context-type="linenumber">315</context></context-group>
</trans-unit>
- <trans-unit id="_msg874">
+ <trans-unit id="_msg876">
<source xml:space="preserve">Comment</source>
<context-group purpose="location"><context context-type="linenumber">305</context></context-group>
</trans-unit>
- <trans-unit id="_msg875">
+ <trans-unit id="_msg877">
<source xml:space="preserve">Transaction ID</source>
<context-group purpose="location"><context context-type="linenumber">307</context></context-group>
</trans-unit>
- <trans-unit id="_msg876">
+ <trans-unit id="_msg878">
<source xml:space="preserve">Transaction total size</source>
<context-group purpose="location"><context context-type="linenumber">308</context></context-group>
</trans-unit>
- <trans-unit id="_msg877">
+ <trans-unit id="_msg879">
<source xml:space="preserve">Transaction virtual size</source>
<context-group purpose="location"><context context-type="linenumber">309</context></context-group>
</trans-unit>
- <trans-unit id="_msg878">
+ <trans-unit id="_msg880">
<source xml:space="preserve">Output index</source>
<context-group purpose="location"><context context-type="linenumber">310</context></context-group>
</trans-unit>
- <trans-unit id="_msg879">
- <source xml:space="preserve"> (Certificate was not verified)</source>
+ <trans-unit id="_msg881">
+ <source xml:space="preserve">%1 (Certificate was not verified)</source>
<context-group purpose="location"><context context-type="linenumber">326</context></context-group>
</trans-unit>
- <trans-unit id="_msg880">
+ <trans-unit id="_msg882">
<source xml:space="preserve">Merchant</source>
<context-group purpose="location"><context context-type="linenumber">329</context></context-group>
</trans-unit>
- <trans-unit id="_msg881">
+ <trans-unit id="_msg883">
<source xml:space="preserve">Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to &quot;not accepted&quot; and it won&apos;t be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
<context-group purpose="location"><context context-type="linenumber">337</context></context-group>
</trans-unit>
- <trans-unit id="_msg882">
+ <trans-unit id="_msg884">
<source xml:space="preserve">Debug information</source>
<context-group purpose="location"><context context-type="linenumber">345</context></context-group>
</trans-unit>
- <trans-unit id="_msg883">
+ <trans-unit id="_msg885">
<source xml:space="preserve">Transaction</source>
<context-group purpose="location"><context context-type="linenumber">353</context></context-group>
</trans-unit>
- <trans-unit id="_msg884">
+ <trans-unit id="_msg886">
<source xml:space="preserve">Inputs</source>
<context-group purpose="location"><context context-type="linenumber">356</context></context-group>
</trans-unit>
- <trans-unit id="_msg885">
+ <trans-unit id="_msg887">
<source xml:space="preserve">Amount</source>
- <context-group purpose="location"><context context-type="linenumber">377</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">375</context></context-group>
</trans-unit>
- <trans-unit id="_msg886">
+ <trans-unit id="_msg888">
<source xml:space="preserve">true</source>
- <context-group purpose="location"><context context-type="linenumber">378</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">379</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">376</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">377</context></context-group>
</trans-unit>
- <trans-unit id="_msg887">
+ <trans-unit id="_msg889">
<source xml:space="preserve">false</source>
- <context-group purpose="location"><context context-type="linenumber">378</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">379</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">376</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">377</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../forms/transactiondescdialog.ui" datatype="x-trolltech-designer-ui" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TransactionDescDialog">
- <trans-unit id="_msg888">
+ <trans-unit id="_msg890">
<source xml:space="preserve">This pane shows a detailed description of the transaction</source>
<context-group purpose="location"><context context-type="linenumber">20</context></context-group>
</trans-unit>
@@ -4104,7 +4114,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../transactiondescdialog.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TransactionDescDialog">
- <trans-unit id="_msg889">
+ <trans-unit id="_msg891">
<source xml:space="preserve">Details for %1</source>
<context-group purpose="location"><context context-type="linenumber">18</context></context-group>
</trans-unit>
@@ -4112,95 +4122,95 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../transactiontablemodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TransactionTableModel">
- <trans-unit id="_msg890">
+ <trans-unit id="_msg892">
<source xml:space="preserve">Date</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
- <trans-unit id="_msg891">
+ <trans-unit id="_msg893">
<source xml:space="preserve">Type</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
- <trans-unit id="_msg892">
+ <trans-unit id="_msg894">
<source xml:space="preserve">Label</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
- <trans-unit id="_msg893">
+ <trans-unit id="_msg895">
<source xml:space="preserve">Unconfirmed</source>
<context-group purpose="location"><context context-type="linenumber">318</context></context-group>
</trans-unit>
- <trans-unit id="_msg894">
+ <trans-unit id="_msg896">
<source xml:space="preserve">Abandoned</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
- <trans-unit id="_msg895">
+ <trans-unit id="_msg897">
<source xml:space="preserve">Confirming (%1 of %2 recommended confirmations)</source>
<context-group purpose="location"><context context-type="linenumber">324</context></context-group>
</trans-unit>
- <trans-unit id="_msg896">
+ <trans-unit id="_msg898">
<source xml:space="preserve">Confirmed (%1 confirmations)</source>
<context-group purpose="location"><context context-type="linenumber">327</context></context-group>
</trans-unit>
- <trans-unit id="_msg897">
+ <trans-unit id="_msg899">
<source xml:space="preserve">Conflicted</source>
<context-group purpose="location"><context context-type="linenumber">330</context></context-group>
</trans-unit>
- <trans-unit id="_msg898">
+ <trans-unit id="_msg900">
<source xml:space="preserve">Immature (%1 confirmations, will be available after %2)</source>
<context-group purpose="location"><context context-type="linenumber">333</context></context-group>
</trans-unit>
- <trans-unit id="_msg899">
+ <trans-unit id="_msg901">
<source xml:space="preserve">Generated but not accepted</source>
<context-group purpose="location"><context context-type="linenumber">336</context></context-group>
</trans-unit>
- <trans-unit id="_msg900">
+ <trans-unit id="_msg902">
<source xml:space="preserve">Received with</source>
<context-group purpose="location"><context context-type="linenumber">375</context></context-group>
</trans-unit>
- <trans-unit id="_msg901">
+ <trans-unit id="_msg903">
<source xml:space="preserve">Received from</source>
<context-group purpose="location"><context context-type="linenumber">377</context></context-group>
</trans-unit>
- <trans-unit id="_msg902">
+ <trans-unit id="_msg904">
<source xml:space="preserve">Sent to</source>
<context-group purpose="location"><context context-type="linenumber">380</context></context-group>
</trans-unit>
- <trans-unit id="_msg903">
+ <trans-unit id="_msg905">
<source xml:space="preserve">Mined</source>
<context-group purpose="location"><context context-type="linenumber">382</context></context-group>
</trans-unit>
- <trans-unit id="_msg904">
+ <trans-unit id="_msg906">
<source xml:space="preserve">watch-only</source>
<context-group purpose="location"><context context-type="linenumber">410</context></context-group>
</trans-unit>
- <trans-unit id="_msg905">
+ <trans-unit id="_msg907">
<source xml:space="preserve">(n/a)</source>
<context-group purpose="location"><context context-type="linenumber">424</context></context-group>
</trans-unit>
- <trans-unit id="_msg906">
+ <trans-unit id="_msg908">
<source xml:space="preserve">(no label)</source>
<context-group purpose="location"><context context-type="linenumber">629</context></context-group>
</trans-unit>
- <trans-unit id="_msg907">
+ <trans-unit id="_msg909">
<source xml:space="preserve">Transaction status. Hover over this field to show number of confirmations.</source>
<context-group purpose="location"><context context-type="linenumber">668</context></context-group>
</trans-unit>
- <trans-unit id="_msg908">
+ <trans-unit id="_msg910">
<source xml:space="preserve">Date and time that the transaction was received.</source>
<context-group purpose="location"><context context-type="linenumber">670</context></context-group>
</trans-unit>
- <trans-unit id="_msg909">
+ <trans-unit id="_msg911">
<source xml:space="preserve">Type of transaction.</source>
<context-group purpose="location"><context context-type="linenumber">672</context></context-group>
</trans-unit>
- <trans-unit id="_msg910">
+ <trans-unit id="_msg912">
<source xml:space="preserve">Whether or not a watch-only address is involved in this transaction.</source>
<context-group purpose="location"><context context-type="linenumber">674</context></context-group>
</trans-unit>
- <trans-unit id="_msg911">
+ <trans-unit id="_msg913">
<source xml:space="preserve">User-defined intent/purpose of the transaction.</source>
<context-group purpose="location"><context context-type="linenumber">676</context></context-group>
</trans-unit>
- <trans-unit id="_msg912">
+ <trans-unit id="_msg914">
<source xml:space="preserve">Amount removed from or added to balance.</source>
<context-group purpose="location"><context context-type="linenumber">678</context></context-group>
</trans-unit>
@@ -4208,202 +4218,202 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of &quot;100
</body></file>
<file original="../transactionview.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="TransactionView">
- <trans-unit id="_msg913">
+ <trans-unit id="_msg915">
<source xml:space="preserve">All</source>
<context-group purpose="location"><context context-type="linenumber">73</context></context-group>
<context-group purpose="location"><context context-type="linenumber">89</context></context-group>
</trans-unit>
- <trans-unit id="_msg914">
+ <trans-unit id="_msg916">
<source xml:space="preserve">Today</source>
<context-group purpose="location"><context context-type="linenumber">74</context></context-group>
</trans-unit>
- <trans-unit id="_msg915">
+ <trans-unit id="_msg917">
<source xml:space="preserve">This week</source>
<context-group purpose="location"><context context-type="linenumber">75</context></context-group>
</trans-unit>
- <trans-unit id="_msg916">
+ <trans-unit id="_msg918">
<source xml:space="preserve">This month</source>
<context-group purpose="location"><context context-type="linenumber">76</context></context-group>
</trans-unit>
- <trans-unit id="_msg917">
+ <trans-unit id="_msg919">
<source xml:space="preserve">Last month</source>
<context-group purpose="location"><context context-type="linenumber">77</context></context-group>
</trans-unit>
- <trans-unit id="_msg918">
+ <trans-unit id="_msg920">
<source xml:space="preserve">This year</source>
<context-group purpose="location"><context context-type="linenumber">78</context></context-group>
</trans-unit>
- <trans-unit id="_msg919">
+ <trans-unit id="_msg921">
<source xml:space="preserve">Received with</source>
<context-group purpose="location"><context context-type="linenumber">90</context></context-group>
</trans-unit>
- <trans-unit id="_msg920">
+ <trans-unit id="_msg922">
<source xml:space="preserve">Sent to</source>
<context-group purpose="location"><context context-type="linenumber">92</context></context-group>
</trans-unit>
- <trans-unit id="_msg921">
+ <trans-unit id="_msg923">
<source xml:space="preserve">Mined</source>
<context-group purpose="location"><context context-type="linenumber">94</context></context-group>
</trans-unit>
- <trans-unit id="_msg922">
+ <trans-unit id="_msg924">
<source xml:space="preserve">Other</source>
<context-group purpose="location"><context context-type="linenumber">95</context></context-group>
</trans-unit>
- <trans-unit id="_msg923">
+ <trans-unit id="_msg925">
<source xml:space="preserve">Enter address, transaction id, or label to search</source>
<context-group purpose="location"><context context-type="linenumber">100</context></context-group>
</trans-unit>
- <trans-unit id="_msg924">
+ <trans-unit id="_msg926">
<source xml:space="preserve">Min amount</source>
<context-group purpose="location"><context context-type="linenumber">104</context></context-group>
</trans-unit>
- <trans-unit id="_msg925">
+ <trans-unit id="_msg927">
<source xml:space="preserve">Range…</source>
<context-group purpose="location"><context context-type="linenumber">79</context></context-group>
</trans-unit>
- <trans-unit id="_msg926">
+ <trans-unit id="_msg928">
<source xml:space="preserve">&amp;Copy address</source>
<context-group purpose="location"><context context-type="linenumber">168</context></context-group>
</trans-unit>
- <trans-unit id="_msg927">
+ <trans-unit id="_msg929">
<source xml:space="preserve">Copy &amp;label</source>
<context-group purpose="location"><context context-type="linenumber">169</context></context-group>
</trans-unit>
- <trans-unit id="_msg928">
+ <trans-unit id="_msg930">
<source xml:space="preserve">Copy &amp;amount</source>
<context-group purpose="location"><context context-type="linenumber">170</context></context-group>
</trans-unit>
- <trans-unit id="_msg929">
+ <trans-unit id="_msg931">
<source xml:space="preserve">Copy transaction &amp;ID</source>
<context-group purpose="location"><context context-type="linenumber">171</context></context-group>
</trans-unit>
- <trans-unit id="_msg930">
+ <trans-unit id="_msg932">
<source xml:space="preserve">Copy &amp;raw transaction</source>
<context-group purpose="location"><context context-type="linenumber">172</context></context-group>
</trans-unit>
- <trans-unit id="_msg931">
+ <trans-unit id="_msg933">
<source xml:space="preserve">Copy full transaction &amp;details</source>
<context-group purpose="location"><context context-type="linenumber">173</context></context-group>
</trans-unit>
- <trans-unit id="_msg932">
+ <trans-unit id="_msg934">
<source xml:space="preserve">&amp;Show transaction details</source>
<context-group purpose="location"><context context-type="linenumber">174</context></context-group>
</trans-unit>
- <trans-unit id="_msg933">
+ <trans-unit id="_msg935">
<source xml:space="preserve">Increase transaction &amp;fee</source>
<context-group purpose="location"><context context-type="linenumber">176</context></context-group>
</trans-unit>
- <trans-unit id="_msg934">
+ <trans-unit id="_msg936">
<source xml:space="preserve">A&amp;bandon transaction</source>
<context-group purpose="location"><context context-type="linenumber">179</context></context-group>
</trans-unit>
- <trans-unit id="_msg935">
+ <trans-unit id="_msg937">
<source xml:space="preserve">&amp;Edit address label</source>
<context-group purpose="location"><context context-type="linenumber">180</context></context-group>
</trans-unit>
- <trans-unit id="_msg936">
+ <trans-unit id="_msg938">
<source xml:space="preserve">Show in %1</source>
<context-group purpose="location"><context context-type="linenumber">239</context></context-group>
<note annotates="source" from="developer">Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</note>
</trans-unit>
- <trans-unit id="_msg937">
+ <trans-unit id="_msg939">
<source xml:space="preserve">Export Transaction History</source>
<context-group purpose="location"><context context-type="linenumber">358</context></context-group>
</trans-unit>
- <trans-unit id="_msg938">
+ <trans-unit id="_msg940">
<source xml:space="preserve">Comma separated file</source>
<context-group purpose="location"><context context-type="linenumber">361</context></context-group>
<note annotates="source" from="developer">Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</note>
</trans-unit>
- <trans-unit id="_msg939">
+ <trans-unit id="_msg941">
<source xml:space="preserve">Confirmed</source>
<context-group purpose="location"><context context-type="linenumber">370</context></context-group>
</trans-unit>
- <trans-unit id="_msg940">
+ <trans-unit id="_msg942">
<source xml:space="preserve">Watch-only</source>
<context-group purpose="location"><context context-type="linenumber">372</context></context-group>
</trans-unit>
- <trans-unit id="_msg941">
+ <trans-unit id="_msg943">
<source xml:space="preserve">Date</source>
<context-group purpose="location"><context context-type="linenumber">373</context></context-group>
</trans-unit>
- <trans-unit id="_msg942">
+ <trans-unit id="_msg944">
<source xml:space="preserve">Type</source>
<context-group purpose="location"><context context-type="linenumber">374</context></context-group>
</trans-unit>
- <trans-unit id="_msg943">
+ <trans-unit id="_msg945">
<source xml:space="preserve">Label</source>
<context-group purpose="location"><context context-type="linenumber">375</context></context-group>
</trans-unit>
- <trans-unit id="_msg944">
+ <trans-unit id="_msg946">
<source xml:space="preserve">Address</source>
<context-group purpose="location"><context context-type="linenumber">376</context></context-group>
</trans-unit>
- <trans-unit id="_msg945">
+ <trans-unit id="_msg947">
<source xml:space="preserve">ID</source>
<context-group purpose="location"><context context-type="linenumber">378</context></context-group>
</trans-unit>
- <trans-unit id="_msg946">
+ <trans-unit id="_msg948">
<source xml:space="preserve">Exporting Failed</source>
<context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg947">
+ <trans-unit id="_msg949">
<source xml:space="preserve">There was an error trying to save the transaction history to %1.</source>
<context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
- <trans-unit id="_msg948">
+ <trans-unit id="_msg950">
<source xml:space="preserve">Exporting Successful</source>
<context-group purpose="location"><context context-type="linenumber">385</context></context-group>
</trans-unit>
- <trans-unit id="_msg949">
+ <trans-unit id="_msg951">
<source xml:space="preserve">The transaction history was successfully saved to %1.</source>
<context-group purpose="location"><context context-type="linenumber">385</context></context-group>
</trans-unit>
- <trans-unit id="_msg950">
+ <trans-unit id="_msg952">
<source xml:space="preserve">Range:</source>
- <context-group purpose="location"><context context-type="linenumber">555</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">558</context></context-group>
</trans-unit>
- <trans-unit id="_msg951">
+ <trans-unit id="_msg953">
<source xml:space="preserve">to</source>
- <context-group purpose="location"><context context-type="linenumber">563</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">566</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../walletframe.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="WalletFrame">
- <trans-unit id="_msg952">
+ <trans-unit id="_msg954">
<source xml:space="preserve">No wallet has been loaded.
Go to File &gt; Open Wallet to load a wallet.
- OR -</source>
<context-group purpose="location"><context context-type="linenumber">45</context></context-group>
</trans-unit>
- <trans-unit id="_msg953">
+ <trans-unit id="_msg955">
<source xml:space="preserve">Create a new wallet</source>
<context-group purpose="location"><context context-type="linenumber">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg954">
+ <trans-unit id="_msg956">
<source xml:space="preserve">Error</source>
<context-group purpose="location"><context context-type="linenumber">201</context></context-group>
<context-group purpose="location"><context context-type="linenumber">211</context></context-group>
<context-group purpose="location"><context context-type="linenumber">229</context></context-group>
</trans-unit>
- <trans-unit id="_msg955">
+ <trans-unit id="_msg957">
<source xml:space="preserve">Unable to decode PSBT from clipboard (invalid base64)</source>
<context-group purpose="location"><context context-type="linenumber">201</context></context-group>
</trans-unit>
- <trans-unit id="_msg956">
+ <trans-unit id="_msg958">
<source xml:space="preserve">Load Transaction Data</source>
<context-group purpose="location"><context context-type="linenumber">207</context></context-group>
</trans-unit>
- <trans-unit id="_msg957">
+ <trans-unit id="_msg959">
<source xml:space="preserve">Partially Signed Transaction (*.psbt)</source>
<context-group purpose="location"><context context-type="linenumber">208</context></context-group>
</trans-unit>
- <trans-unit id="_msg958">
+ <trans-unit id="_msg960">
<source xml:space="preserve">PSBT file must be smaller than 100 MiB</source>
<context-group purpose="location"><context context-type="linenumber">211</context></context-group>
</trans-unit>
- <trans-unit id="_msg959">
+ <trans-unit id="_msg961">
<source xml:space="preserve">Unable to decode PSBT</source>
<context-group purpose="location"><context context-type="linenumber">229</context></context-group>
</trans-unit>
@@ -4411,114 +4421,114 @@ Go to File &gt; Open Wallet to load a wallet.
</body></file>
<file original="../walletmodel.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="WalletModel">
- <trans-unit id="_msg960">
+ <trans-unit id="_msg962">
<source xml:space="preserve">Send Coins</source>
- <context-group purpose="location"><context context-type="linenumber">228</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">241</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">227</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">240</context></context-group>
</trans-unit>
- <trans-unit id="_msg961">
+ <trans-unit id="_msg963">
<source xml:space="preserve">Fee bump error</source>
- <context-group purpose="location"><context context-type="linenumber">488</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">543</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">558</context></context-group>
- <context-group purpose="location"><context context-type="linenumber">563</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">494</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">549</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">564</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">569</context></context-group>
</trans-unit>
- <trans-unit id="_msg962">
+ <trans-unit id="_msg964">
<source xml:space="preserve">Increasing transaction fee failed</source>
- <context-group purpose="location"><context context-type="linenumber">488</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">494</context></context-group>
</trans-unit>
- <trans-unit id="_msg963">
+ <trans-unit id="_msg965">
<source xml:space="preserve">Do you want to increase the fee?</source>
- <context-group purpose="location"><context context-type="linenumber">495</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">501</context></context-group>
<note annotates="source" from="developer">Asks a user if they would like to manually increase the fee of a transaction that has already been created.</note>
</trans-unit>
- <trans-unit id="_msg964">
+ <trans-unit id="_msg966">
<source xml:space="preserve">Current fee:</source>
- <context-group purpose="location"><context context-type="linenumber">499</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">505</context></context-group>
</trans-unit>
- <trans-unit id="_msg965">
+ <trans-unit id="_msg967">
<source xml:space="preserve">Increase:</source>
- <context-group purpose="location"><context context-type="linenumber">503</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">509</context></context-group>
</trans-unit>
- <trans-unit id="_msg966">
+ <trans-unit id="_msg968">
<source xml:space="preserve">New fee:</source>
- <context-group purpose="location"><context context-type="linenumber">507</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">513</context></context-group>
</trans-unit>
- <trans-unit id="_msg967">
+ <trans-unit id="_msg969">
<source xml:space="preserve">Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
- <context-group purpose="location"><context context-type="linenumber">515</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">521</context></context-group>
</trans-unit>
- <trans-unit id="_msg968">
+ <trans-unit id="_msg970">
<source xml:space="preserve">Confirm fee bump</source>
- <context-group purpose="location"><context context-type="linenumber">520</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">526</context></context-group>
</trans-unit>
- <trans-unit id="_msg969">
+ <trans-unit id="_msg971">
<source xml:space="preserve">Can&apos;t draft transaction.</source>
- <context-group purpose="location"><context context-type="linenumber">543</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">549</context></context-group>
</trans-unit>
- <trans-unit id="_msg970">
+ <trans-unit id="_msg972">
<source xml:space="preserve">PSBT copied</source>
- <context-group purpose="location"><context context-type="linenumber">550</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">556</context></context-group>
</trans-unit>
- <trans-unit id="_msg971">
+ <trans-unit id="_msg973">
<source xml:space="preserve">Copied to clipboard</source>
- <context-group purpose="location"><context context-type="linenumber">550</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">556</context></context-group>
<context-group><context context-type="x-gettext-msgctxt">Fee-bump PSBT saved</context></context-group>
</trans-unit>
- <trans-unit id="_msg972">
+ <trans-unit id="_msg974">
<source xml:space="preserve">Can&apos;t sign transaction.</source>
- <context-group purpose="location"><context context-type="linenumber">558</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">564</context></context-group>
</trans-unit>
- <trans-unit id="_msg973">
+ <trans-unit id="_msg975">
<source xml:space="preserve">Could not commit transaction</source>
- <context-group purpose="location"><context context-type="linenumber">563</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">569</context></context-group>
</trans-unit>
- <trans-unit id="_msg974">
+ <trans-unit id="_msg976">
<source xml:space="preserve">Can&apos;t display address</source>
- <context-group purpose="location"><context context-type="linenumber">577</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">583</context></context-group>
</trans-unit>
- <trans-unit id="_msg975">
+ <trans-unit id="_msg977">
<source xml:space="preserve">default wallet</source>
- <context-group purpose="location"><context context-type="linenumber">595</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">601</context></context-group>
</trans-unit>
</group>
</body></file>
<file original="../walletview.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="WalletView">
- <trans-unit id="_msg976">
+ <trans-unit id="_msg978">
<source xml:space="preserve">&amp;Export</source>
<context-group purpose="location"><context context-type="linenumber">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg977">
+ <trans-unit id="_msg979">
<source xml:space="preserve">Export the data in the current tab to a file</source>
<context-group purpose="location"><context context-type="linenumber">51</context></context-group>
</trans-unit>
- <trans-unit id="_msg978">
+ <trans-unit id="_msg980">
<source xml:space="preserve">Backup Wallet</source>
<context-group purpose="location"><context context-type="linenumber">214</context></context-group>
</trans-unit>
- <trans-unit id="_msg979">
+ <trans-unit id="_msg981">
<source xml:space="preserve">Wallet Data</source>
<context-group purpose="location"><context context-type="linenumber">216</context></context-group>
<note annotates="source" from="developer">Name of the wallet data file format.</note>
</trans-unit>
- <trans-unit id="_msg980">
+ <trans-unit id="_msg982">
<source xml:space="preserve">Backup Failed</source>
<context-group purpose="location"><context context-type="linenumber">222</context></context-group>
</trans-unit>
- <trans-unit id="_msg981">
+ <trans-unit id="_msg983">
<source xml:space="preserve">There was an error trying to save the wallet data to %1.</source>
<context-group purpose="location"><context context-type="linenumber">222</context></context-group>
</trans-unit>
- <trans-unit id="_msg982">
+ <trans-unit id="_msg984">
<source xml:space="preserve">Backup Successful</source>
<context-group purpose="location"><context context-type="linenumber">226</context></context-group>
</trans-unit>
- <trans-unit id="_msg983">
+ <trans-unit id="_msg985">
<source xml:space="preserve">The wallet data was successfully saved to %1.</source>
<context-group purpose="location"><context context-type="linenumber">226</context></context-group>
</trans-unit>
- <trans-unit id="_msg984">
+ <trans-unit id="_msg986">
<source xml:space="preserve">Cancel</source>
<context-group purpose="location"><context context-type="linenumber">263</context></context-group>
</trans-unit>
@@ -4526,318 +4536,318 @@ Go to File &gt; Open Wallet to load a wallet.
</body></file>
<file original="../bitcoinstrings.cpp" datatype="cpp" source-language="en"><body>
<group restype="x-trolltech-linguist-context" resname="bitcoin-core">
- <trans-unit id="_msg985">
+ <trans-unit id="_msg987">
<source xml:space="preserve">The %s developers</source>
<context-group purpose="location"><context context-type="linenumber">12</context></context-group>
</trans-unit>
- <trans-unit id="_msg986">
+ <trans-unit id="_msg988">
<source xml:space="preserve">%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
<context-group purpose="location"><context context-type="linenumber">13</context></context-group>
</trans-unit>
- <trans-unit id="_msg987">
+ <trans-unit id="_msg989">
<source xml:space="preserve">%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
<context-group purpose="location"><context context-type="linenumber">16</context></context-group>
</trans-unit>
- <trans-unit id="_msg988">
+ <trans-unit id="_msg990">
<source xml:space="preserve">%s request to listen on port %u. This port is considered &quot;bad&quot; and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<context-group purpose="location"><context context-type="linenumber">28</context></context-group>
</trans-unit>
- <trans-unit id="_msg989">
+ <trans-unit id="_msg991">
<source xml:space="preserve">Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
<context-group purpose="location"><context context-type="linenumber">32</context></context-group>
</trans-unit>
- <trans-unit id="_msg990">
+ <trans-unit id="_msg992">
<source xml:space="preserve">Cannot obtain a lock on data directory %s. %s is probably already running.</source>
<context-group purpose="location"><context context-type="linenumber">35</context></context-group>
</trans-unit>
- <trans-unit id="_msg991">
+ <trans-unit id="_msg993">
<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">40</context></context-group>
</trans-unit>
- <trans-unit id="_msg992">
+ <trans-unit id="_msg994">
<source xml:space="preserve">Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
<context-group purpose="location"><context context-type="linenumber">44</context></context-group>
</trans-unit>
- <trans-unit id="_msg993">
+ <trans-unit id="_msg995">
<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">47</context></context-group>
</trans-unit>
- <trans-unit id="_msg994">
+ <trans-unit id="_msg996">
<source xml:space="preserve">Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
<context-group purpose="location"><context context-type="linenumber">53</context></context-group>
</trans-unit>
- <trans-unit id="_msg995">
+ <trans-unit id="_msg997">
<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">61</context></context-group>
</trans-unit>
- <trans-unit id="_msg996">
+ <trans-unit id="_msg998">
<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">67</context></context-group>
</trans-unit>
- <trans-unit id="_msg997">
+ <trans-unit id="_msg999">
<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">69</context></context-group>
</trans-unit>
- <trans-unit id="_msg998">
+ <trans-unit id="_msg1000">
<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">71</context></context-group>
</trans-unit>
- <trans-unit id="_msg999">
+ <trans-unit id="_msg1001">
<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">77</context></context-group>
</trans-unit>
- <trans-unit id="_msg1000">
+ <trans-unit id="_msg1002">
<source xml:space="preserve">Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet&apos;s passphrase if it is encrypted.</source>
<context-group purpose="location"><context context-type="linenumber">83</context></context-group>
</trans-unit>
- <trans-unit id="_msg1001">
+ <trans-unit id="_msg1003">
<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">95</context></context-group>
</trans-unit>
- <trans-unit id="_msg1002">
+ <trans-unit id="_msg1004">
<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">104</context></context-group>
</trans-unit>
- <trans-unit id="_msg1003">
+ <trans-unit id="_msg1005">
<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">108</context></context-group>
</trans-unit>
- <trans-unit id="_msg1004">
+ <trans-unit id="_msg1006">
<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">111</context></context-group>
</trans-unit>
- <trans-unit id="_msg1005">
+ <trans-unit id="_msg1007">
<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">114</context></context-group>
</trans-unit>
- <trans-unit id="_msg1006">
+ <trans-unit id="_msg1008">
<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">116</context></context-group>
</trans-unit>
- <trans-unit id="_msg1007">
+ <trans-unit id="_msg1009">
<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">132</context></context-group>
</trans-unit>
- <trans-unit id="_msg1008">
+ <trans-unit id="_msg1010">
<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">135</context></context-group>
</trans-unit>
- <trans-unit id="_msg1009">
+ <trans-unit id="_msg1011">
<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">138</context></context-group>
</trans-unit>
- <trans-unit id="_msg1010">
+ <trans-unit id="_msg1012">
<source xml:space="preserve">Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<context-group purpose="location"><context context-type="linenumber">140</context></context-group>
</trans-unit>
- <trans-unit id="_msg1011">
+ <trans-unit id="_msg1013">
<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">143</context></context-group>
</trans-unit>
- <trans-unit id="_msg1012">
+ <trans-unit id="_msg1014">
<source xml:space="preserve">Rename of &apos;%s&apos; -&gt; &apos;%s&apos; failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
<context-group purpose="location"><context context-type="linenumber">146</context></context-group>
</trans-unit>
- <trans-unit id="_msg1013">
+ <trans-unit id="_msg1015">
<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">150</context></context-group>
</trans-unit>
- <trans-unit id="_msg1014">
+ <trans-unit id="_msg1016">
<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">153</context></context-group>
</trans-unit>
- <trans-unit id="_msg1015">
+ <trans-unit id="_msg1017">
<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">165</context></context-group>
</trans-unit>
- <trans-unit id="_msg1016">
+ <trans-unit id="_msg1018">
<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">167</context></context-group>
</trans-unit>
- <trans-unit id="_msg1017">
+ <trans-unit id="_msg1019">
<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">171</context></context-group>
</trans-unit>
- <trans-unit id="_msg1018">
+ <trans-unit id="_msg1020">
<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">174</context></context-group>
</trans-unit>
- <trans-unit id="_msg1019">
+ <trans-unit id="_msg1021">
<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">177</context></context-group>
</trans-unit>
- <trans-unit id="_msg1020">
+ <trans-unit id="_msg1022">
<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">180</context></context-group>
</trans-unit>
- <trans-unit id="_msg1021">
+ <trans-unit id="_msg1023">
<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">182</context></context-group>
</trans-unit>
- <trans-unit id="_msg1022">
+ <trans-unit id="_msg1024">
<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">191</context></context-group>
</trans-unit>
- <trans-unit id="_msg1023">
+ <trans-unit id="_msg1025">
<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">201</context></context-group>
</trans-unit>
- <trans-unit id="_msg1024">
+ <trans-unit id="_msg1026">
<source xml:space="preserve">Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
<context-group purpose="location"><context context-type="linenumber">209</context></context-group>
</trans-unit>
- <trans-unit id="_msg1025">
+ <trans-unit id="_msg1027">
<source xml:space="preserve">Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<context-group purpose="location"><context context-type="linenumber">212</context></context-group>
</trans-unit>
- <trans-unit id="_msg1026">
+ <trans-unit id="_msg1028">
<source xml:space="preserve">Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
<context-group purpose="location"><context context-type="linenumber">215</context></context-group>
</trans-unit>
- <trans-unit id="_msg1027">
+ <trans-unit id="_msg1029">
<source xml:space="preserve">Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
<context-group purpose="location"><context context-type="linenumber">219</context></context-group>
</trans-unit>
- <trans-unit id="_msg1028">
+ <trans-unit id="_msg1030">
<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">224</context></context-group>
</trans-unit>
- <trans-unit id="_msg1029">
+ <trans-unit id="_msg1031">
<source xml:space="preserve">Warning: Private keys detected in wallet {%s} with disabled private keys</source>
<context-group purpose="location"><context context-type="linenumber">227</context></context-group>
</trans-unit>
- <trans-unit id="_msg1030">
+ <trans-unit id="_msg1032">
<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">229</context></context-group>
</trans-unit>
- <trans-unit id="_msg1031">
+ <trans-unit id="_msg1033">
<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">232</context></context-group>
</trans-unit>
- <trans-unit id="_msg1032">
+ <trans-unit id="_msg1034">
<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">235</context></context-group>
</trans-unit>
- <trans-unit id="_msg1033">
+ <trans-unit id="_msg1035">
<source xml:space="preserve">%s is set very high!</source>
<context-group purpose="location"><context context-type="linenumber">244</context></context-group>
</trans-unit>
- <trans-unit id="_msg1034">
+ <trans-unit id="_msg1036">
<source xml:space="preserve">-maxmempool must be at least %d MB</source>
<context-group purpose="location"><context context-type="linenumber">245</context></context-group>
</trans-unit>
- <trans-unit id="_msg1035">
+ <trans-unit id="_msg1037">
<source xml:space="preserve">A fatal internal error occurred, see debug.log for details</source>
<context-group purpose="location"><context context-type="linenumber">246</context></context-group>
</trans-unit>
- <trans-unit id="_msg1036">
+ <trans-unit id="_msg1038">
<source xml:space="preserve">Cannot resolve -%s address: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">248</context></context-group>
</trans-unit>
- <trans-unit id="_msg1037">
+ <trans-unit id="_msg1039">
<source xml:space="preserve">Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
<context-group purpose="location"><context context-type="linenumber">249</context></context-group>
</trans-unit>
- <trans-unit id="_msg1038">
+ <trans-unit id="_msg1040">
<source xml:space="preserve">Cannot set -peerblockfilters without -blockfilterindex.</source>
<context-group purpose="location"><context context-type="linenumber">250</context></context-group>
</trans-unit>
- <trans-unit id="_msg1039">
+ <trans-unit id="_msg1041">
<source xml:space="preserve">Cannot write to data directory &apos;%s&apos;; check permissions.</source>
<context-group purpose="location"><context context-type="linenumber">251</context></context-group>
</trans-unit>
- <trans-unit id="_msg1040">
+ <trans-unit id="_msg1042">
<source xml:space="preserve">%s is set very high! Fees this large could be paid on a single transaction.</source>
<context-group purpose="location"><context context-type="linenumber">26</context></context-group>
</trans-unit>
- <trans-unit id="_msg1041">
+ <trans-unit id="_msg1043">
<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">37</context></context-group>
</trans-unit>
- <trans-unit id="_msg1042">
+ <trans-unit id="_msg1044">
<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">50</context></context-group>
</trans-unit>
- <trans-unit id="_msg1043">
+ <trans-unit id="_msg1045">
<source xml:space="preserve">Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
<context-group purpose="location"><context context-type="linenumber">58</context></context-group>
</trans-unit>
- <trans-unit id="_msg1044">
+ <trans-unit id="_msg1046">
<source xml:space="preserve">Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<context-group purpose="location"><context context-type="linenumber">64</context></context-group>
</trans-unit>
- <trans-unit id="_msg1045">
+ <trans-unit id="_msg1047">
<source xml:space="preserve">Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
<context-group purpose="location"><context context-type="linenumber">74</context></context-group>
</trans-unit>
- <trans-unit id="_msg1046">
+ <trans-unit id="_msg1048">
<source xml:space="preserve">Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
<context-group purpose="location"><context context-type="linenumber">80</context></context-group>
</trans-unit>
- <trans-unit id="_msg1047">
+ <trans-unit id="_msg1049">
<source xml:space="preserve">Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
<context-group purpose="location"><context context-type="linenumber">86</context></context-group>
</trans-unit>
- <trans-unit id="_msg1048">
+ <trans-unit id="_msg1050">
<source xml:space="preserve">Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<context-group purpose="location"><context context-type="linenumber">89</context></context-group>
</trans-unit>
- <trans-unit id="_msg1049">
+ <trans-unit id="_msg1051">
<source xml:space="preserve">Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
<context-group purpose="location"><context context-type="linenumber">92</context></context-group>
</trans-unit>
- <trans-unit id="_msg1050">
+ <trans-unit id="_msg1052">
<source xml:space="preserve">Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<context-group purpose="location"><context context-type="linenumber">98</context></context-group>
</trans-unit>
- <trans-unit id="_msg1051">
+ <trans-unit id="_msg1053">
<source xml:space="preserve">Invalid amount for %s=&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">101</context></context-group>
</trans-unit>
- <trans-unit id="_msg1052">
+ <trans-unit id="_msg1054">
<source xml:space="preserve">Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<context-group purpose="location"><context context-type="linenumber">119</context></context-group>
</trans-unit>
- <trans-unit id="_msg1053">
+ <trans-unit id="_msg1055">
<source xml:space="preserve">Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0</source>
<context-group purpose="location"><context context-type="linenumber">122</context></context-group>
</trans-unit>
- <trans-unit id="_msg1054">
+ <trans-unit id="_msg1056">
<source xml:space="preserve">Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given</source>
<context-group purpose="location"><context context-type="linenumber">125</context></context-group>
</trans-unit>
- <trans-unit id="_msg1055">
+ <trans-unit id="_msg1057">
<source xml:space="preserve">Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
<context-group purpose="location"><context context-type="linenumber">129</context></context-group>
</trans-unit>
- <trans-unit id="_msg1056">
+ <trans-unit id="_msg1058">
<source xml:space="preserve">The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet&apos;s UTXOs</source>
<context-group purpose="location"><context context-type="linenumber">158</context></context-group>
</trans-unit>
- <trans-unit id="_msg1057">
+ <trans-unit id="_msg1059">
<source xml:space="preserve">The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
<context-group purpose="location"><context context-type="linenumber">161</context></context-group>
</trans-unit>
- <trans-unit id="_msg1058">
+ <trans-unit id="_msg1060">
<source xml:space="preserve">Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
<context-group purpose="location"><context context-type="linenumber">185</context></context-group>
</trans-unit>
- <trans-unit id="_msg1059">
+ <trans-unit id="_msg1061">
<source xml:space="preserve">UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
<context-group purpose="location"><context context-type="linenumber">188</context></context-group>
</trans-unit>
- <trans-unit id="_msg1060">
+ <trans-unit id="_msg1062">
<source xml:space="preserve">Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
<context-group purpose="location"><context context-type="linenumber">194</context></context-group>
</trans-unit>
- <trans-unit id="_msg1061">
+ <trans-unit id="_msg1063">
<source xml:space="preserve">Unexpected legacy entry in descriptor wallet found. Loading wallet %s
The wallet might have been tampered with or created with malicious intent.
</source>
<context-group purpose="location"><context context-type="linenumber">197</context></context-group>
</trans-unit>
- <trans-unit id="_msg1062">
+ <trans-unit id="_msg1064">
<source xml:space="preserve">Unrecognized descriptor found. Loading wallet %s
The wallet might had been created on a newer version.
@@ -4845,551 +4855,583 @@ Please try running the latest software version.
</source>
<context-group purpose="location"><context context-type="linenumber">204</context></context-group>
</trans-unit>
- <trans-unit id="_msg1063">
+ <trans-unit id="_msg1065">
<source xml:space="preserve">
Unable to cleanup failed migration</source>
<context-group purpose="location"><context context-type="linenumber">238</context></context-group>
</trans-unit>
- <trans-unit id="_msg1064">
+ <trans-unit id="_msg1066">
<source xml:space="preserve">
Unable to restore backup of wallet.</source>
<context-group purpose="location"><context context-type="linenumber">241</context></context-group>
</trans-unit>
- <trans-unit id="_msg1065">
+ <trans-unit id="_msg1067">
<source xml:space="preserve">Block verification was interrupted</source>
<context-group purpose="location"><context context-type="linenumber">247</context></context-group>
</trans-unit>
- <trans-unit id="_msg1066">
+ <trans-unit id="_msg1068">
<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">252</context></context-group>
</trans-unit>
- <trans-unit id="_msg1067">
+ <trans-unit id="_msg1069">
<source xml:space="preserve">Copyright (C) %i-%i</source>
<context-group purpose="location"><context context-type="linenumber">253</context></context-group>
</trans-unit>
- <trans-unit id="_msg1068">
+ <trans-unit id="_msg1070">
<source xml:space="preserve">Corrupted block database detected</source>
<context-group purpose="location"><context context-type="linenumber">254</context></context-group>
</trans-unit>
- <trans-unit id="_msg1069">
+ <trans-unit id="_msg1071">
<source xml:space="preserve">Could not find asmap file %s</source>
<context-group purpose="location"><context context-type="linenumber">255</context></context-group>
</trans-unit>
- <trans-unit id="_msg1070">
+ <trans-unit id="_msg1072">
<source xml:space="preserve">Could not parse asmap file %s</source>
<context-group purpose="location"><context context-type="linenumber">256</context></context-group>
</trans-unit>
- <trans-unit id="_msg1071">
+ <trans-unit id="_msg1073">
<source xml:space="preserve">Disk space is too low!</source>
<context-group purpose="location"><context context-type="linenumber">257</context></context-group>
</trans-unit>
- <trans-unit id="_msg1072">
+ <trans-unit id="_msg1074">
<source xml:space="preserve">Do you want to rebuild the block database now?</source>
<context-group purpose="location"><context context-type="linenumber">258</context></context-group>
</trans-unit>
- <trans-unit id="_msg1073">
+ <trans-unit id="_msg1075">
<source xml:space="preserve">Done loading</source>
<context-group purpose="location"><context context-type="linenumber">259</context></context-group>
</trans-unit>
- <trans-unit id="_msg1074">
+ <trans-unit id="_msg1076">
<source xml:space="preserve">Dump file %s does not exist.</source>
<context-group purpose="location"><context context-type="linenumber">260</context></context-group>
</trans-unit>
- <trans-unit id="_msg1075">
- <source xml:space="preserve">Error creating %s</source>
- <context-group purpose="location"><context context-type="linenumber">261</context></context-group>
- </trans-unit>
- <trans-unit id="_msg1076">
- <source xml:space="preserve">Error initializing block database</source>
- <context-group purpose="location"><context context-type="linenumber">262</context></context-group>
- </trans-unit>
<trans-unit id="_msg1077">
- <source xml:space="preserve">Error initializing wallet database environment %s!</source>
- <context-group purpose="location"><context context-type="linenumber">263</context></context-group>
+ <source xml:space="preserve">Error committing db txn for wallet transactions removal</source>
+ <context-group purpose="location"><context context-type="linenumber">261</context></context-group>
</trans-unit>
<trans-unit id="_msg1078">
- <source xml:space="preserve">Error loading %s</source>
- <context-group purpose="location"><context context-type="linenumber">264</context></context-group>
+ <source xml:space="preserve">Error creating %s</source>
+ <context-group purpose="location"><context context-type="linenumber">262</context></context-group>
</trans-unit>
<trans-unit id="_msg1079">
- <source xml:space="preserve">Error loading %s: Private keys can only be disabled during creation</source>
- <context-group purpose="location"><context context-type="linenumber">265</context></context-group>
+ <source xml:space="preserve">Error initializing block database</source>
+ <context-group purpose="location"><context context-type="linenumber">263</context></context-group>
</trans-unit>
<trans-unit id="_msg1080">
- <source xml:space="preserve">Error loading %s: Wallet corrupted</source>
- <context-group purpose="location"><context context-type="linenumber">266</context></context-group>
+ <source xml:space="preserve">Error initializing wallet database environment %s!</source>
+ <context-group purpose="location"><context context-type="linenumber">264</context></context-group>
</trans-unit>
<trans-unit id="_msg1081">
- <source xml:space="preserve">Error loading %s: Wallet requires newer version of %s</source>
- <context-group purpose="location"><context context-type="linenumber">267</context></context-group>
+ <source xml:space="preserve">Error loading %s</source>
+ <context-group purpose="location"><context context-type="linenumber">265</context></context-group>
</trans-unit>
<trans-unit id="_msg1082">
- <source xml:space="preserve">Error loading block database</source>
- <context-group purpose="location"><context context-type="linenumber">268</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">266</context></context-group>
</trans-unit>
<trans-unit id="_msg1083">
- <source xml:space="preserve">Error opening block database</source>
- <context-group purpose="location"><context context-type="linenumber">269</context></context-group>
+ <source xml:space="preserve">Error loading %s: Wallet corrupted</source>
+ <context-group purpose="location"><context context-type="linenumber">267</context></context-group>
</trans-unit>
<trans-unit id="_msg1084">
- <source xml:space="preserve">Error reading configuration file: %s</source>
- <context-group purpose="location"><context context-type="linenumber">270</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">268</context></context-group>
</trans-unit>
<trans-unit id="_msg1085">
- <source xml:space="preserve">Error reading from database, shutting down.</source>
- <context-group purpose="location"><context context-type="linenumber">271</context></context-group>
+ <source xml:space="preserve">Error loading block database</source>
+ <context-group purpose="location"><context context-type="linenumber">269</context></context-group>
</trans-unit>
<trans-unit id="_msg1086">
- <source xml:space="preserve">Error reading next record from wallet database</source>
- <context-group purpose="location"><context context-type="linenumber">272</context></context-group>
+ <source xml:space="preserve">Error opening block database</source>
+ <context-group purpose="location"><context context-type="linenumber">270</context></context-group>
</trans-unit>
<trans-unit id="_msg1087">
- <source xml:space="preserve">Error: Cannot extract destination from the generated scriptpubkey</source>
- <context-group purpose="location"><context context-type="linenumber">273</context></context-group>
+ <source xml:space="preserve">Error reading configuration file: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">271</context></context-group>
</trans-unit>
<trans-unit id="_msg1088">
- <source xml:space="preserve">Error: Could not add watchonly tx to watchonly wallet</source>
- <context-group purpose="location"><context context-type="linenumber">274</context></context-group>
+ <source xml:space="preserve">Error reading from database, shutting down.</source>
+ <context-group purpose="location"><context context-type="linenumber">272</context></context-group>
</trans-unit>
<trans-unit id="_msg1089">
- <source xml:space="preserve">Error: Could not delete watchonly transactions</source>
- <context-group purpose="location"><context context-type="linenumber">275</context></context-group>
+ <source xml:space="preserve">Error reading next record from wallet database</source>
+ <context-group purpose="location"><context context-type="linenumber">273</context></context-group>
</trans-unit>
<trans-unit id="_msg1090">
- <source xml:space="preserve">Error: Couldn&apos;t create cursor into database</source>
- <context-group purpose="location"><context context-type="linenumber">276</context></context-group>
+ <source xml:space="preserve">Error starting db txn for wallet transactions removal</source>
+ <context-group purpose="location"><context context-type="linenumber">274</context></context-group>
</trans-unit>
<trans-unit id="_msg1091">
- <source xml:space="preserve">Error: Disk space is low for %s</source>
- <context-group purpose="location"><context context-type="linenumber">277</context></context-group>
+ <source xml:space="preserve">Error: Cannot extract destination from the generated scriptpubkey</source>
+ <context-group purpose="location"><context context-type="linenumber">275</context></context-group>
</trans-unit>
<trans-unit id="_msg1092">
- <source xml:space="preserve">Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <source xml:space="preserve">Error: Couldn&apos;t create cursor into database</source>
<context-group purpose="location"><context context-type="linenumber">278</context></context-group>
</trans-unit>
<trans-unit id="_msg1093">
- <source xml:space="preserve">Error: Failed to create new watchonly wallet</source>
+ <source xml:space="preserve">Error: Disk space is low for %s</source>
<context-group purpose="location"><context context-type="linenumber">279</context></context-group>
</trans-unit>
<trans-unit id="_msg1094">
- <source xml:space="preserve">Error: Got key that was not hex: %s</source>
+ <source xml:space="preserve">Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
<context-group purpose="location"><context context-type="linenumber">280</context></context-group>
</trans-unit>
<trans-unit id="_msg1095">
- <source xml:space="preserve">Error: Got value that was not hex: %s</source>
+ <source xml:space="preserve">Error: Failed to create new watchonly wallet</source>
<context-group purpose="location"><context context-type="linenumber">281</context></context-group>
</trans-unit>
<trans-unit id="_msg1096">
- <source xml:space="preserve">Error: Keypool ran out, please call keypoolrefill first</source>
+ <source xml:space="preserve">Error: Got key that was not hex: %s</source>
<context-group purpose="location"><context context-type="linenumber">282</context></context-group>
</trans-unit>
<trans-unit id="_msg1097">
- <source xml:space="preserve">Error: Missing checksum</source>
+ <source xml:space="preserve">Error: Got value that was not hex: %s</source>
<context-group purpose="location"><context context-type="linenumber">283</context></context-group>
</trans-unit>
<trans-unit id="_msg1098">
- <source xml:space="preserve">Error: No %s addresses available.</source>
+ <source xml:space="preserve">Error: Keypool ran out, please call keypoolrefill first</source>
<context-group purpose="location"><context context-type="linenumber">284</context></context-group>
</trans-unit>
<trans-unit id="_msg1099">
- <source xml:space="preserve">Error: Not all watchonly txs could be deleted</source>
+ <source xml:space="preserve">Error: Missing checksum</source>
<context-group purpose="location"><context context-type="linenumber">285</context></context-group>
</trans-unit>
<trans-unit id="_msg1100">
- <source xml:space="preserve">Error: This wallet already uses SQLite</source>
+ <source xml:space="preserve">Error: No %s addresses available.</source>
<context-group purpose="location"><context context-type="linenumber">286</context></context-group>
</trans-unit>
<trans-unit id="_msg1101">
- <source xml:space="preserve">Error: This wallet is already a descriptor wallet</source>
+ <source xml:space="preserve">Error: This wallet already uses SQLite</source>
<context-group purpose="location"><context context-type="linenumber">287</context></context-group>
</trans-unit>
<trans-unit id="_msg1102">
- <source xml:space="preserve">Error: Unable to begin reading all records in the database</source>
+ <source xml:space="preserve">Error: This wallet is already a descriptor wallet</source>
<context-group purpose="location"><context context-type="linenumber">288</context></context-group>
</trans-unit>
<trans-unit id="_msg1103">
- <source xml:space="preserve">Error: Unable to make a backup of your wallet</source>
+ <source xml:space="preserve">Error: Unable to begin reading all records in the database</source>
<context-group purpose="location"><context context-type="linenumber">289</context></context-group>
</trans-unit>
<trans-unit id="_msg1104">
- <source xml:space="preserve">Error: Unable to parse version %u as a uint32_t</source>
+ <source xml:space="preserve">Error: Unable to make a backup of your wallet</source>
<context-group purpose="location"><context context-type="linenumber">290</context></context-group>
</trans-unit>
<trans-unit id="_msg1105">
- <source xml:space="preserve">Error: Unable to read all records in the database</source>
+ <source xml:space="preserve">Error: Unable to parse version %u as a uint32_t</source>
<context-group purpose="location"><context context-type="linenumber">291</context></context-group>
</trans-unit>
<trans-unit id="_msg1106">
- <source xml:space="preserve">Error: Unable to remove watchonly address book data</source>
+ <source xml:space="preserve">Error: Unable to read all records in the database</source>
<context-group purpose="location"><context context-type="linenumber">292</context></context-group>
</trans-unit>
<trans-unit id="_msg1107">
- <source xml:space="preserve">Error: Unable to write record to new wallet</source>
+ <source xml:space="preserve">Error: Unable to read wallet&apos;s best block locator record</source>
<context-group purpose="location"><context context-type="linenumber">293</context></context-group>
</trans-unit>
<trans-unit id="_msg1108">
- <source xml:space="preserve">Failed to listen on any port. Use -listen=0 if you want this.</source>
+ <source xml:space="preserve">Error: Unable to remove watchonly address book data</source>
<context-group purpose="location"><context context-type="linenumber">294</context></context-group>
</trans-unit>
<trans-unit id="_msg1109">
- <source xml:space="preserve">Failed to rescan the wallet during initialization</source>
+ <source xml:space="preserve">Error: Unable to write record to new wallet</source>
<context-group purpose="location"><context context-type="linenumber">295</context></context-group>
</trans-unit>
<trans-unit id="_msg1110">
- <source xml:space="preserve">Failed to start indexes, shutting down..</source>
+ <source xml:space="preserve">Error: Unable to write solvable wallet best block locator record</source>
<context-group purpose="location"><context context-type="linenumber">296</context></context-group>
</trans-unit>
<trans-unit id="_msg1111">
- <source xml:space="preserve">Failed to verify database</source>
+ <source xml:space="preserve">Error: Unable to write watchonly wallet best block locator record</source>
<context-group purpose="location"><context context-type="linenumber">297</context></context-group>
</trans-unit>
<trans-unit id="_msg1112">
- <source xml:space="preserve">Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
+ <source xml:space="preserve">Error: address book copy failed for wallet %s</source>
<context-group purpose="location"><context context-type="linenumber">298</context></context-group>
</trans-unit>
<trans-unit id="_msg1113">
- <source xml:space="preserve">Ignoring duplicate -wallet %s.</source>
+ <source xml:space="preserve">Error: database transaction cannot be executed for wallet %s</source>
<context-group purpose="location"><context context-type="linenumber">299</context></context-group>
</trans-unit>
<trans-unit id="_msg1114">
- <source xml:space="preserve">Importing…</source>
+ <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">300</context></context-group>
</trans-unit>
<trans-unit id="_msg1115">
- <source xml:space="preserve">Incorrect or no genesis block found. Wrong datadir for network?</source>
+ <source xml:space="preserve">Failed to rescan the wallet during initialization</source>
<context-group purpose="location"><context context-type="linenumber">301</context></context-group>
</trans-unit>
<trans-unit id="_msg1116">
- <source xml:space="preserve">Initialization sanity check failed. %s is shutting down.</source>
+ <source xml:space="preserve">Failed to start indexes, shutting down..</source>
<context-group purpose="location"><context context-type="linenumber">302</context></context-group>
</trans-unit>
<trans-unit id="_msg1117">
- <source xml:space="preserve">Input not found or already spent</source>
+ <source xml:space="preserve">Failed to verify database</source>
<context-group purpose="location"><context context-type="linenumber">303</context></context-group>
</trans-unit>
<trans-unit id="_msg1118">
- <source xml:space="preserve">Insufficient dbcache for block verification</source>
+ <source xml:space="preserve">Failure removing transaction: %s</source>
<context-group purpose="location"><context context-type="linenumber">304</context></context-group>
</trans-unit>
<trans-unit id="_msg1119">
- <source xml:space="preserve">Insufficient funds</source>
+ <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">305</context></context-group>
</trans-unit>
<trans-unit id="_msg1120">
- <source xml:space="preserve">Invalid -i2psam address or hostname: &apos;%s&apos;</source>
+ <source xml:space="preserve">Ignoring duplicate -wallet %s.</source>
<context-group purpose="location"><context context-type="linenumber">306</context></context-group>
</trans-unit>
<trans-unit id="_msg1121">
- <source xml:space="preserve">Invalid -onion address or hostname: &apos;%s&apos;</source>
+ <source xml:space="preserve">Importing…</source>
<context-group purpose="location"><context context-type="linenumber">307</context></context-group>
</trans-unit>
<trans-unit id="_msg1122">
- <source xml:space="preserve">Invalid -proxy address or hostname: &apos;%s&apos;</source>
+ <source xml:space="preserve">Incorrect or no genesis block found. Wrong datadir for network?</source>
<context-group purpose="location"><context context-type="linenumber">308</context></context-group>
</trans-unit>
<trans-unit id="_msg1123">
- <source xml:space="preserve">Invalid P2P permission: &apos;%s&apos;</source>
+ <source xml:space="preserve">Initialization sanity check failed. %s is shutting down.</source>
<context-group purpose="location"><context context-type="linenumber">309</context></context-group>
</trans-unit>
<trans-unit id="_msg1124">
- <source xml:space="preserve">Invalid amount for %s=&lt;amount&gt;: &apos;%s&apos; (must be at least %s)</source>
+ <source xml:space="preserve">Input not found or already spent</source>
<context-group purpose="location"><context context-type="linenumber">310</context></context-group>
</trans-unit>
<trans-unit id="_msg1125">
- <source xml:space="preserve">Invalid amount for %s=&lt;amount&gt;: &apos;%s&apos;</source>
+ <source xml:space="preserve">Insufficient dbcache for block verification</source>
<context-group purpose="location"><context context-type="linenumber">311</context></context-group>
</trans-unit>
<trans-unit id="_msg1126">
- <source xml:space="preserve">Invalid amount for -%s=&lt;amount&gt;: &apos;%s&apos;</source>
+ <source xml:space="preserve">Insufficient funds</source>
<context-group purpose="location"><context context-type="linenumber">312</context></context-group>
</trans-unit>
<trans-unit id="_msg1127">
- <source xml:space="preserve">Invalid netmask specified in -whitelist: &apos;%s&apos;</source>
+ <source xml:space="preserve">Invalid -i2psam address or hostname: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">313</context></context-group>
</trans-unit>
<trans-unit id="_msg1128">
- <source xml:space="preserve">Invalid port specified in %s: &apos;%s&apos;</source>
+ <source xml:space="preserve">Invalid -onion address or hostname: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">314</context></context-group>
</trans-unit>
<trans-unit id="_msg1129">
- <source xml:space="preserve">Invalid pre-selected input %s</source>
+ <source xml:space="preserve">Invalid -proxy address or hostname: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">315</context></context-group>
</trans-unit>
<trans-unit id="_msg1130">
- <source xml:space="preserve">Listening for incoming connections failed (listen returned error %s)</source>
+ <source xml:space="preserve">Invalid P2P permission: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">316</context></context-group>
</trans-unit>
<trans-unit id="_msg1131">
- <source xml:space="preserve">Loading P2P addresses…</source>
+ <source xml:space="preserve">Invalid amount for %s=&lt;amount&gt;: &apos;%s&apos; (must be at least %s)</source>
<context-group purpose="location"><context context-type="linenumber">317</context></context-group>
</trans-unit>
<trans-unit id="_msg1132">
- <source xml:space="preserve">Loading banlist…</source>
+ <source xml:space="preserve">Invalid amount for %s=&lt;amount&gt;: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">318</context></context-group>
</trans-unit>
<trans-unit id="_msg1133">
- <source xml:space="preserve">Loading block index…</source>
+ <source xml:space="preserve">Invalid amount for -%s=&lt;amount&gt;: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">319</context></context-group>
</trans-unit>
<trans-unit id="_msg1134">
- <source xml:space="preserve">Loading wallet…</source>
+ <source xml:space="preserve">Invalid netmask specified in -whitelist: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">320</context></context-group>
</trans-unit>
<trans-unit id="_msg1135">
- <source xml:space="preserve">Missing amount</source>
+ <source xml:space="preserve">Invalid port specified in %s: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">321</context></context-group>
</trans-unit>
<trans-unit id="_msg1136">
- <source xml:space="preserve">Missing solving data for estimating transaction size</source>
+ <source xml:space="preserve">Invalid pre-selected input %s</source>
<context-group purpose="location"><context context-type="linenumber">322</context></context-group>
</trans-unit>
<trans-unit id="_msg1137">
- <source xml:space="preserve">Need to specify a port with -whitebind: &apos;%s&apos;</source>
+ <source xml:space="preserve">Listening for incoming connections failed (listen returned error %s)</source>
<context-group purpose="location"><context context-type="linenumber">323</context></context-group>
</trans-unit>
<trans-unit id="_msg1138">
- <source xml:space="preserve">No addresses available</source>
+ <source xml:space="preserve">Loading P2P addresses…</source>
<context-group purpose="location"><context context-type="linenumber">324</context></context-group>
</trans-unit>
<trans-unit id="_msg1139">
- <source xml:space="preserve">Not enough file descriptors available.</source>
+ <source xml:space="preserve">Loading banlist…</source>
<context-group purpose="location"><context context-type="linenumber">325</context></context-group>
</trans-unit>
<trans-unit id="_msg1140">
- <source xml:space="preserve">Not found pre-selected input %s</source>
+ <source xml:space="preserve">Loading block index…</source>
<context-group purpose="location"><context context-type="linenumber">326</context></context-group>
</trans-unit>
<trans-unit id="_msg1141">
- <source xml:space="preserve">Not solvable pre-selected input %s</source>
+ <source xml:space="preserve">Loading wallet…</source>
<context-group purpose="location"><context context-type="linenumber">327</context></context-group>
</trans-unit>
<trans-unit id="_msg1142">
- <source xml:space="preserve">Prune cannot be configured with a negative value.</source>
+ <source xml:space="preserve">Missing amount</source>
<context-group purpose="location"><context context-type="linenumber">328</context></context-group>
</trans-unit>
<trans-unit id="_msg1143">
- <source xml:space="preserve">Prune mode is incompatible with -txindex.</source>
+ <source xml:space="preserve">Missing solving data for estimating transaction size</source>
<context-group purpose="location"><context context-type="linenumber">329</context></context-group>
</trans-unit>
<trans-unit id="_msg1144">
- <source xml:space="preserve">Pruning blockstore…</source>
+ <source xml:space="preserve">Need to specify a port with -whitebind: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">330</context></context-group>
</trans-unit>
<trans-unit id="_msg1145">
- <source xml:space="preserve">Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <source xml:space="preserve">No addresses available</source>
<context-group purpose="location"><context context-type="linenumber">331</context></context-group>
</trans-unit>
<trans-unit id="_msg1146">
- <source xml:space="preserve">Replaying blocks…</source>
+ <source xml:space="preserve">Not enough file descriptors available.</source>
<context-group purpose="location"><context context-type="linenumber">332</context></context-group>
</trans-unit>
<trans-unit id="_msg1147">
- <source xml:space="preserve">Rescanning…</source>
+ <source xml:space="preserve">Not found pre-selected input %s</source>
<context-group purpose="location"><context context-type="linenumber">333</context></context-group>
</trans-unit>
<trans-unit id="_msg1148">
- <source xml:space="preserve">SQLiteDatabase: Failed to execute statement to verify database: %s</source>
+ <source xml:space="preserve">Not solvable pre-selected input %s</source>
<context-group purpose="location"><context context-type="linenumber">334</context></context-group>
</trans-unit>
<trans-unit id="_msg1149">
- <source xml:space="preserve">SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
+ <source xml:space="preserve">Prune cannot be configured with a negative value.</source>
<context-group purpose="location"><context context-type="linenumber">335</context></context-group>
</trans-unit>
<trans-unit id="_msg1150">
- <source xml:space="preserve">SQLiteDatabase: Failed to read database verification error: %s</source>
+ <source xml:space="preserve">Prune mode is incompatible with -txindex.</source>
<context-group purpose="location"><context context-type="linenumber">336</context></context-group>
</trans-unit>
<trans-unit id="_msg1151">
- <source xml:space="preserve">SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
+ <source xml:space="preserve">Pruning blockstore…</source>
<context-group purpose="location"><context context-type="linenumber">337</context></context-group>
</trans-unit>
<trans-unit id="_msg1152">
- <source xml:space="preserve">Section [%s] is not recognized.</source>
+ <source xml:space="preserve">Reducing -maxconnections from %d to %d, because of system limitations.</source>
<context-group purpose="location"><context context-type="linenumber">338</context></context-group>
</trans-unit>
<trans-unit id="_msg1153">
- <source xml:space="preserve">Signing transaction failed</source>
- <context-group purpose="location"><context context-type="linenumber">341</context></context-group>
+ <source xml:space="preserve">Replaying blocks…</source>
+ <context-group purpose="location"><context context-type="linenumber">339</context></context-group>
</trans-unit>
<trans-unit id="_msg1154">
- <source xml:space="preserve">Specified -walletdir &quot;%s&quot; does not exist</source>
- <context-group purpose="location"><context context-type="linenumber">342</context></context-group>
+ <source xml:space="preserve">Rescanning…</source>
+ <context-group purpose="location"><context context-type="linenumber">340</context></context-group>
</trans-unit>
<trans-unit id="_msg1155">
- <source xml:space="preserve">Specified -walletdir &quot;%s&quot; is a relative path</source>
- <context-group purpose="location"><context context-type="linenumber">343</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">341</context></context-group>
</trans-unit>
<trans-unit id="_msg1156">
- <source xml:space="preserve">Specified -walletdir &quot;%s&quot; is not a directory</source>
- <context-group purpose="location"><context context-type="linenumber">344</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">342</context></context-group>
</trans-unit>
<trans-unit id="_msg1157">
- <source xml:space="preserve">Specified blocks directory &quot;%s&quot; does not exist.</source>
- <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
+ <source xml:space="preserve">SQLiteDatabase: Failed to read database verification error: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">343</context></context-group>
</trans-unit>
<trans-unit id="_msg1158">
- <source xml:space="preserve">Specified data directory &quot;%s&quot; does not exist.</source>
- <context-group purpose="location"><context context-type="linenumber">346</context></context-group>
+ <source xml:space="preserve">SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
+ <context-group purpose="location"><context context-type="linenumber">344</context></context-group>
</trans-unit>
<trans-unit id="_msg1159">
- <source xml:space="preserve">Starting network threads…</source>
- <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
+ <source xml:space="preserve">Section [%s] is not recognized.</source>
+ <context-group purpose="location"><context context-type="linenumber">345</context></context-group>
</trans-unit>
<trans-unit id="_msg1160">
- <source xml:space="preserve">The source code is available from %s.</source>
+ <source xml:space="preserve">Signing transaction failed</source>
<context-group purpose="location"><context context-type="linenumber">348</context></context-group>
</trans-unit>
<trans-unit id="_msg1161">
- <source xml:space="preserve">The specified config file %s does not exist</source>
+ <source xml:space="preserve">Specified -walletdir &quot;%s&quot; does not exist</source>
<context-group purpose="location"><context context-type="linenumber">349</context></context-group>
</trans-unit>
<trans-unit id="_msg1162">
- <source xml:space="preserve">The transaction amount is too small to pay the fee</source>
+ <source xml:space="preserve">Specified -walletdir &quot;%s&quot; is a relative path</source>
<context-group purpose="location"><context context-type="linenumber">350</context></context-group>
</trans-unit>
<trans-unit id="_msg1163">
- <source xml:space="preserve">The wallet will avoid paying less than the minimum relay fee.</source>
+ <source xml:space="preserve">Specified -walletdir &quot;%s&quot; is not a directory</source>
<context-group purpose="location"><context context-type="linenumber">351</context></context-group>
</trans-unit>
<trans-unit id="_msg1164">
- <source xml:space="preserve">This is experimental software.</source>
+ <source xml:space="preserve">Specified blocks directory &quot;%s&quot; does not exist.</source>
<context-group purpose="location"><context context-type="linenumber">352</context></context-group>
</trans-unit>
<trans-unit id="_msg1165">
- <source xml:space="preserve">This is the minimum transaction fee you pay on every transaction.</source>
+ <source xml:space="preserve">Specified data directory &quot;%s&quot; does not exist.</source>
<context-group purpose="location"><context context-type="linenumber">353</context></context-group>
</trans-unit>
<trans-unit id="_msg1166">
- <source xml:space="preserve">This is the transaction fee you will pay if you send a transaction.</source>
+ <source xml:space="preserve">Starting network threads…</source>
<context-group purpose="location"><context context-type="linenumber">354</context></context-group>
</trans-unit>
<trans-unit id="_msg1167">
- <source xml:space="preserve">Transaction amount too small</source>
+ <source xml:space="preserve">The source code is available from %s.</source>
<context-group purpose="location"><context context-type="linenumber">355</context></context-group>
</trans-unit>
<trans-unit id="_msg1168">
- <source xml:space="preserve">Transaction amounts must not be negative</source>
+ <source xml:space="preserve">The specified config file %s does not exist</source>
<context-group purpose="location"><context context-type="linenumber">356</context></context-group>
</trans-unit>
<trans-unit id="_msg1169">
- <source xml:space="preserve">Transaction change output index out of range</source>
+ <source xml:space="preserve">The transaction amount is too small to pay the fee</source>
<context-group purpose="location"><context context-type="linenumber">357</context></context-group>
</trans-unit>
<trans-unit id="_msg1170">
- <source xml:space="preserve">Transaction has too long of a mempool chain</source>
+ <source xml:space="preserve">The wallet will avoid paying less than the minimum relay fee.</source>
<context-group purpose="location"><context context-type="linenumber">358</context></context-group>
</trans-unit>
<trans-unit id="_msg1171">
- <source xml:space="preserve">Transaction must have at least one recipient</source>
+ <source xml:space="preserve">This is experimental software.</source>
<context-group purpose="location"><context context-type="linenumber">359</context></context-group>
</trans-unit>
<trans-unit id="_msg1172">
- <source xml:space="preserve">Transaction needs a change address, but we can&apos;t generate it.</source>
+ <source xml:space="preserve">This is the minimum transaction fee you pay on every transaction.</source>
<context-group purpose="location"><context context-type="linenumber">360</context></context-group>
</trans-unit>
<trans-unit id="_msg1173">
- <source xml:space="preserve">Transaction too large</source>
+ <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">361</context></context-group>
</trans-unit>
<trans-unit id="_msg1174">
- <source xml:space="preserve">Unable to allocate memory for -maxsigcachesize: &apos;%s&apos; MiB</source>
+ <source xml:space="preserve">Transaction %s does not belong to this wallet</source>
<context-group purpose="location"><context context-type="linenumber">362</context></context-group>
</trans-unit>
<trans-unit id="_msg1175">
- <source xml:space="preserve">Unable to bind to %s on this computer (bind returned error %s)</source>
+ <source xml:space="preserve">Transaction amount too small</source>
<context-group purpose="location"><context context-type="linenumber">363</context></context-group>
</trans-unit>
<trans-unit id="_msg1176">
- <source xml:space="preserve">Unable to bind to %s on this computer. %s is probably already running.</source>
+ <source xml:space="preserve">Transaction amounts must not be negative</source>
<context-group purpose="location"><context context-type="linenumber">364</context></context-group>
</trans-unit>
<trans-unit id="_msg1177">
- <source xml:space="preserve">Unable to create the PID file &apos;%s&apos;: %s</source>
+ <source xml:space="preserve">Transaction change output index out of range</source>
<context-group purpose="location"><context context-type="linenumber">365</context></context-group>
</trans-unit>
<trans-unit id="_msg1178">
- <source xml:space="preserve">Unable to find UTXO for external input</source>
+ <source xml:space="preserve">Transaction must have at least one recipient</source>
<context-group purpose="location"><context context-type="linenumber">366</context></context-group>
</trans-unit>
<trans-unit id="_msg1179">
- <source xml:space="preserve">Unable to generate initial keys</source>
+ <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">367</context></context-group>
</trans-unit>
<trans-unit id="_msg1180">
- <source xml:space="preserve">Unable to generate keys</source>
+ <source xml:space="preserve">Transaction too large</source>
<context-group purpose="location"><context context-type="linenumber">368</context></context-group>
</trans-unit>
<trans-unit id="_msg1181">
- <source xml:space="preserve">Unable to open %s for writing</source>
+ <source xml:space="preserve">Unable to allocate memory for -maxsigcachesize: &apos;%s&apos; MiB</source>
<context-group purpose="location"><context context-type="linenumber">369</context></context-group>
</trans-unit>
<trans-unit id="_msg1182">
- <source xml:space="preserve">Unable to parse -maxuploadtarget: &apos;%s&apos;</source>
+ <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">370</context></context-group>
</trans-unit>
<trans-unit id="_msg1183">
- <source xml:space="preserve">Unable to start HTTP server. See debug log for details.</source>
+ <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">371</context></context-group>
</trans-unit>
<trans-unit id="_msg1184">
- <source xml:space="preserve">Unable to unload the wallet before migrating</source>
+ <source xml:space="preserve">Unable to create the PID file &apos;%s&apos;: %s</source>
<context-group purpose="location"><context context-type="linenumber">372</context></context-group>
</trans-unit>
<trans-unit id="_msg1185">
- <source xml:space="preserve">Unknown -blockfilterindex value %s.</source>
+ <source xml:space="preserve">Unable to find UTXO for external input</source>
<context-group purpose="location"><context context-type="linenumber">373</context></context-group>
</trans-unit>
<trans-unit id="_msg1186">
- <source xml:space="preserve">Unknown address type &apos;%s&apos;</source>
+ <source xml:space="preserve">Unable to generate initial keys</source>
<context-group purpose="location"><context context-type="linenumber">374</context></context-group>
</trans-unit>
<trans-unit id="_msg1187">
- <source xml:space="preserve">Unknown change type &apos;%s&apos;</source>
+ <source xml:space="preserve">Unable to generate keys</source>
<context-group purpose="location"><context context-type="linenumber">375</context></context-group>
</trans-unit>
<trans-unit id="_msg1188">
- <source xml:space="preserve">Unknown network specified in -onlynet: &apos;%s&apos;</source>
+ <source xml:space="preserve">Unable to open %s for writing</source>
<context-group purpose="location"><context context-type="linenumber">376</context></context-group>
</trans-unit>
<trans-unit id="_msg1189">
- <source xml:space="preserve">Unknown new rules activated (versionbit %i)</source>
+ <source xml:space="preserve">Unable to parse -maxuploadtarget: &apos;%s&apos;</source>
<context-group purpose="location"><context context-type="linenumber">377</context></context-group>
</trans-unit>
<trans-unit id="_msg1190">
- <source xml:space="preserve">Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <source xml:space="preserve">Unable to start HTTP server. See debug log for details.</source>
<context-group purpose="location"><context context-type="linenumber">378</context></context-group>
</trans-unit>
<trans-unit id="_msg1191">
- <source xml:space="preserve">acceptstalefeeestimates is not supported on %s chain.</source>
- <context-group purpose="location"><context context-type="linenumber">384</context></context-group>
+ <source xml:space="preserve">Unable to unload the wallet before migrating</source>
+ <context-group purpose="location"><context context-type="linenumber">379</context></context-group>
</trans-unit>
<trans-unit id="_msg1192">
- <source xml:space="preserve">Unsupported logging category %s=%s.</source>
- <context-group purpose="location"><context context-type="linenumber">379</context></context-group>
+ <source xml:space="preserve">Unknown -blockfilterindex value %s.</source>
+ <context-group purpose="location"><context context-type="linenumber">380</context></context-group>
</trans-unit>
<trans-unit id="_msg1193">
- <source xml:space="preserve">User Agent comment (%s) contains unsafe characters.</source>
- <context-group purpose="location"><context context-type="linenumber">380</context></context-group>
+ <source xml:space="preserve">Unknown address type &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
</trans-unit>
<trans-unit id="_msg1194">
- <source xml:space="preserve">Verifying blocks…</source>
- <context-group purpose="location"><context context-type="linenumber">381</context></context-group>
+ <source xml:space="preserve">Unknown change type &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">382</context></context-group>
</trans-unit>
<trans-unit id="_msg1195">
- <source xml:space="preserve">Verifying wallet(s)…</source>
- <context-group purpose="location"><context context-type="linenumber">382</context></context-group>
+ <source xml:space="preserve">Unknown network specified in -onlynet: &apos;%s&apos;</source>
+ <context-group purpose="location"><context context-type="linenumber">383</context></context-group>
</trans-unit>
<trans-unit id="_msg1196">
- <source xml:space="preserve">Wallet needed to be rewritten: restart %s to complete</source>
- <context-group purpose="location"><context context-type="linenumber">383</context></context-group>
+ <source xml:space="preserve">Unknown new rules activated (versionbit %i)</source>
+ <context-group purpose="location"><context context-type="linenumber">384</context></context-group>
</trans-unit>
<trans-unit id="_msg1197">
- <source xml:space="preserve">Settings file could not be read</source>
- <context-group purpose="location"><context context-type="linenumber">339</context></context-group>
+ <source xml:space="preserve">Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <context-group purpose="location"><context context-type="linenumber">385</context></context-group>
</trans-unit>
<trans-unit id="_msg1198">
+ <source xml:space="preserve">Wallet file creation failed: %s</source>
+ <context-group purpose="location"><context context-type="linenumber">390</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1199">
+ <source xml:space="preserve">acceptstalefeeestimates is not supported on %s chain.</source>
+ <context-group purpose="location"><context context-type="linenumber">392</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1200">
+ <source xml:space="preserve">Unsupported logging category %s=%s.</source>
+ <context-group purpose="location"><context context-type="linenumber">386</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1201">
+ <source xml:space="preserve">Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <context-group purpose="location"><context context-type="linenumber">276</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1202">
+ <source xml:space="preserve">Error: Could not delete watchonly transactions. </source>
+ <context-group purpose="location"><context context-type="linenumber">277</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1203">
+ <source xml:space="preserve">User Agent comment (%s) contains unsafe characters.</source>
+ <context-group purpose="location"><context context-type="linenumber">387</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1204">
+ <source xml:space="preserve">Verifying blocks…</source>
+ <context-group purpose="location"><context context-type="linenumber">388</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1205">
+ <source xml:space="preserve">Verifying wallet(s)…</source>
+ <context-group purpose="location"><context context-type="linenumber">389</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1206">
+ <source xml:space="preserve">Wallet needed to be rewritten: restart %s to complete</source>
+ <context-group purpose="location"><context context-type="linenumber">391</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1207">
+ <source xml:space="preserve">Settings file could not be read</source>
+ <context-group purpose="location"><context context-type="linenumber">346</context></context-group>
+ </trans-unit>
+ <trans-unit id="_msg1208">
<source xml:space="preserve">Settings file could not be written</source>
- <context-group purpose="location"><context context-type="linenumber">340</context></context-group>
+ <context-group purpose="location"><context context-type="linenumber">347</context></context-group>
</trans-unit>
</group>
</body></file>
diff --git a/src/qt/locale/bitcoin_eo.ts b/src/qt/locale/bitcoin_eo.ts
index 034f435b86..3b44647095 100644
--- a/src/qt/locale/bitcoin_eo.ts
+++ b/src/qt/locale/bitcoin_eo.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Elekti</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Sendaj adresoj</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Ricevaj adresoj</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Jen viaj Bitmon-adresoj por sendi pagojn. Zorge kontrolu la sumon kaj la alsendan adreson antaŭ ol sendi.</translation>
</message>
@@ -601,10 +593,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Krompago:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Post krompago:</translation>
</message>
@@ -669,10 +657,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopii bajtojn</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopii polvon</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopii restmonon</translation>
</message>
@@ -681,14 +665,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 ŝlosita)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">jes</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ne</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(neniu etikedo)</translation>
</message>
@@ -1164,6 +1140,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Fermi</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">propra adreso</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">Totala Sumo</translation>
</message>
@@ -1534,10 +1514,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Malplenigi ĉiujn kampojn de la formularo.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
- </message>
- <message>
<source>Clear &amp;All</source>
<translation type="unfinished">&amp;Forigi Ĉion</translation>
</message>
@@ -1574,10 +1550,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopii bajtojn</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopii polvon</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopii restmonon</translation>
</message>
@@ -1956,10 +1928,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Sendita al</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pago al vi mem</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minita</translation>
</message>
@@ -2023,10 +1991,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Sendita al</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Al vi mem</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minita</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es.ts b/src/qt/locale/bitcoin_es.ts
index 52a4c6adcf..585df2e497 100644
--- a/src/qt/locale/bitcoin_es.ts
+++ b/src/qt/locale/bitcoin_es.ts
@@ -3,11 +3,11 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Pulsación secundaria para editar la dirección o etiqueta</translation>
+ <translation type="unfinished">Haz clic derecho para editar dirección o etiqueta</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Crea una dirección nueva</translation>
+ <translation type="unfinished">Crear una nueva dirección</translation>
</message>
<message>
<source>&amp;New</source>
@@ -23,19 +23,19 @@
</message>
<message>
<source>C&amp;lose</source>
- <translation type="unfinished">C&amp;errar</translation>
+ <translation type="unfinished">&amp;Cerrar</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Eliminar de la lista la dirección actualmente seleccionada</translation>
+ <translation type="unfinished">Eliminar la dirección seleccionada actualmente de la lista</translation>
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">Introduce una dirección o etiqueta a buscar</translation>
+ <translation type="unfinished">Introduce una dirección o etiqueta que buscar</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exportar a un archivo los datos de esta pestaña</translation>
+ <translation type="unfinished">Exportar los datos de la pestaña actual a un archivo</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -47,33 +47,25 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Elija la dirección a la que se enviarán las monedas</translation>
+ <translation type="unfinished">Elige la dirección a la que se enviarán las monedas</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Elija la dirección a la que se recibirán las monedas</translation>
+ <translation type="unfinished">Elige la dirección con la que se recibirán las monedas</translation>
</message>
<message>
<source>C&amp;hoose</source>
<translation type="unfinished">&amp;Elegir</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Direcciones de envío</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Direcciones de recepción</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Estas son tus direcciones Bitcoin para enviar pagos. Comprueba siempre el importe y la dirección de recepción antes de transferir monedas.</translation>
+ <translation type="unfinished">Estas son tus direcciones de Bitcoin para enviar pagos. Revisa siempre el importe y la dirección de recepción antes de enviar monedas.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
Signing is only possible with addresses of the type 'legacy'.</source>
- <translation type="unfinished">Estas son tus direcciones Bitcoin para la recepción de pagos. Utilice el botón «Crear una nueva dirección para recepción» en la pestaña «Recibir» para crear direcciones nuevas.
-Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
+ <translation type="unfinished">Estas son tus direcciones de Bitcoin para recibir pagos. Usa el botón "Crear nueva dirección de recepción" en la pestaña "Recibir" para crear nuevas direcciones.
+Solo es posible firmar con direcciones de tipo "legacy".</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -89,7 +81,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">Exportar listado de direcciones</translation>
+ <translation type="unfinished">Exportar lista de direcciones</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -99,11 +91,19 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<message>
<source>There was an error trying to save the address list to %1. Please try again.</source>
<extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
- <translation type="unfinished">Hubo un error al intentar guardar el listado de direcciones a %1. Por favor, inténtalo de nuevo.</translation>
+ <translation type="unfinished">Hubo un error al intentar guardar la lista de direcciones %1. Inténtalo nuevamente.</translation>
+ </message>
+ <message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Direcciones de envío - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Direcciones de recepción - %1</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Exportación Errónea</translation>
+ <translation type="unfinished">Error al exportar</translation>
</message>
</context>
<context>
@@ -125,23 +125,23 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation type="unfinished">Diálogo de contraseña</translation>
+ <translation type="unfinished">Diálogo de frase de contraseña</translation>
</message>
<message>
<source>Enter passphrase</source>
- <translation type="unfinished">Introduce la frase-contraseña</translation>
+ <translation type="unfinished">Ingresa la frase de contraseña</translation>
</message>
<message>
<source>New passphrase</source>
- <translation type="unfinished">Nueva frase-contraseña</translation>
+ <translation type="unfinished">Nueva frase de contraseña</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Repite la frase-contraseña nueva</translation>
+ <translation type="unfinished">Repite la nueva frase de contraseña</translation>
</message>
<message>
<source>Show passphrase</source>
- <translation type="unfinished">Mostrar frase-contraseña</translation>
+ <translation type="unfinished">Mostrar la frase de contraseña</translation>
</message>
<message>
<source>Encrypt wallet</source>
@@ -149,7 +149,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Esta operación necesita la contraseña para desbloquear el monedero.</translation>
+ <translation type="unfinished">Esta operación requiere la frase de contraseña del monedero para desbloquearlo.</translation>
</message>
<message>
<source>Unlock wallet</source>
@@ -157,19 +157,19 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Change passphrase</source>
- <translation type="unfinished">Cambiar contraseña</translation>
+ <translation type="unfinished">Cambiar frase de contraseña</translation>
</message>
<message>
<source>Confirm wallet encryption</source>
- <translation type="unfinished">Confirma el cifrado de este monedero</translation>
+ <translation type="unfinished">Confirmar cifrado del monedero</translation>
</message>
<message>
<source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">Atención: Si cifras tu monedero y pierdes la contraseña, &lt;b&gt;¡PERDERÁS TODOS TUS BITCOINS!&lt;/b&gt;</translation>
+ <translation type="unfinished">Atención: Si cifras el monedero y pierdes la frase de contraseña, &lt;b&gt;¡PERDERÁS TODOS TUS BITCOINS&lt;/b&gt;!</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">¿Esta seguro que quieres cifrar tu monedero?</translation>
+ <translation type="unfinished">¿Seguro deseas cifrar el monedero?</translation>
</message>
<message>
<source>Wallet encrypted</source>
@@ -177,31 +177,31 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">Introduce la contraseña nueva para el monedero. &lt;br/&gt;Por favor utilice una contraseña de &lt;b&gt;diez o más caracteres aleatorios&lt;/b&gt;, u &lt;b&gt;ocho o más palabras&lt;/b&gt;.</translation>
+ <translation type="unfinished">Introduce la nueva frase de contraseña para el monedero. &lt;br/&gt;Usa una frase de contraseña de &lt;b&gt;diez o más caracteres aleatorios&lt;/b&gt;, u &lt;b&gt;ocho o más palabras&lt;/b&gt;.</translation>
</message>
<message>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">Introduce la contraseña antigua y la nueva para el monedero.</translation>
+ <translation type="unfinished">Introduce la frase de contraseña antigua y la nueva para el monedero.</translation>
</message>
<message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation type="unfinished">Recuerda que cifrar tu monedero no garantiza la protección de tus bitcoins si tu ordenador es infectado con malware.</translation>
+ <translation type="unfinished">Recuerda que cifrar tu monedero no garantiza la protección total de tus bitcoins contra robos si el equipo está infectado con malware.</translation>
</message>
<message>
<source>Wallet to be encrypted</source>
- <translation type="unfinished">Monedero a cifrar</translation>
+ <translation type="unfinished">Monedero para cifrar</translation>
</message>
<message>
<source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">Tu monedero va a ser cifrado</translation>
+ <translation type="unfinished">Tu monedero va a ser cifrado.</translation>
</message>
<message>
<source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Tu monedero está ahora cifrado</translation>
+ <translation type="unfinished">Tu monedero está ahora cifrado.</translation>
</message>
<message>
<source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
- <translation type="unfinished">IMPORTANTE: Cualquier respaldo que hayas hecho del archivo de tu monedero debe ser reemplazada por el archivo cifrado del monedero recién generado. Por razones de seguridad, los respaldos anteriores del archivo del monedero sin cifrar serán inútiles cuando empieces a usar el nuevo monedero cifrado.</translation>
+ <translation type="unfinished">IMPORTANTE: Cualquier respaldo que hayas hecho del archivo de tu monedero debe ser reemplazado por el archivo cifrado del monedero recién generado. Por razones de seguridad, los respaldos anteriores del archivo del monedero sin cifrar serán inútiles cuando empieces a usar el monedero cifrado nuevo.</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -213,7 +213,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Las contraseñas proporcionadas no coinciden.</translation>
+ <translation type="unfinished">Las frases de contraseña proporcionadas no coinciden.</translation>
</message>
<message>
<source>Wallet unlock failed</source>
@@ -221,23 +221,23 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">La contraseña introducida para descifrar el monedero es incorrecta.</translation>
+ <translation type="unfinished">La frase de contraseña introducida para descifrar el monedero es incorrecta.</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">La contraseña ingresada para el descifrado de la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelva a intentarlo solo con los caracteres hasta el primer carácter nulo, -- pero sin incluirlo-- . Si esto tiene éxito, establezca una nueva contraseña para evitar este problema en el futuro.</translation>
+ <translation type="unfinished">La frase de contraseña ingresada para el descifrado del monedero es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo. Si esto es correcto, establece una frase de contraseña nueva para evitar este problema en el futuro.</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">La frase-contraseña de la billetera ha sido cambiada.</translation>
+ <translation type="unfinished">La frase de contraseña del monedero ha sido cambiada correctamente.</translation>
</message>
<message>
<source>Passphrase change failed</source>
- <translation type="unfinished">Cambio de frase-contraseña erróneo</translation>
+ <translation type="unfinished">Error al cambiar la frase de contraseña</translation>
</message>
<message>
<source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">La contraseña antigua ingresada para el descifrado de la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelva a intentarlo solo con los caracteres hasta el primer carácter nulo, -- pero sin incluirlo-- .</translation>
+ <translation type="unfinished">La frase de contraseña antigua que se ingresó para el descifrado del monedero es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo.</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
@@ -267,7 +267,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">Ha ocurrido un error fatal. %1 no puede seguir seguro y se cerrará.</translation>
+ <translation type="unfinished">Ha ocurrido un error fatal. %1 no puede seguir ejecutándose de manera segura y se cerrará.</translation>
</message>
<message>
<source>Internal error</source>
@@ -275,7 +275,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
- <translation type="unfinished">Ha ocurrido un error interno. %1 intentará continuar. Este es un error inesperado que puede ser comunicado de las formas que se muestran debajo.</translation>
+ <translation type="unfinished">Ha ocurrido un error interno. %1 intentará continuar de manera segura. Este es un error inesperado que puede ser comunicado de las formas que se muestran debajo.</translation>
</message>
</context>
<context>
@@ -283,7 +283,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<message>
<source>Do you want to reset settings to default values, or to abort without making changes?</source>
<extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
- <translation type="unfinished">¿Deseas restablecer los valores a la configuración predeterminada, o interrumpir sin realizar los cambios?</translation>
+ <translation type="unfinished">¿Deseas restablecer la configuración a los valores predeterminados o interrumpir sin realizar cambios?</translation>
</message>
<message>
<source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
@@ -299,12 +299,24 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">"%1" insertado</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Importe</translation>
</message>
<message>
<source>Enter a Bitcoin address (e.g. %1)</source>
- <translation type="unfinished">Ingresa una dirección de Bitcoin (Ejemplo: %1)</translation>
+ <translation type="unfinished">Ingresa una dirección de Bitcoin (p. ej., %1)</translation>
</message>
<message>
<source>Unroutable</source>
@@ -323,12 +335,12 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<message>
<source>Full Relay</source>
<extracomment>Peer connection type that relays all network information.</extracomment>
- <translation type="unfinished">Transmisión completa</translation>
+ <translation type="unfinished">Retransmisión completa</translation>
</message>
<message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">Transmisión de Bloque</translation>
+ <translation type="unfinished">Retransmisión de bloques</translation>
</message>
<message>
<source>Feeler</source>
@@ -338,7 +350,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<message>
<source>Address Fetch</source>
<extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
- <translation type="unfinished">Búsqueda de dirección</translation>
+ <translation type="unfinished">Recuperación de direcciones</translation>
</message>
<message>
<source>None</source>
@@ -390,7 +402,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform>%n años</numerusform>
+ <numerusform>%n año</numerusform>
<numerusform>%n años</numerusform>
</translation>
</message>
@@ -423,7 +435,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>&amp;About %1</source>
- <translation type="unfinished">Acerca &amp;de %1</translation>
+ <translation type="unfinished">&amp;Acerca de %1</translation>
</message>
<message>
<source>Show information about %1</source>
@@ -460,7 +472,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
- <translation type="unfinished">Proxy está &lt;b&gt;habilitado&lt;/b&gt;: %1</translation>
+ <translation type="unfinished">El proxy está &lt;b&gt;habilitado&lt;/b&gt;: %1</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
@@ -472,7 +484,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Cambiar la contraseña utilizada para el cifrado del monedero</translation>
+ <translation type="unfinished">Cambiar la frase de contraseña utilizada para el cifrado del monedero</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -488,7 +500,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;Cifrar monedero</translation>
+ <translation type="unfinished">&amp;Cifrar monedero…</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -496,27 +508,27 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Respaldar monedero</translation>
+ <translation type="unfinished">&amp;Respaldar monedero…</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Cambiar frase-contraseña...</translation>
+ <translation type="unfinished">&amp;Cambiar frase de contraseña…</translation>
</message>
<message>
<source>Sign &amp;message…</source>
- <translation type="unfinished">Firmar &amp;mensaje...</translation>
+ <translation type="unfinished">Firmar &amp;mensaje…</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Firmar mensajes con sus direcciones Bitcoin para probar la propiedad</translation>
+ <translation type="unfinished">Firmar mensajes con tus direcciones Bitcoin para probar la propiedad</translation>
</message>
<message>
<source>&amp;Verify message…</source>
- <translation type="unfinished">&amp;Verificar mensaje...</translation>
+ <translation type="unfinished">&amp;Verificar mensaje…</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Verificar un mensaje para comprobar que fue firmado con la dirección Bitcoin indicada</translation>
+ <translation type="unfinished">Verificar mensajes para comprobar que fueron firmados con la dirección Bitcoin indicada</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
@@ -544,11 +556,11 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">Parámetro&amp;s</translation>
+ <translation type="unfinished">&amp;Parámetros</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">Ay&amp;uda</translation>
+ <translation type="unfinished">&amp;Ayuda</translation>
</message>
<message>
<source>Tabs toolbar</source>
@@ -556,7 +568,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Sincronizando cabeceras (%1%)...</translation>
+ <translation type="unfinished">Sincronizando encabezados (%1%)...</translation>
</message>
<message>
<source>Synchronizing with network…</source>
@@ -564,54 +576,54 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
- <translation type="unfinished">Indexando bloques en disco...</translation>
+ <translation type="unfinished">Indexando bloques en disco…</translation>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">Procesando bloques en disco...</translation>
+ <translation type="unfinished">Procesando bloques en disco…</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Conectando con parejas...</translation>
+ <translation type="unfinished">Conectando con pares…</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Solicitar abonaciones (generadas por código QR y bitcoin: URI)</translation>
+ <translation type="unfinished">Solicitar pagos (genera códigos QR y URI de tipo "bitcoin:")</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Muestra el listado de direcciones de envío utilizadas</translation>
+ <translation type="unfinished">Muestra el listado de direcciones de envío y etiquetas utilizadas</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Muestra el listado de direcciones de remitentes utilizadas y las etiquetas</translation>
+ <translation type="unfinished">Muestra el listado de direcciones de recepción y etiquetas utilizadas</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">Opciones por línea de &amp;instrucciones</translation>
+ <translation type="unfinished">&amp;Opciones de línea de comandos</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>Procesado %n bloque del historial de transacciones.</numerusform>
- <numerusform>Procesados %n bloques del historial de transacciones.</numerusform>
+ <numerusform>Se ha procesado %n bloque del historial de transacciones.</numerusform>
+ <numerusform>Se han procesado %n bloques del historial de transacciones.</numerusform>
</translation>
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 se comporta</translation>
+ <translation type="unfinished">%1 detrás</translation>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">Poniéndose al día...</translation>
+ <translation type="unfinished">Poniéndose al día…</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">Último bloque recibido fue generado hace %1.</translation>
+ <translation type="unfinished">El último bloque recibido fue generado hace %1.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Transacciones tras esta no aún será visible.</translation>
+ <translation type="unfinished">Las transacciones posteriores aún no estarán visibles.</translation>
</message>
<message>
<source>Warning</source>
@@ -643,19 +655,19 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">Abrir consola de depuración y diagnóstico de nodo</translation>
+ <translation type="unfinished">Abrir la consola de depuración y diagnóstico de nodos</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">Direcciones de &amp;envío</translation>
+ <translation type="unfinished">&amp;Direcciones de envío</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">Direcciones de &amp;recepción</translation>
+ <translation type="unfinished">&amp;Direcciones de recepción</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Bitcoin: abrir URI</translation>
+ <translation type="unfinished">Abrir un URI de tipo "bitcoin:"</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -684,8 +696,16 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<translation type="unfinished">Cerrar todos los monederos</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar monedero</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrar un monedero</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Muestra el mensaje %1 de ayuda para obtener un listado con las opciones posibles de la línea de instrucciones de Bitcoin.</translation>
+ <translation type="unfinished">Muestra el mensaje de ayuda %1 para obtener una lista con posibles opciones de línea de comandos de Bitcoin.</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -693,7 +713,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Mask the values in the Overview tab</source>
- <translation type="unfinished">Esconder los valores de la ventana de previsualización</translation>
+ <translation type="unfinished">Ocultar los valores de la ventana de previsualización</translation>
</message>
<message>
<source>default wallet</source>
@@ -711,7 +731,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Cargar respaldo del monedero</translation>
+ <translation type="unfinished">Cargar copia de seguridad del monedero</translation>
</message>
<message>
<source>Restore Wallet</source>
@@ -728,6 +748,10 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<translation type="unfinished">&amp;Ventana</translation>
</message>
<message>
+ <source>Zoom</source>
+ <translation type="unfinished">Acercar</translation>
+ </message>
+ <message>
<source>Main Window</source>
<translation type="unfinished">Ventana principal</translation>
</message>
@@ -747,24 +771,24 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
- <numerusform>%n conexiónes activas con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexión activa con la red Bitcoin.</numerusform>
+ <numerusform>%n conexiones activas con la red Bitcoin.</numerusform>
</translation>
</message>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">Pulse para ver más acciones.</translation>
+ <translation type="unfinished">Haz clic para ver más acciones.</translation>
</message>
<message>
<source>Show Peers tab</source>
<extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">Mostrar pestaña de parejas</translation>
+ <translation type="unfinished">Mostrar pestaña de pares</translation>
</message>
<message>
<source>Disable network activity</source>
<extracomment>A context menu item.</extracomment>
- <translation type="unfinished">Deshabilita la actividad de la red</translation>
+ <translation type="unfinished">Desactivar la actividad de la red</translation>
</message>
<message>
<source>Enable network activity</source>
@@ -773,7 +797,15 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
+ <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Error al crear monedero</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">No se puede crear un nuevo monedero, ya que el software se compiló sin compatibilidad con sqlite (requerido para monederos basados en descriptores)</translation>
</message>
<message>
<source>Warning: %1</source>
@@ -821,7 +853,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Incoming transaction</source>
- <translation type="unfinished">Transacción recibida</translation>
+ <translation type="unfinished">Transacción entrante</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
@@ -852,14 +884,14 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
- <translation type="unfinished">Unidad en la que se muestran los importes. Haga clic para seleccionar otra unidad.</translation>
+ <translation type="unfinished">Unidad en la que se muestran los importes. Haz clic para seleccionar otra unidad.</translation>
</message>
</context>
<context>
<name>CoinControlDialog</name>
<message>
<source>Coin Selection</source>
- <translation type="unfinished">Selección de moneda</translation>
+ <translation type="unfinished">Selección de monedas</translation>
</message>
<message>
<source>Quantity:</source>
@@ -874,12 +906,8 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<translation type="unfinished">Comisión:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
- </message>
- <message>
<source>After Fee:</source>
- <translation type="unfinished">Después de la comisión:</translation>
+ <translation type="unfinished">Tras la comisión:</translation>
</message>
<message>
<source>Change:</source>
@@ -887,7 +915,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>(un)select all</source>
- <translation type="unfinished">(des)selecionar todo</translation>
+ <translation type="unfinished">(de)seleccionar todo</translation>
</message>
<message>
<source>Tree mode</source>
@@ -903,11 +931,11 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Received with label</source>
- <translation type="unfinished">Recibido con dirección</translation>
+ <translation type="unfinished">Recibido con etiqueta</translation>
</message>
<message>
<source>Received with address</source>
- <translation type="unfinished">Recibido con etiqueta</translation>
+ <translation type="unfinished">Recibido con dirección</translation>
</message>
<message>
<source>Date</source>
@@ -943,11 +971,11 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
- <translation type="unfinished">Bl&amp;oquear no gastado</translation>
+ <translation type="unfinished">&amp;Bloquear importe no gastado</translation>
</message>
<message>
<source>&amp;Unlock unspent</source>
- <translation type="unfinished">&amp;Desbloquear lo no gastado</translation>
+ <translation type="unfinished">&amp;Desbloquear importe no gastado</translation>
</message>
<message>
<source>Copy quantity</source>
@@ -966,10 +994,6 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar polvo</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
@@ -978,14 +1002,6 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<translation type="unfinished">(%1 bloqueado)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">sí</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Esta etiqueta se vuelve roja si algún receptor recibe un importe inferior al umbral actual establecido para el polvo.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Puede variar en +/- %1 satoshi(s) por entrada.</translation>
</message>
@@ -995,7 +1011,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>change from %1 (%2)</source>
- <translation type="unfinished">cambia desde %1 (%2)</translation>
+ <translation type="unfinished">cambio de %1 (%2)</translation>
</message>
<message>
<source>(change)</source>
@@ -1016,7 +1032,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Create wallet failed</source>
- <translation type="unfinished">Fallo al crear monedero</translation>
+ <translation type="unfinished">Error al crear monedero</translation>
</message>
<message>
<source>Create wallet warning</source>
@@ -1045,28 +1061,79 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrar monedero</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">¿Seguro deseas migrar el monedero &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">La migración del monedero lo convertirá en uno o más monederos basados en descriptores. Será necesario realizar una nueva copia de seguridad del monedero.
+Si este monedero contiene scripts solo de observación, se creará un nuevo monedero que los contenga.
+Si este monedero contiene scripts solucionables pero no de observación, se creará un nuevo monedero diferente que los contenga.
+
+El proceso de migración creará una copia de seguridad del monedero antes de migrar. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de este monedero. En el caso de una migración incorrecta, la copia de seguridad puede restaurarse con la funcionalidad "Restaurar monedero".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar monedero</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrando monedero &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">La migración del monedero "%1" se realizó correctamente.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Los scripts solo de observación se han migrado a un nuevo monedero llamado "%1".</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Los scripts solucionables pero no de observación se han migrado a un nuevo monedero llamado "%1".</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migración errónea</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migración correcta</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
- <translation type="unfinished">Abrir monedero ha fallado</translation>
+ <translation type="unfinished">Error al abrir monedero</translation>
</message>
<message>
<source>Open wallet warning</source>
- <translation type="unfinished">Advertencia sobre crear monedero</translation>
+ <translation type="unfinished">Advertencia al abrir monedero</translation>
</message>
<message>
<source>default wallet</source>
- <translation type="unfinished">Monedero predeterminado</translation>
+ <translation type="unfinished">monedero predeterminado</translation>
</message>
<message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Abrir Monedero</translation>
+ <translation type="unfinished">Abrir monedero</translation>
</message>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
- <translation type="unfinished">Abriendo Monedero &lt;b&gt;%1&lt;/b&gt;...</translation>
+ <translation type="unfinished">Abriendo monedero &lt;b&gt;%1&lt;/b&gt;...</translation>
</message>
</context>
<context>
@@ -1105,7 +1172,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">¿Estás seguro de que deseas cerrar el monedero &lt;i&gt;%1&lt;/i&gt;?</translation>
+ <translation type="unfinished">¿Seguro deseas cerrar el monedero &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
<message>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
@@ -1117,18 +1184,26 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">¿Estás seguro de que deseas cerrar todos los monederos?</translation>
+ <translation type="unfinished">¿Seguro deseas cerrar todos los monederos?</translation>
</message>
</context>
<context>
<name>CreateWalletDialog</name>
<message>
<source>Create Wallet</source>
- <translation type="unfinished">Crear Monedero</translation>
+ <translation type="unfinished">Crear monedero</translation>
+ </message>
+ <message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Estás a un paso de crear tu nuevo monedero.</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Escribe un nombre y, si lo deseas, activa las opciones avanzadas.</translation>
</message>
<message>
<source>Wallet Name</source>
- <translation type="unfinished">Nombre del Monedero</translation>
+ <translation type="unfinished">Nombre del monedero</translation>
</message>
<message>
<source>Wallet</source>
@@ -1136,41 +1211,33 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">Cifrar monedero. El monedero será cifrado con la contraseña que elija.</translation>
+ <translation type="unfinished">Cifrar el monedero. El monedero será cifrado con la frase de contraseña que elijas.</translation>
</message>
<message>
<source>Encrypt Wallet</source>
- <translation type="unfinished">Cifrar Monedero</translation>
+ <translation type="unfinished">Cifrar monedero</translation>
</message>
<message>
<source>Advanced Options</source>
- <translation type="unfinished">Opciones Avanzadas</translation>
+ <translation type="unfinished">Opciones avanzadas</translation>
</message>
<message>
<source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">Deshabilita las claves privadas para este monedero. Los monederos con claves privadas deshabilitadas no tendrán claves privadas y no podrán tener ni una semilla HD ni claves privadas importadas. Esto es ideal para monederos de solo lectura.</translation>
+ <translation type="unfinished">Deshabilita las claves privadas para este monedero. Los monederos con claves privadas deshabilitadas no tendrán claves privadas y no podrán tener ni una semilla HD ni claves privadas importadas. Esto es ideal para monederos solo de observación.</translation>
</message>
<message>
<source>Disable Private Keys</source>
- <translation type="unfinished">Deshabilita las Llaves Privadas</translation>
+ <translation type="unfinished">Deshabilitar claves privadas</translation>
</message>
<message>
<source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
- <translation type="unfinished">Crear un monedero vacío. Los monederos vacíos no tienen claves privadas ni scripts. Las claves privadas y direcciones pueden importarse después o también establecer una semilla HD.</translation>
+ <translation type="unfinished">Crear un monedero vacío. Los monederos vacíos inicialmente no tienen claves privadas ni scripts. Las claves privadas y direcciones pueden importarse, o puede establecerse una semilla HD, posteriormente.</translation>
</message>
<message>
<source>Make Blank Wallet</source>
<translation type="unfinished">Crear monedero vacío</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Use descriptores para la gestión de scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Descriptor del monedero</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Utiliza un dispositivo de firma externo, como un monedero de hardware. Configura primero el script del firmante externo en las preferencias del monedero.</translation>
</message>
@@ -1183,10 +1250,6 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<translation type="unfinished">Crear</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilado sin soporte de sqlite (requerido para billeteras descriptoras)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Compilado sin soporte de firma externa (necesario para la firma externa)</translation>
@@ -1196,7 +1259,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<name>EditAddressDialog</name>
<message>
<source>Edit Address</source>
- <translation type="unfinished">Editar Dirección</translation>
+ <translation type="unfinished">Editar dirección</translation>
</message>
<message>
<source>&amp;Label</source>
@@ -1204,11 +1267,11 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>The label associated with this address list entry</source>
- <translation type="unfinished">La etiqueta asociada con esta entrada en la libreta</translation>
+ <translation type="unfinished">La etiqueta asociada con esta entrada en la lista de direcciones</translation>
</message>
<message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation type="unfinished">La dirección asociada con esta entrada en la guía. Solo puede ser modificada para direcciones de envío.</translation>
+ <translation type="unfinished">La dirección asociada con esta entrada en la lista de direcciones. Solo se puede modificar para las direcciones de envío.</translation>
</message>
<message>
<source>&amp;Address</source>
@@ -1220,11 +1283,11 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Edit receiving address</source>
- <translation type="unfinished">Editar dirección de recivimiento</translation>
+ <translation type="unfinished">Editar dirección de recepción</translation>
</message>
<message>
<source>Edit sending address</source>
- <translation type="unfinished">Editar dirección de envio</translation>
+ <translation type="unfinished">Editar dirección de envío</translation>
</message>
<message>
<source>The entered address "%1" is not a valid Bitcoin address.</source>
@@ -1244,7 +1307,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>New key generation failed.</source>
- <translation type="unfinished">La generación de la nueva clave fallo</translation>
+ <translation type="unfinished">Error al generar clave nueva.</translation>
</message>
</context>
<context>
@@ -1259,15 +1322,15 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
- <translation type="unfinished">El directorio ya existe. Agrega %1 si tiene la intención de crear un nuevo directorio aquí.</translation>
+ <translation type="unfinished">El directorio ya existe. Agrega %1 si tienes la intención de crear un nuevo directorio aquí.</translation>
</message>
<message>
<source>Path already exists, and is not a directory.</source>
- <translation type="unfinished">La ruta ya existe, y no es un directorio.</translation>
+ <translation type="unfinished">La ruta ya existe y no es un directorio.</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
- <translation type="unfinished">No puede crear directorio de datos aquí.</translation>
+ <translation type="unfinished">No se puede crear un directorio de datos aquí.</translation>
</message>
</context>
<context>
@@ -1299,18 +1362,18 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">Al menos %1 GB de información será almacenada en este directorio, y seguirá creciendo a través del tiempo.</translation>
+ <translation type="unfinished">Se almacenará al menos %1 GB de datos en este directorio, que aumentará con el tiempo.</translation>
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Aproximadamente %1 GB de información será almacenada en este directorio.</translation>
+ <translation type="unfinished">Se almacenará aproximadamente %1 GB de datos en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
<numerusform>(suficiente para restaurar copias de seguridad de %n día de antigüedad)</numerusform>
- <numerusform>(suficiente para restaurar copias de seguridad de %n días de antigüedad)</numerusform>
+ <numerusform>(suficiente para restaurar copias de seguridad de %n días de antigüedad)|</numerusform>
</translation>
</message>
<message>
@@ -1323,35 +1386,39 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Error: Specified data directory "%1" cannot be created.</source>
- <translation type="unfinished">Error: El directorio de datos especificado «%1» no pudo ser creado.</translation>
+ <translation type="unfinished">Error: El directorio de datos especificado "%1" no pudo ser creado.</translation>
</message>
<message>
<source>Welcome</source>
- <translation type="unfinished">Bienvenido</translation>
+ <translation type="unfinished">Te damos la bienvenida</translation>
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">Bienvenido a %1.</translation>
+ <translation type="unfinished">Te damos la bienvenida a %1.</translation>
</message>
<message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
- <translation type="unfinished">Al ser ésta la primera vez que se ejecuta el programa, puedes escoger donde %1 almacenará los datos.</translation>
+ <translation type="unfinished">Al ser esta la primera vez que se ejecuta el programa, puedes escoger dónde %1 almacenará los datos.</translation>
</message>
<message>
<source>Limit block chain storage to</source>
- <translation type="unfinished">Limitar el almacenamiento de cadena de bloques a</translation>
+ <translation type="unfinished">Limitar el almacenamiento de la cadena de bloques a</translation>
+ </message>
+ <message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">Revertir este parámetro requiere volver a descargar la cadena de bloques completa. Es más rápido descargar primero la cadena completa y podarla después. Se desactivan algunas funciones avanzadas.</translation>
</message>
<message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
- <translation type="unfinished">La sincronización inicial está muy demandada, y puede exponer problemas del hardware con su equipo que tuvo anteriormente se colgó de forma inadvertida. Cada vez que ejecuta %1, continuará descargándose donde éste se detuvo.</translation>
+ <translation type="unfinished">La sincronización inicial consume muchos recursos y es posible que exponga problemas de hardware en el equipo que anteriormente habían pasado desapercibidos. Cada vez que ejecutes %1, seguirá descargando desde el punto en el que quedó.</translation>
</message>
<message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
- <translation type="unfinished">Cuando pulse en Aceptar, %1 se iniciará la descarga y procesamiento de toda la cadena %4 de bloques (%2 GB) empezando con las primeras transacciones en %3 cuando %4 fue inicialmente lanzado.</translation>
+ <translation type="unfinished">Al hacer clic en "Aceptar", %1 iniciará el proceso de descarga y procesará la cadena de bloques %4 completa (%2 GB), empezando con la transacción más antigua en %3 cuando %4 se ejecutó inicialmente.</translation>
</message>
<message>
<source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
- <translation type="unfinished">Si ha elegido limitar el almacenamiento de la cadena de bloques (pruning o poda), los datos históricos todavía se deben descargar y procesar, pero se eliminarán posteriormente para mantener el uso del disco bajo.</translation>
+ <translation type="unfinished">Si has elegido limitar el almacenamiento de la cadena de bloques (pruning o poda), los datos históricos todavía se deben descargar y procesar, pero se eliminarán posteriormente para mantener el uso del disco bajo.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -1381,11 +1448,11 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<name>ShutdownWindow</name>
<message>
<source>%1 is shutting down…</source>
- <translation type="unfinished">%1 se está cerrando...</translation>
+ <translation type="unfinished">%1 se está apagando...</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">No apague el equipo hasta que desaparezca esta ventana.</translation>
+ <translation type="unfinished">No apagues el equipo hasta que desaparezca esta ventana.</translation>
</message>
</context>
<context>
@@ -1396,7 +1463,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">Es posible que las transacciones recientes aún no estén visibles y por lo tanto, el saldo de su monedero podría ser incorrecto. Esta información será correcta una vez que su monedero haya terminado de sincronizarse con la red bitcoin, como se detalla a continuación.</translation>
+ <translation type="unfinished">Es posible que las transacciones recientes aún no estén visibles y, por lo tanto, el saldo del monedero podría ser incorrecto. Esta información será correcta una vez que el monedero haya terminado de sincronizarse con la red Bitcoin, como se detalla a continuación.</translation>
</message>
<message>
<source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
@@ -1404,7 +1471,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Number of blocks left</source>
- <translation type="unfinished">Numero de bloques pendientes</translation>
+ <translation type="unfinished">Número de bloques pendientes</translation>
</message>
<message>
<source>Unknown…</source>
@@ -1432,26 +1499,26 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Hide</source>
- <translation type="unfinished">Ocultar </translation>
+ <translation type="unfinished">Ocultar</translation>
</message>
<message>
<source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
- <translation type="unfinished">%1 está actualmente sincronizándose. Descargará cabeceras y bloques de nodos semejantes y los validará hasta alcanzar la cabeza de la cadena de bloques.</translation>
+ <translation type="unfinished">%1 está actualmente sincronizándose. Descargará encabezados y bloques de nodos semejantes y los validará hasta alcanzar la cabeza de la cadena de bloques.</translation>
</message>
<message>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Desconocido. Sincronizando cabeceras (%1, %2%)…</translation>
+ <translation type="unfinished">Desconocido. Sincronizando encabezados (%1, %2%)…</translation>
</message>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Desconocido. Presincronizando cabeceras (%1, %2%)…</translation>
+ <translation type="unfinished">Desconocido. Presincronizando encabezados (%1, %2%)…</translation>
</message>
</context>
<context>
<name>OpenURIDialog</name>
<message>
<source>Open bitcoin URI</source>
- <translation type="unfinished">Abrir URI de bitcoin</translation>
+ <translation type="unfinished">Abrir URI de tipo "bitcoin:"</translation>
</message>
<message>
<source>Paste address from clipboard</source>
@@ -1471,7 +1538,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Automatically start %1 after logging in to the system.</source>
- <translation type="unfinished">Iniciar automáticamente %1 después de iniciar sesión en el sistema.</translation>
+ <translation type="unfinished">Iniciar automáticamente %1 tras iniciar sesión en el sistema.</translation>
</message>
<message>
<source>&amp;Start %1 on system login</source>
@@ -1483,27 +1550,31 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">Tamaño de la caché de la base de &amp;datos</translation>
+ <translation type="unfinished">Tamaño de la caché de la &amp;base de datos</translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">Número de hilos de &amp;verificación de scripts</translation>
+ <translation type="unfinished">Número de subprocesos de &amp;verificación de scripts</translation>
</message>
<message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
- <translation type="unfinished">Ruta completa a un %1 script compatible (por ejemplo, C:\Downloads\hwi.exe o /Users/you/Downloads/hwi.py). ¡Cuidado: un malware puede robar tus monedas!</translation>
+ <translation type="unfinished">Ruta completa a un script compatible con %1 (p. ej., C:\Descargas\hwi.exe o /Usuarios/Tú/Descargas/hwi.py). Advertencia: ¡El malware podría robarte tus monedas!</translation>
</message>
<message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
- <translation type="unfinished">Dirección IP del proxy (Ejemplo. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
+ <translation type="unfinished">Dirección IP del proxy (por ejemplo, IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
<message>
<source>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
- <translation type="unfinished">Muestra si el proxy SOCKS5 por defecto se utiliza para conectarse a pares a través de este tipo de red.</translation>
+ <translation type="unfinished">Muestra si el proxy SOCKS5 por defecto que se ha suministrado se utiliza para conectarse a pares a través de este tipo de red.</translation>
</message>
<message>
<source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
- <translation type="unfinished">Minimizar en vez de salir de la aplicación cuando la ventana está cerrada. Cuando se activa esta opción, la aplicación sólo se cerrará después de seleccionar Salir en el menú.</translation>
+ <translation type="unfinished">Minimizar en vez de salir de la aplicación cuando la ventana está cerrada. Cuando se activa esta opción, la aplicación sólo se cerrará después de seleccionar "Salir" en el menú.</translation>
+ </message>
+ <message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña de vista general:</translation>
</message>
<message>
<source>Options set in this dialog are overridden by the command line:</source>
@@ -1535,17 +1606,17 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">Revertir estas configuraciones requiere descargar de nuevo la cadena de bloques completa.</translation>
+ <translation type="unfinished">Para revertir esta configuración, se debe descargar de nuevo la cadena de bloques completa.</translation>
</message>
<message>
<source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
<extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
- <translation type="unfinished">Tamaño máximo de la caché de la base de datos. Una caché más grande puede contribuir a una sincronización más rápida, después de lo cual el beneficio es menos pronunciado para la mayoría de los casos de uso. Disminuir el tamaño de la caché reducirá el uso de la memoria. La memoria de la piscina de memoria no utilizada se comparte para esta caché.</translation>
+ <translation type="unfinished">Tamaño máximo de la caché de la base de datos. Una caché más grande puede contribuir a una sincronización más rápida, después de lo cual el beneficio es menos pronunciado para la mayoría de los casos de uso. Disminuir el tamaño de la caché reducirá el uso de la memoria. La memoria mempool no utilizada se comparte para esta caché.</translation>
</message>
<message>
<source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
<extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
- <translation type="unfinished">Establezca el número de hilos de verificación de scripts. Los valores negativos corresponden al número de núcleos que se desea dejar libres al sistema.</translation>
+ <translation type="unfinished">Establece el número de subprocesos de verificación de scripts. Los valores negativos corresponden al número de núcleos que se desea dejar libres al sistema.</translation>
</message>
<message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
@@ -1554,7 +1625,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<message>
<source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
<extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
- <translation type="unfinished">Esto te permite a ti o a una herramienta de terceros comunicarse con el nodo a través de la línea de órdenes e instrucciones JSON-RPC.</translation>
+ <translation type="unfinished">Esto te permite a ti o a una herramienta de terceros comunicarse con el nodo a través de la línea de comandos y los comandos JSON-RPC.</translation>
</message>
<message>
<source>Enable R&amp;PC server</source>
@@ -1581,11 +1652,11 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Enable coin &amp;control features</source>
- <translation type="unfinished">Habilitar características de &amp;control de moneda.</translation>
+ <translation type="unfinished">Habilitar funciones de &amp;control de monedas</translation>
</message>
<message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
- <translation type="unfinished">Si deshabilitas el gasto de un cambio no confirmado, el cambio de una transacción no se puede usar hasta que esa transacción tenga al menos una confirmación. Esto también afecta a cómo se calcula tu saldo.</translation>
+ <translation type="unfinished">Si deshabilitas el gasto del cambio sin confirmar, el cambio de una transacción no se puede usar hasta que esta tenga al menos una confirmación. Esto también afecta el cálculo del saldo.</translation>
</message>
<message>
<source>&amp;Spend unconfirmed change</source>
@@ -1603,27 +1674,27 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>External Signer (e.g. hardware wallet)</source>
- <translation type="unfinished">Dispositivo externo de firma (ej. billetera de hardware)</translation>
+ <translation type="unfinished">Dispositivo externo de firma (p. ej., monedero de hardware)</translation>
</message>
<message>
<source>&amp;External signer script path</source>
- <translation type="unfinished">Ruta de script de firma &amp;externo</translation>
+ <translation type="unfinished">&amp;Ruta al script del firmante externo</translation>
</message>
<message>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
- <translation type="unfinished">Abrir automáticamente el puerto del cliente Bitcoin en el router. Esta opción solo funciona cuando el router admite UPnP y está activado.</translation>
+ <translation type="unfinished">Abrir automáticamente el puerto del cliente Bitcoin en el enrutador. Esta opción solo funciona cuando el enrutador admite UPnP y está activado.</translation>
</message>
<message>
<source>Map port using &amp;UPnP</source>
- <translation type="unfinished">Mapear el puerto usando &amp;UPnP</translation>
+ <translation type="unfinished">Asignar puerto mediante &amp;UPnP</translation>
</message>
<message>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
- <translation type="unfinished">Abre el puerto del cliente de Bitcoin en el router automáticamente. Esto solo funciona cuando el router soporta NAT-PMP y está activo. El puerto externo podría ser elegido al azar.</translation>
+ <translation type="unfinished">Abre el puerto del cliente de Bitcoin en el enrutador automáticamente. Esto solo funciona cuando el enrutador soporta NAT-PMP y está activo. El puerto externo podría ser elegido al azar.</translation>
</message>
<message>
<source>Map port using NA&amp;T-PMP</source>
- <translation type="unfinished">Mapear el puerto usando NA&amp;T-PMP</translation>
+ <translation type="unfinished">Asignar puerto usando NA&amp;T-PMP</translation>
</message>
<message>
<source>Accept connections from outside.</source>
@@ -1643,7 +1714,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Proxy &amp;IP:</source>
- <translation type="unfinished">&amp;IP proxy::</translation>
+ <translation type="unfinished">IP del &amp;proxy:</translation>
</message>
<message>
<source>&amp;Port:</source>
@@ -1651,7 +1722,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Port of the proxy (e.g. 9050)</source>
- <translation type="unfinished">Puerto del proxy (ej. 9050)</translation>
+ <translation type="unfinished">Puerto del proxy (p. ej., 9050)</translation>
</message>
<message>
<source>Used for reaching peers via:</source>
@@ -1667,7 +1738,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>&amp;Show tray icon</source>
- <translation type="unfinished">Mostrar la &amp;bandeja del sistema.</translation>
+ <translation type="unfinished">&amp;Mostrar el icono de la bandeja</translation>
</message>
<message>
<source>Show only a tray icon after minimizing the window.</source>
@@ -1675,15 +1746,15 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>&amp;Minimize to the tray instead of the taskbar</source>
- <translation type="unfinished">&amp;Minimiza a la bandeja en vez de la barra de tareas</translation>
+ <translation type="unfinished">&amp;Minimizar a la bandeja en vez de la barra de tareas</translation>
</message>
<message>
<source>M&amp;inimize on close</source>
- <translation type="unfinished">M&amp;inimizar al cerrar</translation>
+ <translation type="unfinished">&amp;Minimizar al cerrar</translation>
</message>
<message>
<source>&amp;Display</source>
- <translation type="unfinished">&amp;Mostrar</translation>
+ <translation type="unfinished">&amp;Visualización</translation>
</message>
<message>
<source>User Interface &amp;language:</source>
@@ -1695,43 +1766,31 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>&amp;Unit to show amounts in:</source>
- <translation type="unfinished">&amp;Unidad en la que mostrar importes:</translation>
+ <translation type="unfinished">&amp;Unidad en la que se muestran los importes:</translation>
</message>
<message>
<source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
- <translation type="unfinished">Elegir la subdivisión predeterminada para mostrar cantidades en la interfaz y cuando se envían monedas.</translation>
+ <translation type="unfinished">Elegir la unidad de subdivisión predeterminada para mostrar en la interfaz y al enviar monedas.</translation>
</message>
<message>
<source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
- <translation type="unfinished">URLs de terceros (por ejemplo, un explorador de bloques) que aparecen en la pestaña de transacciones como elementos del menú contextual. %s en la URL se sustituye por el hash de la transacción. Las URL múltiples se separan con una barra vertical |.</translation>
+ <translation type="unfinished">URL de terceros (por ejemplo, un explorador de bloques) que aparecen en la pestaña de transacciones como elementos del menú contextual. %s en la URL se sustituye por el hash de la transacción. Las URL múltiples se separan con una barra vertical |.</translation>
</message>
<message>
<source>&amp;Third-party transaction URLs</source>
- <translation type="unfinished">URLs de transacciones de &amp;terceros</translation>
+ <translation type="unfinished">&amp;URL de transacciones de terceros</translation>
</message>
<message>
<source>Whether to show coin control features or not.</source>
- <translation type="unfinished">Mostrar o no funcionalidad del control de moneda</translation>
+ <translation type="unfinished">Mostrar o no la funcionalidad de control de monedas.</translation>
</message>
<message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
- <translation type="unfinished">Conectar a la red de Bitcoin a través de un proxy SOCKS5 diferente para los servicios anónimos de Tor.</translation>
+ <translation type="unfinished">Conectarse a la red de Bitcoin a través de un proxy SOCKS5 independiente para los servicios onion de Tor.</translation>
</message>
<message>
<source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
- <translation type="unfinished">Usar proxy SOCKS&amp;5 para alcanzar nodos vía servicios anónimos Tor:</translation>
- </message>
- <message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña Resumen:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">embebido «%1»</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">coincidencia más aproximada «%1»</translation>
+ <translation type="unfinished">Usar proxy SOCKS&amp;5 para conectar a pares a través de los servicios anónimos de Tor:</translation>
</message>
<message>
<source>&amp;OK</source>
@@ -1744,7 +1803,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Compilado sin soporte de firma externa (necesario para la firma externa)</translation>
+ <translation type="unfinished">Compilado sin soporte de firma externa (requerido para la firma externa)</translation>
</message>
<message>
<source>default</source>
@@ -1767,7 +1826,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<message>
<source>Current settings will be backed up at "%1".</source>
<extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
- <translation type="unfinished">Los parámetros actuales se guardarán en «%1».</translation>
+ <translation type="unfinished">Los parámetros actuales se guardarán en "%1".</translation>
</message>
<message>
<source>Client will be shut down. Do you want to proceed?</source>
@@ -1782,7 +1841,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<message>
<source>The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
<extracomment>Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</extracomment>
- <translation type="unfinished">El archivo de configuración se utiliza para especificar opciones de usuario avanzadas que anulan la configuración de la GUI. Además, cualquier opción de línea de comandos anulará este archivo de configuración.</translation>
+ <translation type="unfinished">El archivo de configuración se usa para especificar opciones avanzadas del usuario, que remplazan la configuración de la GUI. Además, las opciones de la línea de comandos remplazarán este archivo de configuración.</translation>
</message>
<message>
<source>Continue</source>
@@ -1809,7 +1868,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<name>OptionsModel</name>
<message>
<source>Could not read setting "%1", %2.</source>
- <translation type="unfinished">No se pudo leer el ajuste «%1», %2.</translation>
+ <translation type="unfinished">No se puede leer la configuración "%1", %2.</translation>
</message>
</context>
<context>
@@ -1820,11 +1879,11 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
- <translation type="unfinished">La información mostrada puede estar desactualizada. Su monedero se sincroniza automáticamente con la red de Bitcoin después de establecer una conexión, pero este proceso aún no se ha completado.</translation>
+ <translation type="unfinished">La información mostrada puede estar desactualizada. El monedero se sincroniza automáticamente con la red de Bitcoin después de establecer una conexión, pero este proceso aún no se ha completado.</translation>
</message>
<message>
<source>Watch-only:</source>
- <translation type="unfinished">Solo observación:</translation>
+ <translation type="unfinished">Solo de observación:</translation>
</message>
<message>
<source>Available:</source>
@@ -1832,7 +1891,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Your current spendable balance</source>
- <translation type="unfinished">Su saldo disponible actual</translation>
+ <translation type="unfinished">Tu saldo disponible actual</translation>
</message>
<message>
<source>Pending:</source>
@@ -1840,27 +1899,31 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
- <translation type="unfinished">Total de transacciones que aún no se han sido confirmadas, y que no son contabilizadas dentro del saldo disponible para gastar</translation>
+ <translation type="unfinished">Total de transacciones que aún no han sido confirmadas y que no son contabilizadas dentro del saldo disponible para gastar</translation>
</message>
<message>
<source>Immature:</source>
- <translation type="unfinished">No disponible:</translation>
+ <translation type="unfinished">Inmadura:</translation>
</message>
<message>
<source>Mined balance that has not yet matured</source>
- <translation type="unfinished">Saldo recién minado que aún no está disponible</translation>
+ <translation type="unfinished">Saldo minado que aún no ha madurado</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation type="unfinished">Saldos</translation>
</message>
<message>
<source>Your current total balance</source>
- <translation type="unfinished">Su saldo total actual</translation>
+ <translation type="unfinished">Tu saldo total actual</translation>
</message>
<message>
<source>Your current balance in watch-only addresses</source>
- <translation type="unfinished">Su saldo actual en direcciones de observación</translation>
+ <translation type="unfinished">Tu saldo actual en direcciones solo de observación</translation>
</message>
<message>
<source>Spendable:</source>
- <translation type="unfinished">Disponible:</translation>
+ <translation type="unfinished">Gastable:</translation>
</message>
<message>
<source>Recent transactions</source>
@@ -1868,34 +1931,34 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Unconfirmed transactions to watch-only addresses</source>
- <translation type="unfinished">Transacciones sin confirmar a direcciones de observación</translation>
+ <translation type="unfinished">Transacciones sin confirmar a direcciones solo de observación</translation>
</message>
<message>
<source>Mined balance in watch-only addresses that has not yet matured</source>
- <translation type="unfinished">Saldo minado en direcciones de observación que aún no está disponible</translation>
+ <translation type="unfinished">Saldo minado en direcciones solo de observación que aún no ha madurado</translation>
</message>
<message>
<source>Current total balance in watch-only addresses</source>
- <translation type="unfinished">Saldo total actual en direcciones de observación</translation>
+ <translation type="unfinished">Saldo total actual en direcciones solo de observación</translation>
</message>
<message>
<source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
- <translation type="unfinished">Modo de privacidad activado para la pestaña de visión general. Para desenmascarar los valores, desmarcar los valores de Configuración → Enmascarar valores.</translation>
+ <translation type="unfinished">Modo de privacidad activado para la pestaña de vista general. Para mostrar los valores, anula la selección de "Configuración-&gt;Ocultar valores".</translation>
</message>
</context>
<context>
<name>PSBTOperationsDialog</name>
<message>
<source>PSBT Operations</source>
- <translation type="unfinished">Operaciones PSBT</translation>
+ <translation type="unfinished">Operaciones TBPF</translation>
</message>
<message>
<source>Sign Tx</source>
- <translation type="unfinished">Firmar Tx</translation>
+ <translation type="unfinished">Firmar transacción</translation>
</message>
<message>
<source>Broadcast Tx</source>
- <translation type="unfinished">Emitir Tx</translation>
+ <translation type="unfinished">Transmitir transacción</translation>
</message>
<message>
<source>Copy to Clipboard</source>
@@ -1911,11 +1974,11 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Failed to load transaction: %1</source>
- <translation type="unfinished">Error en la carga de la transacción: %1</translation>
+ <translation type="unfinished">Error en la carga de transacción: %1</translation>
</message>
<message>
<source>Failed to sign transaction: %1</source>
- <translation type="unfinished">Error en la firma de la transacción: %1</translation>
+ <translation type="unfinished">Error en la firma de transacción: %1</translation>
</message>
<message>
<source>Cannot sign inputs while wallet is locked.</source>
@@ -1931,7 +1994,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Signed transaction successfully. Transaction is ready to broadcast.</source>
- <translation type="unfinished">Se ha firmado correctamente. La transacción está lista para difundirse.</translation>
+ <translation type="unfinished">La transacción se ha firmado correctamente y está lista para transmitirse.</translation>
</message>
<message>
<source>Unknown error processing transaction.</source>
@@ -1939,15 +2002,15 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Transaction broadcast successfully! Transaction ID: %1</source>
- <translation type="unfinished">¡La transacción se ha difundido correctamente! Código ID de la transacción: %1</translation>
+ <translation type="unfinished">¡La transacción se ha transmitido correctamente! Identificador de transacción: %1</translation>
</message>
<message>
<source>Transaction broadcast failed: %1</source>
- <translation type="unfinished">Ha habido un error en la difusión de la transacción: %1</translation>
+ <translation type="unfinished">Error al transmitir la transacción: %1</translation>
</message>
<message>
<source>PSBT copied to clipboard.</source>
- <translation type="unfinished">TBPF copiado al portapapeles</translation>
+ <translation type="unfinished">TBPF copiada al portapapeles.</translation>
</message>
<message>
<source>Save Transaction Data</source>
@@ -1956,19 +2019,23 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Transacción parcialmente firmada (binario) </translation>
+ <translation type="unfinished">Transacción parcialmente firmada (binario)</translation>
</message>
<message>
<source>PSBT saved to disk.</source>
- <translation type="unfinished">TBPF guardado en disco.</translation>
+ <translation type="unfinished">TBPF guardada en disco.</translation>
+ </message>
+ <message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envia %1 a %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">dirección propia</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
- <translation type="unfinished">No se ha podido calcular la comisión por transacción o la totalidad del importe de la transacción.</translation>
+ <translation type="unfinished">No se ha podido calcular la comisión de transacción o la totalidad del importe de la transacción.</translation>
</message>
<message>
<source>Pays transaction fee: </source>
@@ -1988,7 +2055,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Transaction is missing some information about inputs.</source>
- <translation type="unfinished">Falta alguna información sobre las entradas de la transacción.</translation>
+ <translation type="unfinished">A la transacción le falta información sobre entradas.</translation>
</message>
<message>
<source>Transaction still needs signature(s).</source>
@@ -1996,19 +2063,19 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>(But no wallet is loaded.)</source>
- <translation type="unfinished">(No existe ningún monedero cargado.)</translation>
+ <translation type="unfinished">(No existe ningún monedero cargado).</translation>
</message>
<message>
<source>(But this wallet cannot sign transactions.)</source>
- <translation type="unfinished">(Este monedero no puede firmar transacciones.)</translation>
+ <translation type="unfinished">(Este monedero no puede firmar transacciones).</translation>
</message>
<message>
<source>(But this wallet does not have the right keys.)</source>
- <translation type="unfinished">(Este monedero no tiene las claves adecuadas.)</translation>
+ <translation type="unfinished">(Este monedero no tiene las claves adecuadas).</translation>
</message>
<message>
<source>Transaction is fully signed and ready for broadcast.</source>
- <translation type="unfinished">La transacción se ha firmado correctamente y está lista para difundirse.</translation>
+ <translation type="unfinished">La transacción se ha firmado completamente y está lista para transmitirse.</translation>
</message>
<message>
<source>Transaction status is unknown.</source>
@@ -2023,7 +2090,7 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>Cannot start bitcoin: click-to-pay handler</source>
- <translation type="unfinished">No se puede iniciar bitcoin: controlador clic-para-pagar</translation>
+ <translation type="unfinished">No se puede iniciar el controlador "bitcoin: click-to-pay"</translation>
</message>
<message>
<source>URI handling</source>
@@ -2031,19 +2098,19 @@ Firmar solo es posible con direcciones del tipo «Heredadas».</translation>
</message>
<message>
<source>'bitcoin://' is not a valid URI. Use 'bitcoin:' instead.</source>
- <translation type="unfinished">«bitcoin: //» no es un URI válido. Use «bitcoin:» en su lugar.</translation>
+ <translation type="unfinished">"bitcoin://" no es un URI válido. Usa "bitcoin:" en su lugar.</translation>
</message>
<message>
<source>Cannot process payment request because BIP70 is not supported.
Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
- <translation type="unfinished">No se puede procesar la solicitud de pago debido a que no se mantiene BIP70.
-Debido a los fallos de seguridad generalizados en el BIP70, se recomienda encarecidamente ignorar las instrucciones del comerciante para cambiar de monedero.
-Si recibe este error, debe solicitar al comerciante que le proporcione un URI compatible con BIP21.</translation>
+ <translation type="unfinished">No se puede procesar la solicitud de pago porque no existe compatibilidad con BIP70.
+Debido a los fallos de seguridad generalizados en BIP70, se recomienda encarecidamente ignorar las instrucciones del comerciante para cambiar de monedero.
+Si recibes este error, debes solicitar al comerciante que te proporcione un URI compatible con BIP21.</translation>
</message>
<message>
<source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
- <translation type="unfinished">¡No se puede interpretar la URI! Esto puede deberse a una dirección Bitcoin inválida o a parámetros de URI mal formados.</translation>
+ <translation type="unfinished">No se puede analizar el URI. Esto se puede deber a una dirección de Bitcoin inválida o a parámetros de URI con formato incorrecto.</translation>
</message>
<message>
<source>Payment request file handling</source>
@@ -2055,17 +2122,17 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>User Agent</source>
<extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
- <translation type="unfinished">Agente del usuario</translation>
+ <translation type="unfinished">Agente de usuario</translation>
</message>
<message>
<source>Peer</source>
<extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
- <translation type="unfinished">Pareja</translation>
+ <translation type="unfinished">Par</translation>
</message>
<message>
<source>Age</source>
<extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">Duración</translation>
+ <translation type="unfinished">Antigüedad</translation>
</message>
<message>
<source>Direction</source>
@@ -2112,15 +2179,15 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<name>QRImageWidget</name>
<message>
<source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;Guardar imagen...</translation>
+ <translation type="unfinished">&amp;Guardar imagen…</translation>
</message>
<message>
<source>&amp;Copy Image</source>
- <translation type="unfinished">&amp;Copiar Imagen</translation>
+ <translation type="unfinished">&amp;Copiar imagen</translation>
</message>
<message>
<source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">URI resultante demasiado larga. Intente reducir el texto de la etiqueta / mensaje.</translation>
+ <translation type="unfinished">URI resultante demasiado largo. Intenta reducir el texto de la etiqueta o el mensaje.</translation>
</message>
<message>
<source>Error encoding URI into QR Code.</source>
@@ -2128,7 +2195,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>QR code support not available.</source>
- <translation type="unfinished">Soporte de código QR no disponible.</translation>
+ <translation type="unfinished">La compatibilidad con el código QR no está disponible.</translation>
</message>
<message>
<source>Save QR Code</source>
@@ -2155,12 +2222,20 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">&amp;Información</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation type="unfinished">Directorio de datos</translation>
+ </message>
+ <message>
<source>To specify a non-default location of the data directory use the '%1' option.</source>
- <translation type="unfinished">Para especificar una localización personalizada del directorio de datos, usa la opción «%1».</translation>
+ <translation type="unfinished">Para especificar una localización personalizada del directorio de datos, usa la opción "%1".</translation>
+ </message>
+ <message>
+ <source>Blocksdir</source>
+ <translation type="unfinished">Directorio de bloques</translation>
</message>
<message>
<source>To specify a non-default location of the blocks directory use the '%1' option.</source>
- <translation type="unfinished">Para especificar una localización personalizada del directorio de bloques, usa la opción «%1». </translation>
+ <translation type="unfinished">Para especificar una localización personalizada del directorio de bloques, usa la opción "%1". </translation>
</message>
<message>
<source>Startup time</source>
@@ -2184,7 +2259,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Memory Pool</source>
- <translation type="unfinished">Piscina de memoria</translation>
+ <translation type="unfinished">Pool de memoria</translation>
</message>
<message>
<source>Current number of transactions</source>
@@ -2216,7 +2291,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>&amp;Peers</source>
- <translation type="unfinished">&amp;Parejas</translation>
+ <translation type="unfinished">&amp;Pares</translation>
</message>
<message>
<source>Banned peers</source>
@@ -2227,16 +2302,32 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Selecciona un par para ver la información detallada.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versión de la capa de transporte: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Transporte</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Cadena de identificador de la sesión BIP324 en formato hexadecimal, si existe.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Identificador de sesión</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Versión</translation>
</message>
<message>
<source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">Retransmitimos transacciones a esta pareja.</translation>
+ <translation type="unfinished">Si retransmitimos las transacciones a este par.</translation>
</message>
<message>
<source>Transaction Relay</source>
- <translation type="unfinished">Relay de Transacción</translation>
+ <translation type="unfinished">Retransmisión de transacciones</translation>
</message>
<message>
<source>Starting Block</source>
@@ -2256,11 +2347,11 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>The mapped Autonomous System used for diversifying peer selection.</source>
- <translation type="unfinished">El Sistema Autónomo mapeado utilizado para la selección diversificada de pares.</translation>
+ <translation type="unfinished">El sistema autónomo asignado que se usó para diversificar la selección de pares.</translation>
</message>
<message>
<source>Mapped AS</source>
- <translation type="unfinished">SA Asignado</translation>
+ <translation type="unfinished">Sistema autónomo asignado</translation>
</message>
<message>
<source>Whether we relay addresses to this peer.</source>
@@ -2270,17 +2361,17 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>Address Relay</source>
<extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Transmisión de la dirección</translation>
+ <translation type="unfinished">Retransmisión de direcciones</translation>
</message>
<message>
<source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
<extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">El número total de direcciones recibidas desde este par que han sido procesadas (excluyendo las direcciones que han sido desestimadas debido a la limitación de velocidad).</translation>
+ <translation type="unfinished">El número total de direcciones recibidas desde este par que han sido procesadas (excluyendo las direcciones que han sido desestimadas debido a la limitación de volumen).</translation>
</message>
<message>
<source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
<extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">El número total de direcciones recibidas desde este par que han sido desestimadas (no procesadas) debido a la limitación de velocidad.</translation>
+ <translation type="unfinished">El número total de direcciones recibidas desde este par que han sido desestimadas (no procesadas) debido a la limitación de volumen.</translation>
</message>
<message>
<source>Addresses Processed</source>
@@ -2290,11 +2381,11 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>Addresses Rate-Limited</source>
<extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Direcciones con límite de proporción</translation>
+ <translation type="unfinished">Direcciones desestimadas por limitación de volumen</translation>
</message>
<message>
<source>User Agent</source>
- <translation type="unfinished">Agente del usuario</translation>
+ <translation type="unfinished">Agente de usuario</translation>
</message>
<message>
<source>Node window</source>
@@ -2306,7 +2397,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
- <translation type="unfinished">Abra el archivo de registro de depuración %1 del directorio de datos actual. Esto puede tomar unos segundos para archivos de registro grandes.</translation>
+ <translation type="unfinished">Abre el archivo de registro de depuración %1 del directorio de datos actual. Esto puede tomar unos segundos para archivos de registro grandes.</translation>
</message>
<message>
<source>Decrease font size</source>
@@ -2314,7 +2405,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Increase font size</source>
- <translation type="unfinished">Aumentar el tamaño de la tipografía</translation>
+ <translation type="unfinished">Aumentar el tamaño de la fuente</translation>
</message>
<message>
<source>Permissions</source>
@@ -2322,15 +2413,15 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>The direction and type of peer connection: %1</source>
- <translation type="unfinished">La dirección y tipo de conexión del par: %1</translation>
+ <translation type="unfinished">El sentido y el tipo de conexión entre pares: %1</translation>
</message>
<message>
<source>Direction/Type</source>
- <translation type="unfinished">Dirección/Tipo</translation>
+ <translation type="unfinished">Sentido/Tipo</translation>
</message>
<message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
- <translation type="unfinished">El protocolo de red de este par está conectado a través de: IPv4, IPv6, Onion, I2P, o CJDNS.</translation>
+ <translation type="unfinished">El protocolo de red de este par está conectado a través de: IPv4, IPv6, Onion, I2P o CJDNS.</translation>
</message>
<message>
<source>Services</source>
@@ -2338,7 +2429,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>High bandwidth BIP152 compact block relay: %1</source>
- <translation type="unfinished">Transmisión de bloque compacto BIP152 banda ancha: %1</translation>
+ <translation type="unfinished">Retransmisión de bloques compactos BIP152 en banda ancha: %1</translation>
</message>
<message>
<source>High Bandwidth</source>
@@ -2359,7 +2450,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
<extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
- <translation type="unfinished">Tiempo transcurrido desde que se recibió de este par una nueva transacción aceptada en nuestra piscina de memoria.</translation>
+ <translation type="unfinished">Tiempo transcurrido desde que se recibió de este par una nueva transacción aceptada en la mempool.</translation>
</message>
<message>
<source>Last Send</source>
@@ -2387,7 +2478,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Time Offset</source>
- <translation type="unfinished">Desplazamiento de tiempo</translation>
+ <translation type="unfinished">Desfase temporal</translation>
</message>
<message>
<source>Last block time</source>
@@ -2403,7 +2494,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>&amp;Network Traffic</source>
- <translation type="unfinished">&amp;Tráfico de Red</translation>
+ <translation type="unfinished">&amp;Tráfico de red</translation>
</message>
<message>
<source>Totals</source>
@@ -2415,7 +2506,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
</message>
<message>
<source>Clear console</source>
- <translation type="unfinished">Vaciar consola</translation>
+ <translation type="unfinished">Borrar consola</translation>
</message>
<message>
<source>In:</source>
@@ -2428,44 +2519,59 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>Inbound: initiated by peer</source>
<extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">Entrante: iniciado por el par</translation>
+ <translation type="unfinished">Entrante: iniciada por el par</translation>
</message>
<message>
<source>Outbound Full Relay: default</source>
<extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
- <translation type="unfinished">Retransmisión completa saliente: predeterminado</translation>
+ <translation type="unfinished">Retransmisión completa saliente: predeterminada</translation>
</message>
<message>
<source>Outbound Block Relay: does not relay transactions or addresses</source>
<extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">Retransmisión de bloques de salida: no transmite transacciones o direcciones</translation>
+ <translation type="unfinished">Retransmisión de bloque saliente: no retransmite transacciones o direcciones</translation>
</message>
<message>
<source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
<extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
- <translation type="unfinished">Manual de salida: añadido usando las opciones de configuración RPC %1 o %2/%3</translation>
+ <translation type="unfinished">Manual saliente: agregada usando las opciones de configuración %1 o %2/%3 de RPC</translation>
</message>
<message>
<source>Outbound Feeler: short-lived, for testing addresses</source>
<extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
- <translation type="unfinished">Tanteador de salida: de corta duración, para probar las direcciones</translation>
+ <translation type="unfinished">Sensor saliente: de corta duración para probar direcciones</translation>
</message>
<message>
<source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
<extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
- <translation type="unfinished">Búsqueda de direcciones de salida: de corta duración, para solicitar direcciones</translation>
+ <translation type="unfinished">Recuperación de direcciones saliente: de corta duración para solicitar direcciones</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Detectando: el par puede ser v1 o v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocolo de transporte de texto simple sin cifrar</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: protocolo de transporte cifrado BIP324</translation>
</message>
<message>
<source>we selected the peer for high bandwidth relay</source>
- <translation type="unfinished">hemos seleccionado el par para la retransmisión de banda ancha</translation>
+ <translation type="unfinished">Seleccionamos el par para la retransmisión de banda ancha</translation>
</message>
<message>
<source>the peer selected us for high bandwidth relay</source>
- <translation type="unfinished">El par nos ha seleccionado para transmisión de banda ancha</translation>
+ <translation type="unfinished">El par nos seleccionó para la retransmisión de banda ancha</translation>
</message>
<message>
<source>no high bandwidth relay selected</source>
- <translation type="unfinished">Ninguna transmisión de banda ancha seleccionada</translation>
+ <translation type="unfinished">No se seleccionó la retransmisión de banda ancha</translation>
</message>
<message>
<source>&amp;Copy address</source>
@@ -2495,7 +2601,7 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
- <translation type="unfinished">&amp;Copiar IP/Mascara de red</translation>
+ <translation type="unfinished">&amp;Copiar IP/Máscara de red</translation>
</message>
<message>
<source>&amp;Unban</source>
@@ -2510,8 +2616,12 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
- <translation type="unfinished">Ejecutar comando usando monedero «%1»</translation>
+ <translation type="unfinished">Ejecutar comando con el monedero "%1"</translation>
</message>
<message>
<source>Welcome to the %1 RPC console.
@@ -2522,21 +2632,22 @@ For more information on using this console, type %6.
%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
<extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
- <translation type="unfinished">Bienvenido a la consola RPC
-%1. Utiliza las flechas arriba y abajo para navegar por el historial, y %2 para borrar la pantalla.
-Utiliza %3 y %4 para aumentar o disminuir el tamaño de la tipografía.
-Escribe %5 para ver un resumen de las órdenes disponibles. Para más información sobre cómo usar esta consola, escribe %6.
+ <translation type="unfinished">Te damos la bienvenida a la consola RPC de %1.
+Utiliza las flechas hacia arriba y abajo para navegar por el historial y %2 para borrar la pantalla.
+Utiliza %3 y %4 para aumentar o disminuir el tamaño de la fuente.
+Escribe %5 para ver los comandos disponibles.
+Para obtener más información sobre cómo usar esta consola, escribe %6.
-%7 AVISO: Los estafadores han estado activos diciendo a los usuarios que escriban ordenes aquí, robando el contenido de sus monederos. No uses esta consola sin entender completamente las ramificaciones de una instrucción.%8</translation>
+%7 ADVERTENCIA: Los estafadores suelen decirles a los usuarios que escriban comandos aquí para robarles el contenido de sus monederos. No uses esta consola si no entiendes completamente las ramificaciones de un comando.%8</translation>
</message>
<message>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
- <translation type="unfinished">Ejecutando...</translation>
+ <translation type="unfinished">Ejecutando…</translation>
</message>
<message>
<source>(peer: %1)</source>
- <translation type="unfinished">(pareja: %1)</translation>
+ <translation type="unfinished">(par: %1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2548,15 +2659,15 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>To</source>
- <translation type="unfinished">Destino</translation>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>From</source>
- <translation type="unfinished">Origen</translation>
+ <translation type="unfinished">De</translation>
</message>
<message>
<source>Ban for</source>
- <translation type="unfinished">Bloqueo para</translation>
+ <translation type="unfinished">Bloqueo por</translation>
</message>
<message>
<source>Never</source>
@@ -2571,7 +2682,7 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
<name>ReceiveCoinsDialog</name>
<message>
<source>&amp;Amount:</source>
- <translation type="unfinished">&amp;Importe</translation>
+ <translation type="unfinished">&amp;Importe:</translation>
</message>
<message>
<source>&amp;Label:</source>
@@ -2579,11 +2690,11 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>&amp;Message:</source>
- <translation type="unfinished">&amp;Mensaje</translation>
+ <translation type="unfinished">&amp;Mensaje:</translation>
</message>
<message>
<source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
- <translation type="unfinished">Mensaje opcional para agregar a la solicitud de pago, el cual será mostrado cuando la solicitud esté abierta. Nota: El mensaje no se enviará con el pago a través de la red de Bitcoin.</translation>
+ <translation type="unfinished">Mensaje opcional para agregar a la solicitud de pago, el cual será mostrado cuando la solicitud esté abierta. Nota: el mensaje no se enviará con el pago a través de la red de Bitcoin.</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address.</source>
@@ -2591,7 +2702,7 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">Usa este formulario para solicitar un pago. Todos los campos son &lt;b&gt;opcionales&lt;/b&gt;.</translation>
+ <translation type="unfinished">Usa este formulario para solicitar un pago. Todos los campos son &lt;b&gt;opcional&lt;/b&gt;.</translation>
</message>
<message>
<source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
@@ -2599,7 +2710,7 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
- <translation type="unfinished">Etiqueta opcional para asociar con la nueva dirección de recepción (utilizado por ti para identificar una factura). También esta asociado a la solicitud de pago.</translation>
+ <translation type="unfinished">Etiqueta opcional para asociar con la nueva dirección de recepción (puedes usarla para identificar una factura). También esta asociada a la solicitud de pago.</translation>
</message>
<message>
<source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
@@ -2607,15 +2718,15 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>&amp;Create new receiving address</source>
- <translation type="unfinished">&amp;Crear una nueva dirección de recepción</translation>
+ <translation type="unfinished">&amp;Crear nueva dirección de recepción</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation type="unfinished">Purga todos los campos del formulario.</translation>
+ <translation type="unfinished">Borrar todos los campos del formulario.</translation>
</message>
<message>
<source>Clear</source>
- <translation type="unfinished">Vaciar</translation>
+ <translation type="unfinished">Borrar</translation>
</message>
<message>
<source>Requested payments history</source>
@@ -2623,7 +2734,7 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>Show the selected request (does the same as double clicking an entry)</source>
- <translation type="unfinished">Mostrar la solicitud seleccionada (hace lo mismo que hacer doble clic en una entrada)</translation>
+ <translation type="unfinished">Mostrar la solicitud seleccionada (equivale a hacer doble clic en una entrada)</translation>
</message>
<message>
<source>Show</source>
@@ -2663,15 +2774,15 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>Generates an address compatible with older wallets.</source>
- <translation type="unfinished">Genera una dirección compatible con billeteras más antiguas.</translation>
+ <translation type="unfinished">Genera una dirección compatible con monederos más antiguos.</translation>
</message>
<message>
<source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
- <translation type="unfinished">Genera una dirección segwit nativa (BIP-173). No es compatible con algunas billeteras antiguas.</translation>
+ <translation type="unfinished">Genera una dirección segwit nativa (BIP-173). No es compatible con algunos monederos antiguos.</translation>
</message>
<message>
<source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
- <translation type="unfinished">Bech32m (BIP-350) es una actualización de Bech32. La compatibilidad con la billetera todavía es limitada.</translation>
+ <translation type="unfinished">Bech32m (BIP-350) es una actualización de Bech32. La compatibilidad con el monedero todavía es limitada.</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
@@ -2679,7 +2790,7 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>Could not generate new %1 address</source>
- <translation type="unfinished">No se ha podido generar una nueva dirección %1</translation>
+ <translation type="unfinished">No se ha podido generar una dirección %1 nueva</translation>
</message>
</context>
<context>
@@ -2722,11 +2833,11 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">Verifica esta dirección en la pantalla de tu monedero frío u otro dispositivo</translation>
+ <translation type="unfinished">Verifica esta dirección, por ejemplo, en la pantalla de un monedero de hardware.</translation>
</message>
<message>
<source>&amp;Save Image…</source>
- <translation type="unfinished">&amp;Guardar imagen...</translation>
+ <translation type="unfinished">&amp;Guardar imagen…</translation>
</message>
<message>
<source>Payment information</source>
@@ -2776,7 +2887,7 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>Coin Control Features</source>
- <translation type="unfinished">Características de control de moneda</translation>
+ <translation type="unfinished">Funciones de control de monedas</translation>
</message>
<message>
<source>automatically selected</source>
@@ -2800,7 +2911,7 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>After Fee:</source>
- <translation type="unfinished">Después de la comisión:</translation>
+ <translation type="unfinished">Tras la comisión:</translation>
</message>
<message>
<source>Change:</source>
@@ -2808,7 +2919,7 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
- <translation type="unfinished">Al activarse, si la dirección esta vacía o es inválida, las monedas serán enviadas a una nueva dirección generada.</translation>
+ <translation type="unfinished">Si se activa, pero la dirección de cambio está vacía o es inválida, el cambio se enviará a una dirección generada recientemente.</translation>
</message>
<message>
<source>Custom change address</source>
@@ -2820,7 +2931,7 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
- <translation type="unfinished">Si utilizas la comisión por defecto, la transacción puede tardar varias horas o incluso días (o nunca) en confirmarse. Considera elegir la comisión de forma manual o espera hasta que se haya validado completamente la cadena.</translation>
+ <translation type="unfinished">Si usas la opción "fallbackfee", la transacción puede tardar varias horas o días en confirmarse (o nunca hacerlo). Considera elegir la comisión de forma manual o espera hasta que hayas validado la cadena completa.</translation>
</message>
<message>
<source>Warning: Fee estimation is currently not possible.</source>
@@ -2832,7 +2943,7 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>Hide</source>
- <translation type="unfinished">Ocultar </translation>
+ <translation type="unfinished">Ocultar</translation>
</message>
<message>
<source>Recommended:</source>
@@ -2848,23 +2959,19 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
</message>
<message>
<source>Add &amp;Recipient</source>
- <translation type="unfinished">Agrega &amp;destinatario</translation>
+ <translation type="unfinished">Agregar &amp;destinatario</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
- <translation type="unfinished">Purga todos los campos del formulario.</translation>
+ <translation type="unfinished">Borrar todos los campos del formulario.</translation>
</message>
<message>
<source>Inputs…</source>
- <translation type="unfinished">Entradas...</translation>
- </message>
- <message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
+ <translation type="unfinished">Entradas…</translation>
</message>
<message>
<source>Choose…</source>
- <translation type="unfinished">Elegir...</translation>
+ <translation type="unfinished">Elegir…</translation>
</message>
<message>
<source>Hide transaction fee settings</source>
@@ -2874,21 +2981,21 @@ Escribe %5 para ver un resumen de las órdenes disponibles. Para más informaci
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">Especifica una comisión personalizada por kB (1.000 bytes) del tamaño virtual de la transacción.
+ <translation type="unfinished">Especifica una comisión personalizada por kB (1000 bytes) del tamaño virtual de la transacción.
-Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis por kvB» para una transacción de 500 bytes virtuales (la mitad de 1 kvB), supondría finalmente una comisión de sólo 50 satoshis.</translation>
+Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por kvB" para una transacción de 500 bytes virtuales (la mitad de 1 kvB) supondría finalmente una comisión de solo 50 satoshis.</translation>
</message>
<message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
- <translation type="unfinished">Cuando hay menos volumen de transacciones que espacio en los bloques, los mineros y los nodos de retransmisión pueden imponer una comisión mínima. Pagar solo esta comisión mínima está bien, pero tenga en cuenta que esto puede resultar en una transacción nunca confirmada una vez que haya más demanda de transacciones de Bitcoin de la que la red puede procesar.</translation>
+ <translation type="unfinished">Cuando hay menos volumen de transacciones que espacio en los bloques, los mineros y los nodos de retransmisión pueden aplicar una comisión mínima. Está bien pagar solo esta comisión mínima, pero ten en cuenta que esto puede ocasionar que una transacción nunca se confirme una vez que haya más demanda de transacciones de Bitcoin de la que puede procesar la red.</translation>
</message>
<message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
- <translation type="unfinished">Una comisión demasiado pequeña puede resultar en una transacción que nunca será confirmada (leer herramientas de información).</translation>
+ <translation type="unfinished">Si la comisión es demasiado baja, es posible que la transacción nunca se confirme (leer la información en pantalla).</translation>
</message>
<message>
<source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
- <translation type="unfinished">(Comisión inteligente no inicializada todavía. Esto normalmente tarda unos pocos bloques…)</translation>
+ <translation type="unfinished">(La comisión inteligente no se ha inicializado todavía. Esto tarda normalmente algunos bloques…)</translation>
</message>
<message>
<source>Confirmation time target:</source>
@@ -2896,15 +3003,15 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Enable Replace-By-Fee</source>
- <translation type="unfinished">Habilitar Replace-By-Fee</translation>
+ <translation type="unfinished">Activar "Reemplazar por comisión"</translation>
</message>
<message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
- <translation type="unfinished">Con Replace-By-Fee (BIP-125) puede incrementar la comisión después de haber enviado la transacción. Si no utiliza esto, se recomienda que añada una comisión mayor para compensar el riesgo adicional de que la transacción se retrase.</translation>
+ <translation type="unfinished">Con la función "Reemplazar por comisión" (BIP-125), puedes aumentar la comisión de una transacción después de enviarla. Sin esta, es posible que se recomiende una comisión más alta para compensar el mayor riesgo de retraso de la transacción.</translation>
</message>
<message>
<source>Clear &amp;All</source>
- <translation type="unfinished">Purgar &amp;todo</translation>
+ <translation type="unfinished">Borrar &amp;todo</translation>
</message>
<message>
<source>Balance:</source>
@@ -2932,17 +3039,13 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Copy after fee</source>
- <translation type="unfinished">Copiar después de la comisión</translation>
+ <translation type="unfinished">Copiar tras comisión</translation>
</message>
<message>
<source>Copy bytes</source>
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar polvo</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
@@ -2953,32 +3056,28 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<message>
<source>Sign on device</source>
<extracomment>"device" usually means a hardware wallet.</extracomment>
- <translation type="unfinished">Iniciar sesión en el dispositivo</translation>
+ <translation type="unfinished">Firmar en el dispositivo</translation>
</message>
<message>
<source>Connect your hardware wallet first.</source>
- <translation type="unfinished">Conecta tu monedero externo primero.</translation>
+ <translation type="unfinished">Conecta primero tu monedero de hardware.</translation>
</message>
<message>
<source>Set external signer script path in Options -&gt; Wallet</source>
<extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Configura una ruta externa al script en Opciones → Monedero</translation>
+ <translation type="unfinished">Establecer la ruta al script del firmante externo en "Opciones -&gt; Monedero"</translation>
</message>
<message>
<source>Cr&amp;eate Unsigned</source>
- <translation type="unfinished">Cr&amp;ear sin firmar</translation>
+ <translation type="unfinished">&amp;Crear sin firmar</translation>
</message>
<message>
<source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">Crea una Transacción de Bitcoin Parcialmente Firmada (TBPF) para uso con p.ej. un monedero fuera de linea %1, o un monedero de hardware compatible con TBPF</translation>
- </message>
- <message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde monedero «%1»</translation>
+ <translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (TBPF) para usarla, por ejemplo, con un monedero %1 sin conexión o un monedero de hardware compatible con TBPF.</translation>
</message>
<message>
<source>%1 to '%2'</source>
- <translation type="unfinished">%1 a «%2»</translation>
+ <translation type="unfinished">%1 a "%2"</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2986,21 +3085,21 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>To review recipient list click "Show Details…"</source>
- <translation type="unfinished">Para ver la lista de receptores haga clic en «Mostrar detalles...»</translation>
+ <translation type="unfinished">Para consultar la lista de destinatarios, haz clic en "Mostrar detalles..."</translation>
</message>
<message>
<source>Sign failed</source>
- <translation type="unfinished">La firma falló</translation>
+ <translation type="unfinished">Error de firma</translation>
</message>
<message>
<source>External signer not found</source>
<extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Dispositivo externo de firma no encontrado</translation>
+ <translation type="unfinished">No se encontró el dispositivo firmante externo</translation>
</message>
<message>
<source>External signer failure</source>
<extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Dispositivo externo de firma no encontrado</translation>
+ <translation type="unfinished">Error de firmante externo</translation>
</message>
<message>
<source>Save Transaction Data</source>
@@ -3009,12 +3108,12 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Transacción parcialmente firmada (binario) </translation>
+ <translation type="unfinished">Transacción parcialmente firmada (binario)</translation>
</message>
<message>
<source>PSBT saved</source>
<extracomment>Popup message when a PSBT has been saved to a file</extracomment>
- <translation type="unfinished">TBPF guardado </translation>
+ <translation type="unfinished">TBPF guardada</translation>
</message>
<message>
<source>External balance:</source>
@@ -3026,12 +3125,16 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
- <translation type="unfinished">Puede incrementar la comisión más tarde (use Replace-By-Fee, BIP-125).</translation>
+ <translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar por comisión", BIP-125).</translation>
</message>
<message>
<source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
- <translation type="unfinished">Por favor, revisa tu propuesta de transacción. Esto producirá una Transacción de Bitcoin Parcialmente Firmada (TBPF) que puedes guardar o copiar y después firmar p.ej. un monedero fuera de línea %1, o un monedero de hardware compatible con TBPF.</translation>
+ <translation type="unfinished">Revisa por favor la propuesta de transacción. Esto producirá una transacción de Bitcoin parcialmente firmada (TBPF) que puedes guardar o copiar y, luego, firmar; por ejemplo, con un monedero %1 fuera de línea o un monedero de hardware compatible con TBPF.</translation>
+ </message>
+ <message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde el monedero "%2"</translation>
</message>
<message>
<source>Do you want to create this transaction?</source>
@@ -3041,20 +3144,20 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<message>
<source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">Por favor, revisa tu transacción. Puedes crear y enviar esta transacción o crear una Transacción Bitcoin Parcialmente Firmada (TBPF), que puedes guardar o copiar y luego firmar con, por ejemplo, un monedero %1 offline o un monedero hardware compatible con TBPF.</translation>
+ <translation type="unfinished">Revisa por favor la transacción. Puedes crear y enviar esta transacción de Bitcoin parcialmente firmada (TBPF), que además puedes guardar o copiar y, luego, firmar; por ejemplo, con un monedero %1 sin conexión o un monedero de hardware compatible con TBPF.</translation>
</message>
<message>
<source>Please, review your transaction.</source>
<extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
- <translation type="unfinished">Por favor, revisa tu transacción</translation>
+ <translation type="unfinished">Revisa la transacción.</translation>
</message>
<message>
<source>Transaction fee</source>
- <translation type="unfinished">Comisión por transacción.</translation>
+ <translation type="unfinished">Comisión de transacción</translation>
</message>
<message>
<source>Not signalling Replace-By-Fee, BIP-125.</source>
- <translation type="unfinished">No usa Replace-By-Fee, BIP-125.</translation>
+ <translation type="unfinished">No indica "Reemplazar por comisión", BIP-125.</translation>
</message>
<message>
<source>Total Amount</source>
@@ -3064,15 +3167,15 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
- <translation type="unfinished">Transacción no asignada</translation>
+ <translation type="unfinished">Transacción sin firmar</translation>
</message>
<message>
<source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">Se ha copiado la PSBT al portapapeles. También puedes guardarla.</translation>
+ <translation type="unfinished">Se ha copiado la TBPF al portapapeles. También puedes guardarla.</translation>
</message>
<message>
<source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT guardada en el disco</translation>
+ <translation type="unfinished">TBPF guardada en disco</translation>
</message>
<message>
<source>Confirm send coins</source>
@@ -3080,27 +3183,27 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Watch-only balance:</source>
- <translation type="unfinished">Balance solo observación:</translation>
+ <translation type="unfinished">Saldo solo de observación:</translation>
</message>
<message>
<source>The recipient address is not valid. Please recheck.</source>
- <translation type="unfinished">La dirección de envío no es válida. Por favor revísela.</translation>
+ <translation type="unfinished">La dirección del destinatario no es válida. Revísala.</translation>
</message>
<message>
<source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">El importe a pagar debe ser mayor que 0.</translation>
+ <translation type="unfinished">El importe por pagar tiene que ser mayor que 0.</translation>
</message>
<message>
<source>The amount exceeds your balance.</source>
- <translation type="unfinished">El importe sobrepasa su saldo.</translation>
+ <translation type="unfinished">El importe sobrepasa el saldo.</translation>
</message>
<message>
<source>The total exceeds your balance when the %1 transaction fee is included.</source>
- <translation type="unfinished">El total sobrepasa su saldo cuando se incluye la comisión de envío de %1.</translation>
+ <translation type="unfinished">El total sobrepasa el saldo cuando se incluye la comisión de transacción de %1.</translation>
</message>
<message>
<source>Duplicate address found: addresses should only be used once each.</source>
- <translation type="unfinished">Dirección duplicada encontrada: las direcciones sólo deben ser utilizadas una vez.</translation>
+ <translation type="unfinished">Se encontró una dirección duplicada: las direcciones solo se deben usar una vez.</translation>
</message>
<message>
<source>Transaction creation failed!</source>
@@ -3108,22 +3211,22 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation type="unfinished">Una comisión mayor que %1 se considera como una comisión absurdamente alta.</translation>
+ <translation type="unfinished">Una comisión mayor que %1 se considera absurdamente alta.</translation>
</message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>Estimado para comenzar confirmación dentro de %n bloque.</numerusform>
- <numerusform>Estimado para comenzar confirmación dentro de %n bloques.</numerusform>
+ <numerusform>Se estima que empiece a confirmarse dentro de %n bloque.</numerusform>
+ <numerusform>Se estima que empiece a confirmarse dentro de %n bloques.</numerusform>
</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
- <translation type="unfinished">Alerta: Dirección de Bitcoin inválida</translation>
+ <translation type="unfinished">Advertencia: Dirección de Bitcoin no válida</translation>
</message>
<message>
<source>Warning: Unknown change address</source>
- <translation type="unfinished">Alerta: Dirección de cambio desconocida</translation>
+ <translation type="unfinished">Advertencia: Dirección de cambio desconocida</translation>
</message>
<message>
<source>Confirm custom change address</source>
@@ -3131,7 +3234,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
- <translation type="unfinished">La dirección que ha seleccionado para el cambio no es parte de su monedero. Parte o todos sus fondos pueden ser enviados a esta dirección. ¿Está seguro?</translation>
+ <translation type="unfinished">La dirección que seleccionaste para el cambio no es parte de este monedero. Una parte o la totalidad de los fondos en el monedero se enviará a esta dirección. ¿Seguro deseas continuar?</translation>
</message>
<message>
<source>(no label)</source>
@@ -3142,7 +3245,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<name>SendCoinsEntry</name>
<message>
<source>A&amp;mount:</source>
- <translation type="unfinished">I&amp;mporte:</translation>
+ <translation type="unfinished">&amp;Importe:</translation>
</message>
<message>
<source>Pay &amp;To:</source>
@@ -3154,11 +3257,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Choose previously used address</source>
- <translation type="unfinished">Escoger una dirección previamente usada</translation>
+ <translation type="unfinished">Escoger una dirección usada anteriormente</translation>
</message>
<message>
<source>The Bitcoin address to send the payment to</source>
- <translation type="unfinished">Dirección Bitcoin a la que se enviará el pago</translation>
+ <translation type="unfinished">La dirección de Bitcoin a la que se enviará el pago</translation>
</message>
<message>
<source>Paste address from clipboard</source>
@@ -3166,19 +3269,19 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Remove this entry</source>
- <translation type="unfinished">Quitar esta entrada</translation>
+ <translation type="unfinished">Eliminar esta entrada</translation>
</message>
<message>
<source>The amount to send in the selected unit</source>
- <translation type="unfinished">El importe a enviar en la unidad seleccionada</translation>
+ <translation type="unfinished">El importe que se enviará en la unidad seleccionada</translation>
</message>
<message>
<source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
- <translation type="unfinished">La comisión será deducida de la cantidad enviada. El destinatario recibirá menos bitcoins que la cantidad introducida en el campo Importe. Si hay varios destinatarios seleccionados, la comisión será distribuida a partes iguales.</translation>
+ <translation type="unfinished">La comisión se deducirá del monto del envío. El destinatario recibirá menos bitcoins que los que ingreses en el campo de cantidad. Si se seleccionan varios destinatarios, la comisión se divide por igual.</translation>
</message>
<message>
<source>S&amp;ubtract fee from amount</source>
- <translation type="unfinished">S&amp;ustraer comisión del importe.</translation>
+ <translation type="unfinished">&amp;Sustraer la comisión del importe</translation>
</message>
<message>
<source>Use available balance</source>
@@ -3190,11 +3293,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Enter a label for this address to add it to the list of used addresses</source>
- <translation type="unfinished">Introduce una etiqueta para esta dirección para añadirla a la lista de direcciones utilizadas</translation>
+ <translation type="unfinished">Ingresar una etiqueta para esta dirección a fin de agregarla a la lista de direcciones utilizadas</translation>
</message>
<message>
<source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
- <translation type="unfinished">Mensaje que se agrgará al URI de Bitcoin, el cuál será almacenado con la transacción para su referencia. Nota: Este mensaje no será enviado a través de la red de Bitcoin.</translation>
+ <translation type="unfinished">Un mensaje adjunto al URI de tipo "bitcoin:" que se almacenará con la transacción a modo de referencia. Nota: Este mensaje no se enviará por la red de Bitcoin.</translation>
</message>
</context>
<context>
@@ -3212,7 +3315,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<name>SignVerifyMessageDialog</name>
<message>
<source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">Firmas - Firmar / verificar un mensaje</translation>
+ <translation type="unfinished">Firmas: firmar o verificar un mensaje</translation>
</message>
<message>
<source>&amp;Sign Message</source>
@@ -3220,15 +3323,15 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
- <translation type="unfinished">Puedes firmar los mensajes con tus direcciones para demostrar que las posees. Ten cuidado de no firmar cualquier cosa vaga, ya que los ataques de phishing pueden tratar de engañarte firmando tu identidad a través de ellos. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
+ <translation type="unfinished">Puedes firmar mensajes o acuerdos con tus direcciones para demostrar que puedes recibir los bitcoins que se envíen a ellas. Ten cuidado de no firmar cosas confusas o al azar, ya que los ataques de phishing pueden tratar de engañarte para que les envíes la firma con tu identidad. Firma solo declaraciones totalmente detalladas con las que estés de acuerdo.</translation>
</message>
<message>
<source>The Bitcoin address to sign the message with</source>
- <translation type="unfinished">La dirección Bitcoin con la que se firmó el mensaje</translation>
+ <translation type="unfinished">La dirección de Bitcoin con la que se firmará el mensaje</translation>
</message>
<message>
<source>Choose previously used address</source>
- <translation type="unfinished">Escoger una dirección previamente usada</translation>
+ <translation type="unfinished">Escoger una dirección usada anteriormente</translation>
</message>
<message>
<source>Paste address from clipboard</source>
@@ -3244,11 +3347,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Copy the current signature to the system clipboard</source>
- <translation type="unfinished">Copiar la firma actual al portapapeles del sistema</translation>
+ <translation type="unfinished">Copiar la dirección seleccionada actualmente al portapapeles del sistema</translation>
</message>
<message>
<source>Sign the message to prove you own this Bitcoin address</source>
- <translation type="unfinished">Firmar un mensaje para demostrar que se posee una dirección Bitcoin</translation>
+ <translation type="unfinished">Firmar el mensaje para demostrar que esta dirección de Bitcoin te pertenece</translation>
</message>
<message>
<source>Sign &amp;Message</source>
@@ -3256,11 +3359,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Reset all sign message fields</source>
- <translation type="unfinished">Limpiar todos los campos de la firma de mensaje</translation>
+ <translation type="unfinished">Restablecer todos los campos de firma de mensaje</translation>
</message>
<message>
<source>Clear &amp;All</source>
- <translation type="unfinished">Limpiar &amp;todo</translation>
+ <translation type="unfinished">Borrar &amp;todo</translation>
</message>
<message>
<source>&amp;Verify Message</source>
@@ -3268,11 +3371,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
- <translation type="unfinished">Introduzca la dirección para la firma, el mensaje (asegurándose de copiar tal cual los saltos de línea, espacios, tabulaciones, etc.) y la firma a continuación para verificar el mensaje. Tenga cuidado de no asumir más información de lo que dice el propio mensaje firmado para evitar fraudes basados en ataques de tipo man-in-the-middle. Tenga en cuenta que esto solo prueba que la parte firmante recibe con esta dirección, ¡no puede probar el envío de ninguna transacción!</translation>
+ <translation type="unfinished">Ingresa la dirección del destinatario, el mensaje (recuerda copiar los saltos de línea, espacios, tabulaciones, etc. con exactitud) y la firma a continuación para verificar el mensaje. Ten cuidado de no leer en la firma más de lo que contiene el propio mensaje firmado, para evitar ser víctima de un engaño por ataque de intermediario. Ten en cuenta que esto solo prueba que la parte firmante recibe con esta dirección; no puede demostrar la condición de remitente de ninguna transacción.</translation>
</message>
<message>
<source>The Bitcoin address the message was signed with</source>
- <translation type="unfinished">Dirección Bitcoin con la que firmar el mensaje</translation>
+ <translation type="unfinished">La dirección de Bitcoin con la que se firmó el mensaje</translation>
</message>
<message>
<source>The signed message to verify</source>
@@ -3284,7 +3387,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
- <translation type="unfinished">Verifique el mensaje para comprobar que fue firmado con la dirección Bitcoin indicada</translation>
+ <translation type="unfinished">Verifica el mensaje para asegurarte de que se firmó con la dirección de Bitcoin especificada.</translation>
</message>
<message>
<source>Verify &amp;Message</source>
@@ -3292,19 +3395,19 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Reset all verify message fields</source>
- <translation type="unfinished">Limpiar todos los campos de la verificación de mensaje</translation>
+ <translation type="unfinished">Restablecer todos los campos de verificación de mensaje</translation>
</message>
<message>
<source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">Haga clic en «Firmar mensaje» para generar la firma</translation>
+ <translation type="unfinished">Hacer clic en "Firmar mensaje" para generar una firma</translation>
</message>
<message>
<source>The entered address is invalid.</source>
- <translation type="unfinished">La dirección introducida es inválida</translation>
+ <translation type="unfinished">La dirección introducida no es válida.</translation>
</message>
<message>
<source>Please check the address and try again.</source>
- <translation type="unfinished">Por favor, revise la dirección e inténtelo nuevamente.</translation>
+ <translation type="unfinished">Revisa la dirección e intenta de nuevo.</translation>
</message>
<message>
<source>The entered address does not refer to a key.</source>
@@ -3324,7 +3427,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Message signing failed.</source>
- <translation type="unfinished">Falló la firma del mensaje.</translation>
+ <translation type="unfinished">Error al firmar el mensaje.</translation>
</message>
<message>
<source>Message signed.</source>
@@ -3336,15 +3439,15 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Please check the signature and try again.</source>
- <translation type="unfinished">Por favor, compruebe la firma e inténtelo de nuevo.</translation>
+ <translation type="unfinished">Comprueba la firma e intenta de nuevo.</translation>
</message>
<message>
<source>The signature did not match the message digest.</source>
- <translation type="unfinished">La firma no coincide con el resumen del mensaje.</translation>
+ <translation type="unfinished">La firma no coincide con la síntesis del mensaje.</translation>
</message>
<message>
<source>Message verification failed.</source>
- <translation type="unfinished">Falló la verificación del mensaje.</translation>
+ <translation type="unfinished">Error al verificar el mensaje.</translation>
</message>
<message>
<source>Message verified.</source>
@@ -3359,7 +3462,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>press q to shutdown</source>
- <translation type="unfinished">pulse q para apagar</translation>
+ <translation type="unfinished">Presionar q para apagar </translation>
</message>
</context>
<context>
@@ -3372,12 +3475,12 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<message>
<source>0/unconfirmed, in memory pool</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
- <translation type="unfinished">0/sin confirmar, en la piscina de memoria</translation>
+ <translation type="unfinished">0/sin confirmar, en el pool de memoria</translation>
</message>
<message>
<source>0/unconfirmed, not in memory pool</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
- <translation type="unfinished">0/sin confirmar, no en la piscina de memoria</translation>
+ <translation type="unfinished">0/sin confirmar, no está en el pool de memoria</translation>
</message>
<message>
<source>abandoned</source>
@@ -3412,7 +3515,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>From</source>
- <translation type="unfinished">Remite</translation>
+ <translation type="unfinished">De</translation>
</message>
<message>
<source>unknown</source>
@@ -3420,7 +3523,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>To</source>
- <translation type="unfinished">Destino</translation>
+ <translation type="unfinished">A</translation>
</message>
<message>
<source>own address</source>
@@ -3428,7 +3531,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">Solo observación</translation>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>label</source>
@@ -3441,8 +3544,8 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>disponible en %n bloque</numerusform>
- <numerusform>disponible en %n bloques</numerusform>
+ <numerusform>madura en %n bloque más</numerusform>
+ <numerusform>madura en %n bloques más</numerusform>
</translation>
</message>
<message>
@@ -3463,7 +3566,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Transaction fee</source>
- <translation type="unfinished">Comisión por transacción.</translation>
+ <translation type="unfinished">Comisión de transacción</translation>
</message>
<message>
<source>Net amount</source>
@@ -3479,23 +3582,23 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Transaction ID</source>
- <translation type="unfinished">ID transacción</translation>
+ <translation type="unfinished">ID de transacción</translation>
</message>
<message>
<source>Transaction total size</source>
- <translation type="unfinished">Tamaño total transacción</translation>
+ <translation type="unfinished">Tamaño total de transacción</translation>
</message>
<message>
<source>Transaction virtual size</source>
- <translation type="unfinished">Tamaño virtual transacción</translation>
+ <translation type="unfinished">Tamaño virtual de transacción</translation>
</message>
<message>
<source>Output index</source>
<translation type="unfinished">Índice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (No se ha verificado el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3503,7 +3606,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
- <translation type="unfinished">Las monedas generadas deben madurar %1 bloques antes de que puedan ser gastadas. Una vez que generas este bloque, es propagado por la red para ser añadido a la cadena de bloques. Si falla el intento de añadirse en la cadena, su estado cambiará a «no aceptado» y ya no se puede gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a los pocos segundos del tuyo.</translation>
+ <translation type="unfinished">Las monedas generadas deben madurar %1 bloques antes de que se puedan gastar. Cuando generaste este bloque, se transmitió a la red para agregarlo a la cadena de bloques. Si no logra entrar a la cadena, su estado cambiará a "no aceptado" y no se podrá gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a pocos segundos del tuyo.</translation>
</message>
<message>
<source>Debug information</source>
@@ -3577,7 +3680,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Immature (%1 confirmations, will be available after %2)</source>
- <translation type="unfinished">No disponible (%1 confirmaciones, disponible después de %2)</translation>
+ <translation type="unfinished">Inmadura (%1 confirmaciones; estará disponibles después de %2)</translation>
</message>
<message>
<source>Generated but not accepted</source>
@@ -3596,16 +3699,12 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<translation type="unfinished">Enviado a</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pago a mi mismo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">Solo observación</translation>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>(n/a)</source>
@@ -3617,11 +3716,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation type="unfinished">Estado de transacción. Pasa el ratón sobre este campo para ver el número de confirmaciones.</translation>
+ <translation type="unfinished">Estado de la transacción. Pasa el ratón sobre este campo para ver el número de confirmaciones.</translation>
</message>
<message>
<source>Date and time that the transaction was received.</source>
- <translation type="unfinished">Fecha y hora cuando se recibió la transacción.</translation>
+ <translation type="unfinished">Fecha y hora en las que se recibió la transacción.</translation>
</message>
<message>
<source>Type of transaction.</source>
@@ -3629,15 +3728,15 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished">Si una dirección de solo observación está involucrada en esta transacción o no.</translation>
+ <translation type="unfinished">Si una dirección solo de observación está involucrada en esta transacción o no.</translation>
</message>
<message>
<source>User-defined intent/purpose of the transaction.</source>
- <translation type="unfinished">Descripción de la transacción definida por el usuario.</translation>
+ <translation type="unfinished">Intención o propósito de la transacción definidos por el usuario.</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
- <translation type="unfinished">Importe sustraído o añadido al balance.</translation>
+ <translation type="unfinished">Importe restado del saldo o sumado a este.</translation>
</message>
</context>
<context>
@@ -3675,10 +3774,6 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
<translation type="unfinished">Enviado a</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">A ti mismo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
@@ -3688,7 +3783,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Enter address, transaction id, or label to search</source>
- <translation type="unfinished">Introduzca dirección, id de transacción o etiqueta a buscar</translation>
+ <translation type="unfinished">Ingresar la dirección, el identificador de transacción o la etiqueta para buscar</translation>
</message>
<message>
<source>Min amount</source>
@@ -3716,7 +3811,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Copy &amp;raw transaction</source>
- <translation type="unfinished">Copiar transacción en c&amp;rudo</translation>
+ <translation type="unfinished">Copiar transacción &amp;sin procesar</translation>
</message>
<message>
<source>Copy full transaction &amp;details</source>
@@ -3732,7 +3827,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>A&amp;bandon transaction</source>
- <translation type="unfinished">A&amp;bandonar transacción</translation>
+ <translation type="unfinished">&amp;Abandonar transacción</translation>
</message>
<message>
<source>&amp;Edit address label</source>
@@ -3758,7 +3853,7 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Watch-only</source>
- <translation type="unfinished">Solo observación</translation>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>Date</source>
@@ -3778,11 +3873,11 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Exportación errónea</translation>
+ <translation type="unfinished">Error al exportar</translation>
</message>
<message>
<source>There was an error trying to save the transaction history to %1.</source>
- <translation type="unfinished">Ha habido un error al intentar guardar en el histórico la transacción con %1.</translation>
+ <translation type="unfinished">Ocurrió un error al intentar guardar el historial de transacciones en %1.</translation>
</message>
<message>
<source>Exporting Successful</source>
@@ -3808,16 +3903,16 @@ Nota: Dado que la comisión se calcula por cada byte, una tasa de «100 satoshis
Go to File &gt; Open Wallet to load a wallet.
- OR -</source>
<translation type="unfinished">No se ha cargado ningún monedero.
-Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
+Ve a "Archivo &gt; Abrir monedero" para cargar uno.
- O -</translation>
</message>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Crea un monedero nuevo</translation>
+ <translation type="unfinished">Crear monedero nuevo</translation>
</message>
<message>
<source>Unable to decode PSBT from clipboard (invalid base64)</source>
- <translation type="unfinished">No se puede decodificar TBPF desde el portapapeles (inválido base64)</translation>
+ <translation type="unfinished">No se puede decodificar la TBPF desde el portapapeles (Base64 inválida)</translation>
</message>
<message>
<source>Load Transaction Data</source>
@@ -3825,7 +3920,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Partially Signed Transaction (*.psbt)</source>
- <translation type="unfinished">Transacción firmada de manera parcial (*.psbt)</translation>
+ <translation type="unfinished">Transacción parcialmente firmada (*.psbt)</translation>
</message>
<message>
<source>PSBT file must be smaller than 100 MiB</source>
@@ -3833,7 +3928,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Unable to decode PSBT</source>
- <translation type="unfinished">No es posible descodificar TBPF</translation>
+ <translation type="unfinished">No es posible descodificar la TBPF</translation>
</message>
</context>
<context>
@@ -3853,7 +3948,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
<message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
- <translation type="unfinished">¿Desea incrementar la comisión?</translation>
+ <translation type="unfinished">¿Deseas incrementar la comisión?</translation>
</message>
<message>
<source>Current fee:</source>
@@ -3869,7 +3964,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
- <translation type="unfinished">Advertencia: Esto puede pagar la comisión adicional al reducir el cambio de salidas o agregar entradas, cuando sea necesario. Puede agregar una nueva salida de cambio si aún no existe. Potencialmente estos cambios pueden comprometer la privacidad.</translation>
+ <translation type="unfinished">Advertencia: Esta acción puede pagar la comisión adicional al reducir las salidas de cambio o agregar entradas, cuando sea necesario. Asimismo, puede agregar una nueva salida de cambio si aún no existe una. Estos cambios pueden filtrar potencialmente información privada.</translation>
</message>
<message>
<source>Confirm fee bump</source>
@@ -3890,7 +3985,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Can't sign transaction.</source>
- <translation type="unfinished">No se ha podido firmar la transacción.</translation>
+ <translation type="unfinished">No puede firmar la transacción.</translation>
</message>
<message>
<source>Could not commit transaction</source>
@@ -3898,11 +3993,11 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Can't display address</source>
- <translation type="unfinished">No se puede mostrar la dirección</translation>
+ <translation type="unfinished">No puede mostrar la dirección</translation>
</message>
<message>
<source>default wallet</source>
- <translation type="unfinished">Monedero predeterminado</translation>
+ <translation type="unfinished">monedero predeterminado</translation>
</message>
</context>
<context>
@@ -3913,7 +4008,7 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exportar a un archivo los datos de esta pestaña</translation>
+ <translation type="unfinished">Exportar los datos de la pestaña actual a un archivo</translation>
</message>
<message>
<source>Backup Wallet</source>
@@ -3926,19 +4021,19 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Backup Failed</source>
- <translation type="unfinished">Respaldo erróneo</translation>
+ <translation type="unfinished">Error de respaldo</translation>
</message>
<message>
<source>There was an error trying to save the wallet data to %1.</source>
- <translation type="unfinished">Ha habido un error al intentar guardar los datos del monedero a %1.</translation>
+ <translation type="unfinished">Ha habido un error al intentar guardar los datos del monedero en %1.</translation>
</message>
<message>
<source>Backup Successful</source>
- <translation type="unfinished">Se ha completado con éxito la copia de respaldo</translation>
+ <translation type="unfinished">Copia de respaldo correcta</translation>
</message>
<message>
<source>The wallet data was successfully saved to %1.</source>
- <translation type="unfinished">Los datos del monedero se han guardado con éxito en %1.</translation>
+ <translation type="unfinished">Los datos del monedero se han guardado correctamente en %1.</translation>
</message>
<message>
<source>Cancel</source>
@@ -3953,203 +4048,211 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
- <translation type="unfinished">%s corrupto. Intenta utilizar la herramienta del monedero bitcoin-monedero para guardar o restaurar un respaldo.</translation>
+ <translation type="unfinished">%s corrupto. Intenta utilizar la herramienta del monedero de Bitcoin para rescatar o restaurar una copia de seguridad.</translation>
+ </message>
+ <message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se dejó el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
</message>
<message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
- <translation type="unfinished">%ssolicitud para escuchar en el puerto%u. Este puerto se considera "malo" y, por lo tanto, es poco probable que alguna pareja se conecte a él. Consulte doc/p2p-bad-ports.md para obtener detalles y un listado completo.</translation>
+ <translation type="unfinished">%s solicitud para escuchar en el puerto %u. Este puerto se considera "malo" y, por lo tanto, es poco probable que algún par se conecte a él. Consulta doc/p2p-bad-ports.md para obtener detalles y una lista completa.</translation>
</message>
<message>
<source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
- <translation type="unfinished">No se pudo cambiar la versión %i a la versión anterior %i. Versión del monedero sin cambios.</translation>
+ <translation type="unfinished">No se puede pasar de la versión %i a la versión anterior %i. La versión del monedero no tiene cambios.</translation>
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
- <translation type="unfinished">No se puede bloquear el directorio %s. %s probablemente ya se está ejecutando.</translation>
+ <translation type="unfinished">No se puede bloquear el directorio de datos %s. %s probablemente ya se está ejecutando.</translation>
</message>
<message>
<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">No se puede actualizar un monedero no dividido en HD de la versión %i a la versión %i sin actualizar para admitir el grupo de claves pre-dividido. Por favor, use la versión %i o ninguna versión especificada.</translation>
+ <translation type="unfinished">No se puede actualizar un monedero dividido no HD de la versión %i a la versión %i sin actualizar, para admitir el pool de claves anterior a la división. Usa la versión %i o no especifiques la versión.</translation>
</message>
<message>
<source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
- <translation type="unfinished">Es posible que el espacio en disco%s no se adapte a los archivos de bloque. Aproximadamente %uGB de datos se almacenarán en este directorio.</translation>
+ <translation type="unfinished">Es posible que el espacio en disco %s no tenga capacidad para los archivos de bloque. Aproximadamente %u GB de datos se almacenarán en este directorio.</translation>
</message>
<message>
<source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
- <translation type="unfinished">Distribuido bajo la licencia de software MIT, vea el archivo adjunto %s o %s</translation>
+ <translation type="unfinished">Distribuido bajo la licencia de software MIT; ver el archivo adjunto %s o %s.</translation>
</message>
<message>
<source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
- <translation type="unfinished">Error al cargar la billetera. La billetera requiere que se descarguen bloques, y el software actualmente no admite la carga de billeteras mientras los bloques se descargan fuera de orden cuando se usan instantáneas de assumeutxo. La billetera debería poder cargarse correctamente después de que la sincronización del nodo alcance la altura %s</translation>
- </message>
- <message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">¡Error leyendo %s!. Todas las claves se han leído correctamente, pero los datos de la transacción o el libro de direcciones pueden faltar o ser incorrectos.</translation>
+ <translation type="unfinished">Error al cargar el monedero. Este requiere que se descarguen bloques, y el software actualmente no admite la carga de monederos mientras los bloques se descargan fuera de orden, cuando se usan instantáneas de assumeutxo. El monedero debería poder cargarse correctamente después de que la sincronización del nodo alcance la altura %s.</translation>
</message>
<message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
- <translation type="unfinished">¡Error de lectura %s! Los datos de la transacción pueden faltar o ser incorrectos. Reescaneo del monedero.</translation>
+ <translation type="unfinished">¡Error al leer %s! Es probable que falten los datos de la transacción o que sean incorrectos. Rescaneando monedero.</translation>
</message>
<message>
<source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
- <translation type="unfinished">Error: el registro del formato del archivo de volcado es incorrecto. Se obtuvo «%s», del «formato» esperado.</translation>
+ <translation type="unfinished">Error: El registro del formato del archivo de volcado es incorrecto. Se obtuvo "%s", mientras que se esperaba "formato".</translation>
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">Error: el registro del identificador del archivo de volcado es incorrecto. Se obtuvo «%s» se esperaba «%s».</translation>
+ <translation type="unfinished">Error: El registro del identificador del archivo de volcado es incorrecto. Se obtuvo "%s", mientras que se esperaba "%s".</translation>
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <translation type="unfinished">Error: la versión del archivo volcado no es compatible. Esta versión de monedero bitcoin solo admite archivos de volcado de la versión 1. Consigue volcado de fichero con la versión %s</translation>
+ <translation type="unfinished">Error: la versión del archivo volcado no es compatible. Esta versión del monedero de Bitcoin solo admite archivos de volcado de la versión 1. Se obtuvo un archivo de volcado con la versión %s.</translation>
</message>
<message>
<source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
- <translation type="unfinished">Error: Los monederos heredados solo admiten los tipos de dirección «legacy», «p2sh-segwit» y «bech32»</translation>
+ <translation type="unfinished">Error: los monederos heredados solo admiten los tipos de dirección "legacy", "p2sh-segwit" y "bech32".</translation>
</message>
<message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">Error: no se pueden producir descriptores para esta billetera Legacy. Asegúrese de proporcionar la contraseña de la billetera si está encriptada.</translation>
+ <translation type="unfinished">Error: No se pueden producir descriptores para este monedero tipo "legacy". Asegúrate de proporcionar la frase de contraseña del monedero si está encriptada.</translation>
</message>
<message>
<source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
- <translation type="unfinished">El archivo %s ya existe. Si está seguro de que esto es lo que quiere, muévalo de lugar primero.</translation>
+ <translation type="unfinished">El archivo %s ya existe. Si definitivamente quieres hacerlo, quítalo primero.</translation>
</message>
<message>
<source>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>
- <translation type="unfinished">Archivo peers.dat inválido o corrupto (%s). Si cree que se trata de un error, infórmelo a %s. Como alternativa, puedes mover el archivo (%s) (renombrarlo, moverlo o eliminarlo) para que se cree uno nuevo en el siguiente inicio.</translation>
+ <translation type="unfinished">Archivo peers.dat inválido o corrupto (%s). Si crees que se trata de un error, infórmalo a %s. Como alternativa, puedes quitar el archivo %s (renombrarlo, moverlo o eliminarlo) para que se cree uno nuevo en el siguiente inicio.</translation>
</message>
<message>
<source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
- <translation type="unfinished">Se proporciona más de una dirección de enlace onion. Utilizando %s para el servicio onion de Tor creado automáticamente.</translation>
+ <translation type="unfinished">Se proporciona más de una dirección de enlace onion. Se está usando %s para el servicio onion de Tor creado automáticamente.</translation>
</message>
<message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">No se ha proporcionado ningún archivo de volcado. Para usar createfromdump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
+ <translation type="unfinished">No se proporcionó ningún archivo de volcado. Para usar createfromdump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
</message>
<message>
<source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">No se ha proporcionado ningún archivo de volcado. Para usar el volcado, debe proporcionarse -dumpfile=&lt;filename&gt;.</translation>
+ <translation type="unfinished">No se proporcionó ningún archivo de volcado. Para usar createfromdump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
</message>
<message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <translation type="unfinished">Ningún archivo de formato monedero facilitado. Para usar createfromdump, -format=&lt;format&gt;debe ser facilitado.</translation>
+ <translation type="unfinished">No se ha proporcionado el formato de archivo del monedero. Para usar createfromdump, se debe proporcionar -format=&lt;format&gt;.</translation>
</message>
<message>
<source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
- <translation type="unfinished">¡Por favor, compruebe si la fecha y hora en su computadora son correctas! Si su reloj está mal, %s no trabajará correctamente.</translation>
+ <translation type="unfinished">Verifica que la fecha y hora del equipo sean correctas. Si el reloj está mal configurado, %s no funcionará correctamente.</translation>
</message>
<message>
<source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
- <translation type="unfinished">Contribuya si encuentra %s de utilidad. Visite %s para más información acerca del programa.</translation>
+ <translation type="unfinished">Contribuye si te parece que %s es útil. Visita %s para obtener más información sobre el software.</translation>
</message>
<message>
<source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
- <translation type="unfinished">La poda se ha configurado por debajo del mínimo de %d MiB. Por favor utiliza un valor mas alto.</translation>
+ <translation type="unfinished">La poda se configuró por debajo del mínimo de %d MiB. Usa un valor más alto.</translation>
</message>
<message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
- <translation type="unfinished">El modo poda no es compatible con -reindex-chainstate. Haz uso de un -reindex completo en su lugar.</translation>
+ <translation type="unfinished">El modo de poda es incompatible con -reindex-chainstate. Usa en su lugar un -reindex completo.</translation>
</message>
<message>
<source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
- <translation type="unfinished">Poda: la última sincronización del monedero sobrepasa los datos podados. Necesita reindexar con -reindex (o descargar la cadena de bloques de nuevo en el caso de un nodo podado)</translation>
+ <translation type="unfinished">Poda: la última sincronización del monedero sobrepasa los datos podados. Tienes que ejecutar -reindex (descarga toda la cadena de bloques de nuevo en caso de tener un nodo podado).</translation>
</message>
<message>
- <source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
- <translation type="unfinished">SQLiteDatabase: versión del esquema de la monedero sqlite desconocido %d. Sólo version %d se admite</translation>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Error al cambiar el nombre de "%s" a "%s". Para resolverlo, mueve o elimina manualmente el directorio %s de la instantánea no válida. De lo contrario, encontrarás el mismo error de nuevo en el siguiente inicio.</translation>
</message>
<message>
- <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
- <translation type="unfinished">La base de datos de bloques contiene un bloque que parece ser del futuro. Esto puede ser porque la fecha y hora de su ordenador están mal ajustados. Reconstruya la base de datos de bloques solo si está seguro de que la fecha y hora de su ordenador están ajustadas correctamente.</translation>
+ <source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
+ <translation type="unfinished">SQLiteDatabase: versión desconocida del esquema del monedero sqlite %d. Solo se admite la versión %d</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">El índice de bloque db contiene un «txindex» heredado. Para borrar el espacio de disco ocupado, ejecute un -reindex completo, de lo contrario ignore este error. Este mensaje de error no se volverá a mostrar.</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation type="unfinished">La base de datos de bloques contiene un bloque que parece ser del futuro. Es posible que se deba a que la fecha y hora del equipo están mal configuradas. Reconstruye la base de datos de bloques solo si tienes la certeza de que la fecha y hora del equipo son correctas.</translation>
</message>
<message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
- <translation type="unfinished">Importe de transacción muy pequeño después de la deducción de la comisión</translation>
+ <translation type="unfinished">El importe de la transacción es demasiado pequeño para enviarlo después de deducir la comisión.</translation>
</message>
<message>
<source>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>
- <translation type="unfinished">Este error podría ocurrir si el monedero no fuese apagado correctamente y fuese cargado usando una compilación con una versión más nueva de Berkeley DB. Si es así, utilice el software que cargó por última vez este monedero.</translation>
+ <translation type="unfinished">Este error podría ocurrir si el monedero no se cerró correctamente y se cargó por última vez usando una compilación con una versión más reciente de Berkeley DB. Si es así, usa el software que cargó por última vez este monedero.</translation>
</message>
<message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
- <translation type="unfinished">Esta es una versión de pre-prueba - utilícela bajo su propio riesgo. No la utilice para usos comerciales o de minería.</translation>
+ <translation type="unfinished">Esta es una compilación preliminar de prueba. Úsala bajo tu propia responsabilidad. No la uses para aplicaciones comerciales o de minería.</translation>
</message>
<message>
<source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
- <translation type="unfinished">Esta es la máxima tarifa de transacción que pagas (en adicional a la tarifa normal de transacción) para primordialmente evitar gastar un sobrecosto.</translation>
+ <translation type="unfinished">Esta es la comisión máxima de transacción que pagas (además de la comisión normal) para priorizar la elusión del gasto parcial sobre la selección regular de monedas.</translation>
</message>
<message>
<source>This is the transaction fee you may discard if change is smaller than dust at this level</source>
- <translation type="unfinished">Esta es la comisión de transacción que puede descartar si el cambio es más pequeño que el polvo a este nivel.</translation>
+ <translation type="unfinished">Esta es la comisión de transacción que puedes descartar si el cambio es más pequeño que el remanente en este nivel.</translation>
</message>
<message>
<source>This is the transaction fee you may pay when fee estimates are not available.</source>
- <translation type="unfinished">Esta es la comisión por transacción que deberá pagar cuando la estimación de comisión no esté disponible.</translation>
+ <translation type="unfinished">Esta es la comisión de transacción que puedes pagar cuando los cálculos de comisiones no estén disponibles.</translation>
</message>
<message>
<source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
- <translation type="unfinished">La longitud total de la cadena de versión de red ( %i ) supera la longitud máxima ( %i ) . Reducir el número o tamaño de uacomments .</translation>
+ <translation type="unfinished">La longitud total de la cadena de versión de red (%i) supera la longitud máxima (%i). Reduce el número o tamaño de uacomments .</translation>
</message>
<message>
<source>Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
- <translation type="unfinished">No se ha podido reproducir los bloques. Deberá reconstruir la base de datos utilizando -reindex-chainstate.</translation>
+ <translation type="unfinished">No se pueden reproducir bloques. Tendrás que reconstruir la base de datos usando -reindex-chainstate.</translation>
</message>
<message>
<source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
- <translation type="unfinished">Formato de monedero desconocido «%s» proporcionado. Por favor, proporcione uno de «bdb» o «sqlite».</translation>
+ <translation type="unfinished">Se proporcionó un formato de monedero desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
+ </message>
+ <message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">El nivel de registro de la categoría específica no es compatible: %1$s=%2$s. Se esperaba %1$s=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %3$s. Niveles de registro válidos: %4 $s.</translation>
</message>
<message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
- <translation type="unfinished">Formato de la base de datos chainstate encontrado. Por favor reinicia con -reindex-chainstate. Esto reconstruirá la base de datos chainstate.</translation>
+ <translation type="unfinished">El formato de la base de datos chainstate es incompatible. Reinicia con -reindex-chainstate para reconstruir la base de datos chainstate.</translation>
</message>
<message>
<source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
- <translation type="unfinished">Monedero creado satisfactoriamente. El tipo de monedero «Heredado» está descontinuado y la asistencia para crear y abrir monederos «heredada» será eliminada en el futuro.</translation>
+ <translation type="unfinished">El monedero se creó correctamente. El tipo de monedero "legacy" se está descontinuando, por lo que la asistencia para crear y abrir estos monederos se eliminará en el futuro.</translation>
+ </message>
+ <message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">El monedero se cargó correctamente. El tipo de monedero "legacy" se está descontinuando, por lo que la asistencia para crear y abrir estos monederos se eliminará en el futuro. Los monederos tipo "legacy" se pueden migrar a un monedero basado en descriptores con "migratewallet".</translation>
</message>
<message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
- <translation type="unfinished">Aviso: el formato del monedero del archivo de volcado «%s» no coincide con el formato especificado en la línea de comandos «%s».</translation>
+ <translation type="unfinished">Advertencia: El formato del monedero del archivo de volcado "%s" no coincide con el formato especificado en la línea de comandos "%s".</translation>
</message>
<message>
<source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
- <translation type="unfinished">Advertencia: Claves privadas detectadas en el monedero {%s} con clave privada deshabilitada</translation>
+ <translation type="unfinished">Advertencia: Claves privadas detectadas en el monedero {%s} con claves privadas deshabilitadas.</translation>
</message>
<message>
<source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
- <translation type="unfinished">Advertencia: ¡No parecemos concordar del todo con nuestros pares! Puede que necesite actualizarse, o puede que otros nodos necesiten actualizarse.</translation>
+ <translation type="unfinished">Advertencia: Al parecer no estamos completamente de acuerdo con nuestros pares. Es posible que tengas que realizar una actualización o que los demás nodos tengan que hacerlo.</translation>
</message>
<message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
- <translation type="unfinished">Hay que validar los datos de los testigos de los bloques después de la altura%d. Por favor, reinicie con -reindex.</translation>
+ <translation type="unfinished">Los datos del testigo para los bloques después de la altura %d requieren validación. Reinicia con -reindex.</translation>
</message>
<message>
<source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
- <translation type="unfinished">Necesita reconstruir la base de datos utilizando -reindex para volver al modo sin poda. Esto volverá a descargar toda la cadena de bloques</translation>
+ <translation type="unfinished">Tienes que reconstruir la base de datos usando -reindex para volver al modo sin poda. Esto volverá a descargar toda la cadena de bloques.</translation>
</message>
<message>
<source>%s is set very high!</source>
- <translation type="unfinished">¡%s esta configurado muy alto!</translation>
+ <translation type="unfinished">¡El valor de %s es muy alto!</translation>
</message>
<message>
<source>-maxmempool must be at least %d MB</source>
- <translation type="unfinished">-maxmempool debe ser por lo menos de %d MB</translation>
+ <translation type="unfinished">-maxmempool debe ser por lo menos de %d MB.</translation>
</message>
<message>
<source>A fatal internal error occurred, see debug.log for details</source>
- <translation type="unfinished">Ha ocurrido un error interno grave. Consulta debug.log para más detalles.</translation>
+ <translation type="unfinished">Ocurrió un error interno grave. Consulta debug.log para obtener más información.</translation>
</message>
<message>
<source>Cannot resolve -%s address: '%s'</source>
- <translation type="unfinished">No se puede resolver -%s dirección: «%s»</translation>
+ <translation type="unfinished">No se puede resolver la dirección de -%s: "%s"</translation>
</message>
<message>
<source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <translation type="unfinished">No se puede establecer -forcednsseed a true cuando se establece -dnsseed a false.</translation>
+ <translation type="unfinished">No se puede establecer el valor de -forcednsseed con la variable true al establecer el valor de -dnsseed con la variable false.</translation>
</message>
<message>
<source>Cannot set -peerblockfilters without -blockfilterindex.</source>
@@ -4157,43 +4260,27 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
- <translation type="unfinished">No es posible escribir en el directorio «%s»; comprueba permisos.</translation>
- </message>
- <message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">La actualización -txindex iniciada por una versión anterior no puede completarse. Reinicie con la versión anterior o ejecute un -reindex completo.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se dejó el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
+ <translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
</message>
<message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">La configuración de %s es demasiado alta. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -blockfilterindex. Por favor, desactiva temporalmente blockfilterindex cuando uses -reindex-chainstate, o sustituye -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -coinstatsindex. Por favor, desactiva temporalmente coinstatsindex cuando uses -reindex-chainstate, o sustituye -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -txindex. Por favor, desactiva temporalmente txindex cuando uses -reindex-chainstate, o sustituye -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
- <translation type="unfinished">No se puede proporcionar conexiones específicas y hacer que addrman encuentre conexiones salientes al mismo tiempo.</translation>
+ <translation type="unfinished">No se pueden proporcionar conexiones específicas y hacer que addrman encuentre conexiones salientes al mismo tiempo.</translation>
</message>
<message>
<source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
- <translation type="unfinished">Error de carga %s : Se está cargando el monedero del firmante externo sin que se haya compilado el soporte del firmante externo</translation>
+ <translation type="unfinished">Error al cargar %s: Se está cargando el monedero del firmante externo sin que se haya compilado la compatibilidad del firmante externo.</translation>
+ </message>
+ <message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Error al leer %s. Todas las claves se leyeron correctamente, pero es probable que falten los datos de la transacción o metadatos de direcciones, o bien que sean incorrectos.</translation>
</message>
<message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Error: los datos de la libreta de direcciones en el monedero no se identifican como pertenecientes a monederos migrados</translation>
+ <translation type="unfinished">Error: No se puede identificar si los datos de la libreta de direcciones en el monedero pertenecen a monederos migrados.</translation>
</message>
<message>
<source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
@@ -4201,11 +4288,15 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Error: La transacción %s del monedero no se puede identificar como perteneciente a monederos migrados</translation>
+ <translation type="unfinished">Error: No se puede identificar si la transacción %s en el monedero pertenece a monederos migrados.</translation>
+ </message>
+ <message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
</message>
<message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
- <translation type="unfinished">No se ha podido cambiar el nombre del archivo peers.dat . Por favor, muévalo o elimínelo e inténtelo de nuevo.</translation>
+ <translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
<message>
<source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
@@ -4213,39 +4304,39 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
- <translation type="unfinished">Opciones incompatibles: -dnsseed=1 se especificó explicitamente, pero -onlynet impide conexiones a IPv4/IPv6</translation>
+ <translation type="unfinished">Opciones incompatibles: -dnsseed=1 se especificó explícitamente, pero -onlynet prohíbe conexiones a IPv4/IPv6.</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: «%s» (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas)</translation>
+ <translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s" (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas)</translation>
</message>
<message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
- <translation type="unfinished">Conexiones salientes restringidas a CJDNS (-onlynet=cjdns) pero no se proporciona -cjdnsreachable</translation>
+ <translation type="unfinished">Las conexiones salientes están restringidas a CJDNS (-onlynet=cjdns), pero no se proporciona -cjdnsreachable.</translation>
</message>
<message>
<source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0</source>
- <translation type="unfinished">Conexiones salientes restringidas a Tor (-onlynet=onion) pero el proxy para alcanzar la red Tor está explícitamente prohibido: -onion=0</translation>
+ <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero el proxy para conectarse con la red Tor está explícitamente prohibido: -onion=0.</translation>
</message>
<message>
<source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given</source>
- <translation type="unfinished">Conexiones salientes restringidas a Tor (-onlynet=onion) pero no se proporciona el proxy para alcanzar la red Tor: no se indica ninguna de las opciones -proxy, -onion, o -listenonion </translation>
+ <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero no se proporciona el proxy para conectarse con la red Tor: no se indican -proxy, -onion ni -listenonion.</translation>
</message>
<message>
<source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
- <translation type="unfinished">Conexiones salientes restringidas a i2p (-onlynet=i2p) pero no se proporciona -i2psam</translation>
+ <translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam.</translation>
</message>
<message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intente enviar una cantidad menor o consolidar manualmente los UTXO de su billetera</translation>
+ <translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar un importe menor o consolidar manualmente las UTXO del monedero.</translation>
</message>
<message>
<source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
- <translation type="unfinished">La cantidad total de monedas preseleccionadas no cubre el total de la transacción. Permita que otras entradas se seleccionen automáticamente o incluya más monedas manualmente</translation>
+ <translation type="unfinished">El importe total de las monedas preseleccionadas no cubre la meta de la transacción. Permite que se seleccionen automáticamente otras entradas o incluye más monedas manualmente.</translation>
</message>
<message>
<source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
- <translation type="unfinished">La transacción requiere un destino de valor distinto de 0, una tasa de comisión distinta de 0, o una entrada preseleccionada</translation>
+ <translation type="unfinished">La transacción requiere un destino de valor distinto de cero, una tasa de comisión distinta de cero, o una entrada preseleccionada.</translation>
</message>
<message>
<source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
@@ -4253,16 +4344,16 @@ Vaya a Archivo&gt; Abrir monedero para cargar un monedero.
</message>
<message>
<source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará el pool de memoria.</translation>
+ <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará la mempool.</translation>
</message>
<message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
The wallet might have been tampered with or created with malicious intent.
</source>
- <translation type="unfinished">Se encontró una entrada heredada inesperada en la billetera del descriptor. Cargando billetera%s
+ <translation type="unfinished">Se encontró una entrada inesperada tipo "legacy" en el monedero basado en descriptores. Cargando monedero %s
-Es posible que la billetera haya sido manipulada o creada con malas intenciones.
+Es posible que el monedero haya sido manipulado o creado con malas intenciones.
</translation>
</message>
<message>
@@ -4271,27 +4362,23 @@ Es posible que la billetera haya sido manipulada o creada con malas intenciones.
The wallet might had been created on a newer version.
Please try running the latest software version.
</source>
- <translation type="unfinished">Se encontró un descriptor desconocido. Cargando monedero %s
+ <translation type="unfinished">Se encontró un descriptor desconocido. Cargando monedero %s.
-El monedero puede haber sido creado con una versión más nueva.
-Por favor intenta ejecutar la ultima versión del software.
+El monedero se podría haber creado con una versión más reciente.
+Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Categoría especifica de nivel de registro no soportada -loglevel=%s. Se espera -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %s. Niveles de registro válidos: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
-No es posible limpiar la migración fallida</translation>
+No se puede limpiar la migración fallida</translation>
</message>
<message>
<source>
Unable to restore backup of wallet.</source>
<translation type="unfinished">
-No es posible restaurar la copia de seguridad del monedero.</translation>
+No se puede restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Block verification was interrupted</source>
@@ -4299,23 +4386,23 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
- <translation type="unfinished">Los ajustes de configuración para %s solo aplicados en la red %s cuando se encuentra en la sección [%s].</translation>
+ <translation type="unfinished">La configuración para %s solo se aplica en la red %s cuando se encuentra en la sección [%s].</translation>
</message>
<message>
<source>Copyright (C) %i-%i</source>
- <translation type="unfinished">©%i-%i</translation>
+ <translation type="unfinished">Derechos de autor (C) %i-%i</translation>
</message>
<message>
<source>Corrupted block database detected</source>
- <translation type="unfinished">Corrupción de base de datos de bloques detectada.</translation>
+ <translation type="unfinished">Se detectó que la base de datos de bloques está dañada.</translation>
</message>
<message>
<source>Could not find asmap file %s</source>
- <translation type="unfinished">No se pudo encontrar el archivo AS Map %s</translation>
+ <translation type="unfinished">No se pudo encontrar el archivo asmap %s</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
- <translation type="unfinished">No se pudo analizar el archivo AS Map %s</translation>
+ <translation type="unfinished">No se pudo analizar el archivo asmap %s</translation>
</message>
<message>
<source>Disk space is too low!</source>
@@ -4327,15 +4414,19 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Done loading</source>
- <translation type="unfinished">Carga completa</translation>
+ <translation type="unfinished">Carga completada</translation>
</message>
<message>
<source>Dump file %s does not exist.</source>
- <translation type="unfinished">El archivo de volcado %s no existe</translation>
+ <translation type="unfinished">El archivo de volcado %s no existe.</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar transacción de la base de datos para eliminar transacciones del monedero</translation>
</message>
<message>
<source>Error creating %s</source>
- <translation type="unfinished">Error creando %s</translation>
+ <translation type="unfinished">Error al crear %s</translation>
</message>
<message>
<source>Error initializing block database</source>
@@ -4347,27 +4438,27 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error loading %s</source>
- <translation type="unfinished">Error cargando %s</translation>
+ <translation type="unfinished">Error al cargar %s</translation>
</message>
<message>
<source>Error loading %s: Private keys can only be disabled during creation</source>
- <translation type="unfinished">Error cargando %s: Las claves privadas solo pueden ser deshabilitadas durante la creación.</translation>
+ <translation type="unfinished">Error al cargar %s: Las claves privadas solo se pueden deshabilitar durante la creación.</translation>
</message>
<message>
<source>Error loading %s: Wallet corrupted</source>
- <translation type="unfinished">Error cargando %s: Monedero corrupto</translation>
+ <translation type="unfinished">Error al cargar %s: monedero dañado.</translation>
</message>
<message>
<source>Error loading %s: Wallet requires newer version of %s</source>
- <translation type="unfinished">Error cargando %s: Monedero requiere una versión mas reciente de %s</translation>
+ <translation type="unfinished">Error al cargar %s: el monedero requiere una versión más reciente de %s.</translation>
</message>
<message>
<source>Error loading block database</source>
- <translation type="unfinished">Error cargando base de datos de bloques</translation>
+ <translation type="unfinished">Error al cargar la base de datos de bloques</translation>
</message>
<message>
<source>Error opening block database</source>
- <translation type="unfinished">Error al abrir base de datos de bloques.</translation>
+ <translation type="unfinished">Error al abrir la base de datos de bloques</translation>
</message>
<message>
<source>Error reading configuration file: %s</source>
@@ -4375,23 +4466,19 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error reading from database, shutting down.</source>
- <translation type="unfinished">Error al leer la base de datos, cerrando aplicación.</translation>
+ <translation type="unfinished">Error al leer la base de datos. Se cerrará la aplicación.</translation>
</message>
<message>
<source>Error reading next record from wallet database</source>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos del monedero</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se puede añadir la transacción de observación al monedero de observación</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar transacción de la base de datos para eliminar transacciones del monedero</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pueden eliminar las transacciones de observación</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: No se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4399,47 +4486,43 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error: Disk space is low for %s</source>
- <translation type="unfinished">Error: Espacio en disco bajo por %s</translation>
+ <translation type="unfinished">Error: El espacio en disco es pequeño para %s</translation>
</message>
<message>
<source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
- <translation type="unfinished">Error: La suma de comprobación del archivo de volcado no coincide. Calculada%s, prevista%s</translation>
+ <translation type="unfinished">Error: La suma de comprobación del archivo de volcado no coincide. Calculada:%s; prevista:%s.</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Error: No se puede crear un monedero de observación</translation>
+ <translation type="unfinished">Error: No se puede crear un monedero solo de observación</translation>
</message>
<message>
<source>Error: Got key that was not hex: %s</source>
- <translation type="unfinished">Error: Se recibió una clave que no es hex: %s</translation>
+ <translation type="unfinished">Error: Se recibió una clave que no es hexadecimal (%s)</translation>
</message>
<message>
<source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">Error: Se recibió un valor que no es hex: %s</translation>
+ <translation type="unfinished">Error: Se recibió un valor que no es hexadecimal (%s)</translation>
</message>
<message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
- <translation type="unfinished">Error: Keypool se ha agotado, por favor, invoca «keypoolrefill» primero</translation>
+ <translation type="unfinished">Error: El pool de claves se agotó. Invoca keypoolrefill primero.</translation>
</message>
<message>
<source>Error: Missing checksum</source>
- <translation type="unfinished">Error: No se ha encontrado suma de comprobación</translation>
+ <translation type="unfinished">Error: Falta la suma de comprobación</translation>
</message>
<message>
<source>Error: No %s addresses available.</source>
<translation type="unfinished">Error: No hay direcciones %s disponibles .</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pueden eliminar todas las transacciones de observación</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Este monedero ya usa SQLite</translation>
</message>
<message>
<source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Error: Este monedero ya es un monedero descriptor</translation>
+ <translation type="unfinished">Error: Este monedero ya es un monedero basado en descriptores</translation>
</message>
<message>
<source>Error: Unable to begin reading all records in the database</source>
@@ -4447,43 +4530,71 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">Error: No es posible realizar la copia de seguridad de tu monedero</translation>
+ <translation type="unfinished">Error: No es posible realizar el respaldo del monedero</translation>
</message>
<message>
<source>Error: Unable to parse version %u as a uint32_t</source>
- <translation type="unfinished">Error: No se ha podido analizar la versión %ucomo uint32_t</translation>
+ <translation type="unfinished">Error: No se ha podido analizar la versión %u como uint32_t</translation>
</message>
<message>
<source>Error: Unable to read all records in the database</source>
<translation type="unfinished">Error: No es posible leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: No se ha podido leer el registro del mejor localizador de bloques del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Error: No es posible eliminar los datos de la libreta de direcciones de observación</translation>
+ <translation type="unfinished">Error: No es posible eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
<message>
<source>Error: Unable to write record to new wallet</source>
- <translation type="unfinished">Error: No se pudo escribir el registro en el nuevo monedero</translation>
+ <translation type="unfinished">Error: No se puede escribir el registro en el nuevo monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: No se ha podido escribir el registro del mejor localizador de bloques del monedero solucionable</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: No se ha podido escribir el registro del mejor localizador de bloques del monedero solo de observación</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para el monedero %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para el monedero %s</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Ha fallado la escucha en todos los puertos. Usa -listen=0 si deseas esto.</translation>
+ <translation type="unfinished">Fallo al escuchar en todos los puertos. Usa -listen=0 si quieres hacerlo.</translation>
</message>
<message>
<source>Failed to rescan the wallet during initialization</source>
- <translation type="unfinished">Fallo al volver a escanear el monedero durante el inicio</translation>
+ <translation type="unfinished">Error al rescanear el monedero durante la inicialización</translation>
+ </message>
+ <message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Error al iniciar índices, cerrando...</translation>
</message>
<message>
<source>Failed to verify database</source>
- <translation type="unfinished">No se ha podido verificar la base de datos</translation>
+ <translation type="unfinished">Fallo al verificar la base de datos</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: %s</translation>
</message>
<message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
- <translation type="unfinished">La tasa de comisión (%s) es menor que la tasa mínima de comisión (%s)</translation>
+ <translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
<message>
<source>Ignoring duplicate -wallet %s.</source>
- <translation type="unfinished">No hacer caso de duplicado -wallet %s</translation>
+ <translation type="unfinished">Ignorar duplicación de -wallet %s.</translation>
</message>
<message>
<source>Importing…</source>
@@ -4491,11 +4602,11 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation type="unfinished">Bloque de génesis no encontrado o incorrecto. ¿datadir equivocada para la red?</translation>
+ <translation type="unfinished">El bloque génesis es incorrecto o no se encontró. ¿El directorio de datos es incorrecto para la red?</translation>
</message>
<message>
<source>Initialization sanity check failed. %s is shutting down.</source>
- <translation type="unfinished">La inicialización de la verificación de validez falló. Se está cerrando %s.</translation>
+ <translation type="unfinished">Fallo al inicializar la comprobación de estado. %s se cerrará.</translation>
</message>
<message>
<source>Input not found or already spent</source>
@@ -4503,7 +4614,7 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">dbcache insuficiente para la verificación de bloques</translation>
+ <translation type="unfinished">Insuficiente dbcache para la verificación de bloques</translation>
</message>
<message>
<source>Insufficient funds</source>
@@ -4511,19 +4622,19 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Invalid -i2psam address or hostname: '%s'</source>
- <translation type="unfinished">Dirección de -i2psam o dominio «%s» no válido</translation>
+ <translation type="unfinished">Dirección o nombre de host de -i2psam inválido: "%s" </translation>
</message>
<message>
<source>Invalid -onion address or hostname: '%s'</source>
- <translation type="unfinished">Dirección -onion o nombre hospedado: «%s» no válido</translation>
+ <translation type="unfinished">Dirección o nombre de host de -onion inválido: "%s"</translation>
</message>
<message>
<source>Invalid -proxy address or hostname: '%s'</source>
- <translation type="unfinished">Dirección -proxy o nombre hospedado: «%s» no válido</translation>
+ <translation type="unfinished">Dirección o nombre de host de -proxy inválido: "%s"</translation>
</message>
<message>
<source>Invalid P2P permission: '%s'</source>
- <translation type="unfinished">Permiso P2P: «%s» inválido</translation>
+ <translation type="unfinished">Permiso P2P inválido: "%s"</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
@@ -4535,23 +4646,23 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Importe para -%s=&lt;amount&gt;: «%s» inválido</translation>
+ <translation type="unfinished">Importe inválido para -%s=&lt;amount&gt;: "%s"</translation>
</message>
<message>
<source>Invalid netmask specified in -whitelist: '%s'</source>
- <translation type="unfinished">Máscara de red especificada en -whitelist: «%s» inválida</translation>
+ <translation type="unfinished">Máscara de red inválida especificada en -whitelist: "%s"</translation>
</message>
<message>
<source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">Puerto no válido especificado en%s: '%s'</translation>
+ <translation type="unfinished">Puerto no válido especificado en %s: "%s"</translation>
</message>
<message>
<source>Invalid pre-selected input %s</source>
- <translation type="unfinished">Entrada preseleccionada no válida %s</translation>
+ <translation type="unfinished">La entrada preseleccionada no es válida %s</translation>
</message>
<message>
<source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">La escucha para conexiones entrantes falló (la escucha devolvió el error %s)</translation>
+ <translation type="unfinished">Fallo en la escucha para conexiones entrantes (la escucha devolvió el error %s)</translation>
</message>
<message>
<source>Loading P2P addresses…</source>
@@ -4563,7 +4674,7 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Loading block index…</source>
- <translation type="unfinished">Cargando el índice de bloques...</translation>
+ <translation type="unfinished">Cargando índice de bloques...</translation>
</message>
<message>
<source>Loading wallet…</source>
@@ -4571,19 +4682,19 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Missing amount</source>
- <translation type="unfinished">Importe faltante</translation>
+ <translation type="unfinished">Falta el importe</translation>
</message>
<message>
<source>Missing solving data for estimating transaction size</source>
- <translation type="unfinished">Faltan datos de resolución para estimar el tamaño de las transacciones</translation>
+ <translation type="unfinished">Faltan datos de resolución para estimar el tamaño de la transacción</translation>
</message>
<message>
<source>Need to specify a port with -whitebind: '%s'</source>
- <translation type="unfinished">Necesita especificar un puerto con -whitebind: «%s»</translation>
+ <translation type="unfinished">Se necesita especificar un puerto con -whitebind: "%s"</translation>
</message>
<message>
<source>No addresses available</source>
- <translation type="unfinished">Sin direcciones disponibles</translation>
+ <translation type="unfinished">No hay direcciones disponibles</translation>
</message>
<message>
<source>Not enough file descriptors available.</source>
@@ -4591,11 +4702,11 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Not found pre-selected input %s</source>
- <translation type="unfinished">Entrada preseleccionada no encontrada%s</translation>
+ <translation type="unfinished">La entrada preseleccionada no se encontró %s</translation>
</message>
<message>
<source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">Entrada preseleccionada no solucionable %s</translation>
+ <translation type="unfinished">La entrada preseleccionada no se puede solucionar %s</translation>
</message>
<message>
<source>Prune cannot be configured with a negative value.</source>
@@ -4607,7 +4718,7 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Pruning blockstore…</source>
- <translation type="unfinished">Podando almacén de bloques…</translation>
+ <translation type="unfinished">Podando almacenamiento de bloques…</translation>
</message>
<message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
@@ -4619,47 +4730,47 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Rescanning…</source>
- <translation type="unfinished">Volviendo a analizar...</translation>
+ <translation type="unfinished">Rescaneando...</translation>
</message>
<message>
<source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
- <translation type="unfinished">SQLiteDatabase: Fallado para ejecutar declaración para verificar base de datos: %s</translation>
+ <translation type="unfinished">SQLiteDatabase: Fallo al ejecutar la instrucción para verificar la base de datos: %s</translation>
</message>
<message>
<source>SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
- <translation type="unfinished">SQLiteDatabase: Fallado para preparar declaración para verificar base de datos: %s</translation>
+ <translation type="unfinished">SQLiteDatabase: Fallo al preparar la instrucción para verificar la base de datos (%s)</translation>
</message>
<message>
<source>SQLiteDatabase: Failed to read database verification error: %s</source>
- <translation type="unfinished">SQLiteDatabase: Error al leer la verificación de la base de datos: %s</translation>
+ <translation type="unfinished">SQLiteDatabase: Fallo al leer el error de verificación de la base de datos (%s)</translation>
</message>
<message>
<source>SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
- <translation type="unfinished">SQLiteDatabase: id aplicación inesperada. Esperado %u, tiene %u</translation>
+ <translation type="unfinished">SQLiteDatabase: Identificador de aplicación inesperado. Se esperaba %u; se recibió %u.</translation>
</message>
<message>
<source>Section [%s] is not recognized.</source>
- <translation type="unfinished">Sección [%s] no reconocida.</translation>
+ <translation type="unfinished">La sección [%s] no se reconoce.</translation>
</message>
<message>
<source>Signing transaction failed</source>
- <translation type="unfinished">Firma de transacción errónea</translation>
+ <translation type="unfinished">Fallo al firmar la transacción</translation>
</message>
<message>
<source>Specified -walletdir "%s" does not exist</source>
- <translation type="unfinished">No existe -walletdir «%s» especificada</translation>
+ <translation type="unfinished">El valor especificado de -walletdir "%s" no existe</translation>
</message>
<message>
<source>Specified -walletdir "%s" is a relative path</source>
- <translation type="unfinished">Ruta relativa para -walletdir «%s» especificada</translation>
+ <translation type="unfinished">El valor especificado de -walletdir "%s" es una ruta relativa</translation>
</message>
<message>
<source>Specified -walletdir "%s" is not a directory</source>
- <translation type="unfinished">No existe directorio para -walletdir «%s» especificada</translation>
+ <translation type="unfinished">El valor especificado de -walletdir "%s" no es un directorio</translation>
</message>
<message>
<source>Specified blocks directory "%s" does not exist.</source>
- <translation type="unfinished">No existe directorio de bloques «%s» especificado.</translation>
+ <translation type="unfinished">El directorio de bloques especificado "%s" no existe.</translation>
</message>
<message>
<source>Specified data directory "%s" does not exist.</source>
@@ -4667,11 +4778,11 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Starting network threads…</source>
- <translation type="unfinished">Iniciando procesos de red...</translation>
+ <translation type="unfinished">Iniciando subprocesos de red...</translation>
</message>
<message>
<source>The source code is available from %s.</source>
- <translation type="unfinished">El código fuente esta disponible desde %s.</translation>
+ <translation type="unfinished">El código fuente está disponible en %s.</translation>
</message>
<message>
<source>The specified config file %s does not exist</source>
@@ -4683,7 +4794,7 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>The wallet will avoid paying less than the minimum relay fee.</source>
- <translation type="unfinished">El monedero evitará pagar menos de la comisión mínima de retransmisión. </translation>
+ <translation type="unfinished">El monedero evitará pagar menos que la comisión mínima de retransmisión. </translation>
</message>
<message>
<source>This is experimental software.</source>
@@ -4691,31 +4802,31 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>This is the minimum transaction fee you pay on every transaction.</source>
- <translation type="unfinished">Esta es la comisión mínima que pagarás en cada transacción.</translation>
+ <translation type="unfinished">Esta es la comisión mínima que pagas en cada transacción.</translation>
</message>
<message>
<source>This is the transaction fee you will pay if you send a transaction.</source>
- <translation type="unfinished">Esta es la comisión por transacción a pagar si realiza una transacción.</translation>
+ <translation type="unfinished">Esta es la comisión que pagarás si envías una transacción.</translation>
+ </message>
+ <message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a este monedero</translation>
</message>
<message>
<source>Transaction amount too small</source>
- <translation type="unfinished">Importe de la transacción muy pequeño</translation>
+ <translation type="unfinished">El importe de la transacción es demasiado pequeño</translation>
</message>
<message>
<source>Transaction amounts must not be negative</source>
- <translation type="unfinished">Los importes de la transacción no deben ser negativos</translation>
+ <translation type="unfinished">Los importes de la transacción no pueden ser negativos</translation>
</message>
<message>
<source>Transaction change output index out of range</source>
- <translation type="unfinished">Índice de salida de cambio de transacción fuera de intervalo</translation>
- </message>
- <message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción lleva largo tiempo en la piscina de memoria</translation>
+ <translation type="unfinished">El índice de salidas de cambio de transacciones está fuera de alcance</translation>
</message>
<message>
<source>Transaction must have at least one recipient</source>
- <translation type="unfinished">La transacción debe tener al menos un destinatario</translation>
+ <translation type="unfinished">La transacción debe incluir al menos un destinatario</translation>
</message>
<message>
<source>Transaction needs a change address, but we can't generate it.</source>
@@ -4727,83 +4838,99 @@ No es posible restaurar la copia de seguridad del monedero.</translation>
</message>
<message>
<source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">No se ha podido reservar memoria para -maxsigcachesize: «%s» MiB</translation>
+ <translation type="unfinished">No se puede asignar memoria para -maxsigcachesize: "%s" MiB</translation>
</message>
<message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">No es posible conectar con %s en este sistema (bind ha devuelto el error %s)</translation>
+ <translation type="unfinished">No se puede establecer un enlace a %s en este equipo (bind devolvió el error %s)</translation>
</message>
<message>
<source>Unable to bind to %s on this computer. %s is probably already running.</source>
- <translation type="unfinished">No se ha podido conectar con %s en este equipo. %s es posible que esté todavía en ejecución.</translation>
+ <translation type="unfinished">No se puede establecer un enlace a %s en este equipo. Es posible que %s ya esté en ejecución.</translation>
</message>
<message>
<source>Unable to create the PID file '%s': %s</source>
- <translation type="unfinished">No es posible crear el fichero PID «%s»: %s</translation>
+ <translation type="unfinished">No se puede crear el archivo PID "%s": %s</translation>
</message>
<message>
<source>Unable to find UTXO for external input</source>
- <translation type="unfinished">No se encuentra UTXO para entrada externa</translation>
+ <translation type="unfinished">No se puede encontrar UTXO para la entrada externa</translation>
</message>
<message>
<source>Unable to generate initial keys</source>
- <translation type="unfinished">No es posible generar las claves iniciales</translation>
+ <translation type="unfinished">No se pueden generar las claves iniciales</translation>
</message>
<message>
<source>Unable to generate keys</source>
- <translation type="unfinished">No es posible generar claves</translation>
+ <translation type="unfinished">No se pueden generar claves</translation>
</message>
<message>
<source>Unable to open %s for writing</source>
- <translation type="unfinished">No se ha podido abrir %s para escribir</translation>
+ <translation type="unfinished">No se puede abrir %s para escribir</translation>
</message>
<message>
<source>Unable to parse -maxuploadtarget: '%s'</source>
- <translation type="unfinished">No se ha podido analizar -maxuploadtarget: «%s»</translation>
+ <translation type="unfinished">No se ha podido analizar -maxuploadtarget: "%s"</translation>
</message>
<message>
<source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">No se ha podido iniciar el servidor HTTP. Ver registro de depuración para detalles.</translation>
+ <translation type="unfinished">No se ha podido iniciar el servidor HTTP. Ver registro de depuración para obtener detalles.</translation>
</message>
<message>
<source>Unable to unload the wallet before migrating</source>
- <translation type="unfinished">Fallo al descargar el monedero antes de la migración</translation>
+ <translation type="unfinished">No se puede descargar el monedero antes de la migración</translation>
</message>
<message>
<source>Unknown -blockfilterindex value %s.</source>
- <translation type="unfinished">Valor -blockfilterindex %s desconocido.</translation>
+ <translation type="unfinished">Se desconoce el valor de -blockfilterindex %s.</translation>
</message>
<message>
<source>Unknown address type '%s'</source>
- <translation type="unfinished">Tipo de dirección «%s» desconocida</translation>
+ <translation type="unfinished">Se desconoce el tipo de dirección "%s"</translation>
</message>
<message>
<source>Unknown change type '%s'</source>
- <translation type="unfinished">Tipo de cambio «%s» desconocido</translation>
+ <translation type="unfinished">Se desconoce el tipo de cambio "%s"</translation>
</message>
<message>
<source>Unknown network specified in -onlynet: '%s'</source>
- <translation type="unfinished">Red especificada en -onlynet: «%s» desconocida</translation>
+ <translation type="unfinished">Se desconoce la red especificada en -onlynet: "%s"</translation>
</message>
<message>
<source>Unknown new rules activated (versionbit %i)</source>
- <translation type="unfinished">Nuevas reglas desconocidas activadas (versionbit %i)</translation>
+ <translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
+ </message>
+ <message>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">El nivel de registro global %s=%s no es compatible. Valores válidos: %s.</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Nivel de registro de depuración global -loglevel=%s no mantenido. Valores válidos: %s.</translation>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Error al crear el archivo del monedero: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates no se admite en la cadena %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
- <translation type="unfinished">Categoría de registro no soportada %s=%s. </translation>
+ <translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
+ </message>
+ <message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: No se puede añadir la transacción solo de observación %s al monedero solo de observación</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: No se pueden eliminar las transacciones solo de observación</translation>
</message>
<message>
<source>User Agent comment (%s) contains unsafe characters.</source>
- <translation type="unfinished">El comentario del Agente de Usuario (%s) contiene caracteres inseguros.</translation>
+ <translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
<message>
<source>Verifying blocks…</source>
- <translation type="unfinished">Verificando bloques...</translation>
+ <translation type="unfinished">Verificando bloques…</translation>
</message>
<message>
<source>Verifying wallet(s)…</source>
diff --git a/src/qt/locale/bitcoin_es_CL.ts b/src/qt/locale/bitcoin_es_CL.ts
index c6d31533bd..0f4dda3755 100644
--- a/src/qt/locale/bitcoin_es_CL.ts
+++ b/src/qt/locale/bitcoin_es_CL.ts
@@ -6,10 +6,6 @@
<translation type="unfinished">Click derecho para editar la dirección o etiqueta</translation>
</message>
<message>
- <source>Create a new address</source>
- <translation type="unfinished">Crear una nueva dirección</translation>
- </message>
- <message>
<source>&amp;New</source>
<translation type="unfinished">&amp;Nuevo</translation>
</message>
@@ -58,14 +54,6 @@
<translation type="unfinished">Escoger</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Enviando dirección</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Recibiendo dirección</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Estas son sus direcciones de Bitcoin para enviar pagos. Siempre verifique el monto y la dirección de recepción antes de enviar monedas.</translation>
</message>
@@ -102,6 +90,11 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Se produjo un error al intentar guardar la lista de direcciones en %1. Inténtalo de nuevo.</translation>
</message>
<message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Recepción de direcciones - %1
+</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Exportación fallida</translation>
</message>
@@ -295,6 +288,14 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Cantidad</translation>
</message>
@@ -663,6 +664,14 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Cerrar todos los monederos</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrar una billetera</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Muestre el mensaje de ayuda %1 para obtener una lista con posibles opciones de línea de comandos de Bitcoin</translation>
</message>
@@ -671,12 +680,16 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">&amp;Ocultar valores</translation>
</message>
<message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">Ocultar los valores en la pestaña de vista general</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">billetera predeterminada</translation>
</message>
<message>
<source>No wallets available</source>
- <translation type="unfinished">No hay carteras disponibles</translation>
+ <translation type="unfinished">Monederos no disponibles</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -751,6 +764,14 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Error al crear billetera</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">No se puede crear una nueva billetera, el software se compiló sin soporte sqlite (requerido para billeteras descriptivas)</translation>
+ </message>
+ <message>
<source>Warning: %1</source>
<translation type="unfinished">Advertencia: %1</translation>
</message>
@@ -849,10 +870,6 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Comisión:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Después de comisión:</translation>
</message>
@@ -941,10 +958,6 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar polvo</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
@@ -953,14 +966,6 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">(%1 bloqueado)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">si</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Está etiqueta se vuelve roja si algún receptor recibe una cantidad inferior al límite actual establecido para el polvo.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Puede variar +/- %1 satoshi (s) por entrada.</translation>
</message>
@@ -1020,6 +1025,57 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Estas seguro de wue deseas migrar la billetera 1 %1 1 ?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">La migración de la billetera la convertirá en una o más billeteras basadas en descriptores. Será necesario realizar una nueva copia de seguridad de la billetera.
+Si esta billetera contiene scripts solo de lectura, se creará una nueva billetera que los contenga.
+Si esta billetera contiene scripts solucionables pero no de lectura, se creará una nueva billetera diferente que los contenga.
+
+El proceso de migración creará una copia de seguridad de la billetera antes de migrar. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de esta billetera. En el caso de una migración incorrecta, la copia de seguridad puede restaurarse con la funcionalidad "Restore Wallet" (Restaurar billetera).</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migración errónea</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migración correcta</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet warning</source>
@@ -1084,7 +1140,7 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">Cerrar todas las billeteras</translation>
+ <translation type="unfinished">Cerrar todos los monederos</translation>
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
@@ -1098,8 +1154,16 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Crear Billetera</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Estás a un paso de crear tu nueva billetera.</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Escribe un nombre y, si lo deseas, activa las opciones avanzadas.</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
- <translation type="unfinished">Nombre de la billetera </translation>
+ <translation type="unfinished">Nombre del monedero</translation>
</message>
<message>
<source>Wallet</source>
@@ -1110,10 +1174,6 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Encriptar la billetera. La billetera será encriptada con una contraseña de tu elección.</translation>
</message>
<message>
- <source>Advanced Options</source>
- <translation type="unfinished">Opciones Avanzadas</translation>
- </message>
- <message>
<source>Disable Private Keys</source>
<translation type="unfinished">Desactivar las claves privadas</translation>
</message>
@@ -1126,10 +1186,6 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Crear billetera vacía</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Use descriptores para la gestión de scriptPubKey</translation>
- </message>
- <message>
<source>External signer</source>
<translation type="unfinished">Firmante externo</translation>
</message>
@@ -1138,10 +1194,6 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Crear</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilado sin soporte de sqlite (requerido para billeteras descriptoras)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Compilado sin soporte de firma externa (necesario para la firma externa)</translation>
@@ -1445,6 +1497,10 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Minimice en lugar de salir de la aplicación cuando la ventana esté cerrada. Cuando esta opción está habilitada, la aplicación se cerrará solo después de seleccionar Salir en el menú.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Las opciones establecidas en este diálogo serán anuladas por la línea de comandos:</translation>
</message>
@@ -1657,18 +1713,6 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Usar un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña de vista general:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">"%1" insertado</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">"%1" con la coincidencia más aproximada</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
@@ -1894,8 +1938,12 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">PSBT guardada en en el disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envía %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">dirección personal</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2130,10 +2178,6 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Monedero:</translation>
</message>
<message>
- <source>(none)</source>
- <translation type="unfinished">(ninguno)</translation>
- </message>
- <message>
<source>&amp;Reset</source>
<translation type="unfinished">Reiniciar</translation>
</message>
@@ -2158,6 +2202,22 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Seleccione un par para ver información detallada.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versión de la capa de transporte: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Transporte</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Cadena de identificación de la sesión BIP324 en formato hexadecimal, si existe.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Identificador de sesión</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Versión</translation>
</message>
@@ -2379,6 +2439,21 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Recuperación de dirección saliente: de corta duración, para solicitar direcciones</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Detectando: el par puede ser v1 o v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocolo de transporte de texto simple sin cifrar</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: protocolo de transporte encriptado BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">Seleccionamos el par para la retransmisión de banda ancha</translation>
</message>
@@ -2433,6 +2508,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2774,10 +2853,6 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<translation type="unfinished">Entradas...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Elegir...</translation>
</message>
@@ -2846,10 +2921,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar polvo</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
@@ -2876,10 +2947,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde la billetera '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 a %2</translation>
</message>
@@ -2928,6 +2995,10 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar-por-comisión", BIP-125).</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">¿Quieres crear esta transacción?</translation>
@@ -3380,8 +3451,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Indice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(No se verificó el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3482,10 +3553,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Enviado a</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pago a ti mismo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
@@ -3557,10 +3624,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Enviado a</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">A ti mismo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
@@ -3834,6 +3897,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">%s corrupto. Intenta utilizar la herramienta de la billetera de bitcoin para rescatar o restaurar una copia de seguridad.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea no válida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Comunique este incidente a %s, indicando cómo obtuvo la instantánea. Se dejó el estado de encadenamiento de la instantánea no válida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s solicitud para escuchar en el puerto%u. Este puerto se considera "malo" y, por lo tanto, es poco probable que algún par se conecte a él. Consulta doc/p2p-bad-ports.md para obtener detalles y una lista completa.</translation>
</message>
@@ -3862,10 +3929,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error al cargar la billetera. Esta requiere que se descarguen bloques, y el software actualmente no admite la carga de billeteras mientras los bloques se descargan fuera de orden, cuando se usan instantáneas de assumeutxo. La billetera debería poder cargarse correctamente después de que la sincronización del nodo alcance la altura %s.</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">¡Error al leer %s! Todas las claves se leyeron correctamente, pero es probable que falten los datos de la transacción o la libreta de direcciones, o que sean incorrectos.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">¡Error al leer %s! Es probable que falten los datos de la transacción o que sean incorrectos. Reescaneando billetera.</translation>
</message>
@@ -3934,6 +3997,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Poda: la última sincronización de la billetera sobrepasa los datos podados. Tienes que ejecutar -reindex (descarga toda la cadena de bloques de nuevo en caso de tener un nodo podado)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Error de renombrado de «%s» → «%s». Debería resolver esto manualmente moviendo o borrando el directorio %s de la instantánea no válida, en otro caso encontrará el mismo error de nuevo en el arranque siguiente.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: versión desconocida del esquema de la billetera sqlite %d. Solo se admite la versión %d.</translation>
</message>
@@ -3942,10 +4009,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">La base de datos de bloques contiene un bloque que parece ser del futuro. Es posible que se deba a que la fecha y hora de la computadora están mal configuradas. Reconstruye la base de datos de bloques solo si tienes la certeza de que la fecha y hora de la computadora son correctas.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">La base de datos del índice de bloques contiene un "txindex" heredado. Para borrar el espacio de disco ocupado, ejecute un -reindex completo; de lo contrario, ignore este error. Este mensaje de error no se volverá a mostrar.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">El monto de la transacción es demasiado pequeño para enviarlo después de deducir la comisión</translation>
</message>
@@ -3982,6 +4045,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Se proporcionó un formato de archivo de billetera desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Nivel de boletín del acceso especificado en categoría no mantenida en %1$s=%2$s. Se esperaba %1$s=1:2. Categorías válidas: %3$s. Niveles de boletín válidos: %4 $s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">El formato de la base de datos chainstate es incompatible. Reinicia con -reindex-chainstate para reconstruir la base de datos chainstate.</translation>
</message>
@@ -3990,6 +4057,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">La billetera se creó correctamente. El tipo de billetera "legacy" se está descontinuando, por lo que la asistencia para crear y abrir estas billeteras se eliminará en el futuro.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Monedero correctamente cargado. El tipo de billetero heredado está siendo obsoleto y mantenimiento para creación de monederos heredados serán eliminados en el futuro. Los monederos heredados pueden ser migrados a un descriptor de monedero con migratewallet.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Advertencia: el formato de la billetera del archivo de volcado "%s" no coincide con el formato especificado en la línea de comandos "%s".</translation>
</message>
@@ -4038,30 +4109,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">La actualización -txindex iniciada por una versión anterior no puede completarse. Reinicia con la versión anterior o ejecuta un -reindex completo.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se dejó el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">La configuración de %s es demasiado alta. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -blockfilterindex. Desactiva temporalmente blockfilterindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -coinstatsindex. Desactiva temporalmente coinstatsindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -txindex. Desactiva temporalmente txindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">No se pueden proporcionar conexiones específicas y hacer que addrman encuentre conexiones salientes al mismo tiempo.</translation>
</message>
@@ -4070,6 +4121,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error al cargar %s: Se está cargando la billetera firmante externa sin que se haya compilado la compatibilidad del firmante externo</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Error leyendo %s. Todas las teclas leídas correctamente, pero los datos de transacción o metadatos de dirección puedan ser ausentes o incorrectos.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Error: No se puede identificar si los datos de la libreta de direcciones en la billetera pertenecen a billeteras migradas</translation>
</message>
@@ -4082,6 +4137,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error: No se puede identificar si la transacción %s en la billetera pertenece a billeteras migradas</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
@@ -4156,10 +4215,6 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">La categoría especifica de nivel de registro no es compatible: -loglevel=%s. Se espera -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %s. Niveles de registro válidos: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4204,6 +4259,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error al crear %s</translation>
</message>
@@ -4252,16 +4311,12 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos de la billetera</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción solo de observación a la billetera respectiva</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pudo eliminar las transacciones solo de observación</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4300,10 +4355,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pudo eliminar todas las transacciones solo de observación</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Esta billetera ya usa SQLite</translation>
</message>
@@ -4328,6 +4379,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se pueden leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
@@ -4336,6 +4391,23 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se puede escribir el registro en la nueva billetera</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Ha fallado la escucha en todos los puertos. Usa -listen=0 si desea esto.</translation>
</message>
@@ -4344,10 +4416,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al rescanear la billetera durante la inicialización</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Es erróneo al iniciar indizados, se apaga...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
@@ -4568,6 +4648,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Impuesto por transacción a pagar si envías una transacción.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Monto a transferir muy pequeño</translation>
</message>
@@ -4580,10 +4664,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Índice de salidas de cambio de transacciones fuera de alcance</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción tiene demasiado tiempo de una cadena de mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacción debe incluir al menos un destinatario.</translation>
</message>
@@ -4660,14 +4740,30 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">El nivel de registro de depuración global -loglevel=%s no es compatible. Valores válidos: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Nivel de acceso global %s = %s no mantenido. Los valores válidos son: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates no está mantenido en el encadenamiento %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_CO.ts b/src/qt/locale/bitcoin_es_CO.ts
index 8a231de000..1451f88104 100644
--- a/src/qt/locale/bitcoin_es_CO.ts
+++ b/src/qt/locale/bitcoin_es_CO.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Seleccionar</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Direcciones de envío</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Direcciones de recepción</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Estas son tus direcciones de Bitcoin para enviar pagos. Revisa siempre el importe y la dirección de recepción antes de enviar monedas.</translation>
</message>
@@ -102,6 +94,14 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Ocurrió un error al intentar guardar la lista de direcciones en %1. Inténtalo de nuevo.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Direcciones de envío - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Direcciones de recepción - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Error al exportar</translation>
</message>
@@ -299,6 +299,14 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Importe</translation>
</message>
@@ -406,7 +414,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Browse transaction history</source>
- <translation type="unfinished">Explora el historial de transacciónes</translation>
+ <translation type="unfinished">Explora el historial de transacciones</translation>
</message>
<message>
<source>E&amp;xit</source>
@@ -418,7 +426,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;About %1</source>
- <translation type="unfinished">S&amp;obre %1</translation>
+ <translation type="unfinished">&amp;Acerca de %1</translation>
</message>
<message>
<source>Show information about %1</source>
@@ -426,11 +434,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>About &amp;Qt</source>
- <translation type="unfinished">Acerca de</translation>
+ <translation type="unfinished">Acerca de &amp;Qt</translation>
</message>
<message>
<source>Show information about Qt</source>
- <translation type="unfinished">Mostrar Información sobre Qt</translation>
+ <translation type="unfinished">Mostrar información sobre Qt</translation>
</message>
<message>
<source>Modify configuration options for %1</source>
@@ -451,7 +459,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<message>
<source>Network activity disabled.</source>
<extracomment>A substring of the tooltip.</extracomment>
- <translation type="unfinished">Actividad de red deshabilitada</translation>
+ <translation type="unfinished">Actividad de red deshabilitada.</translation>
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
@@ -459,15 +467,15 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">Enviar monedas a una dirección bitcoin</translation>
+ <translation type="unfinished">Enviar monedas a una dirección de Bitcoin</translation>
</message>
<message>
<source>Backup wallet to another location</source>
- <translation type="unfinished">Respaldar billetera en otra ubicación</translation>
+ <translation type="unfinished">Realizar copia de seguridad de la billetera en otra ubicación</translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
- <translation type="unfinished">Cambiar la contraseña utilizada para la codificación de la billetera</translation>
+ <translation type="unfinished">Cambiar la frase de contraseña utilizada para encriptar la billetera</translation>
</message>
<message>
<source>&amp;Send</source>
@@ -478,16 +486,20 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">&amp;Recibir</translation>
</message>
<message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Opciones…</translation>
+ </message>
+ <message>
<source>&amp;Encrypt Wallet…</source>
<translation type="unfinished">&amp;Encriptar billetera…</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Cifrar las claves privadas de su monedero</translation>
+ <translation type="unfinished">Encriptar las claves privadas que pertenecen a la billetera</translation>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Realizar copia de seguridad de la billetera</translation>
+ <translation type="unfinished">&amp;Realizar copia de seguridad de la billetera...</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
@@ -499,7 +511,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
- <translation type="unfinished">Firmar un mensaje para provar que usted es dueño de esta dirección</translation>
+ <translation type="unfinished">Firmar mensajes con tus direcciones de Bitcoin para demostrar que te pertenecen</translation>
</message>
<message>
<source>&amp;Verify message…</source>
@@ -507,11 +519,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
- <translation type="unfinished">Verificar mensajes comprobando que están firmados con direcciones Bitcoin concretas</translation>
+ <translation type="unfinished">Verificar mensajes para asegurarte de que estén firmados con direcciones de Bitcoin concretas</translation>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Cargar PSBT desde archivo...</translation>
+ <translation type="unfinished">&amp;Cargar TBPF desde archivo...</translation>
</message>
<message>
<source>Open &amp;URI…</source>
@@ -519,11 +531,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">Cerrar Billetera...</translation>
+ <translation type="unfinished">Cerrar billetera...</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Crear Billetera...</translation>
+ <translation type="unfinished">Crear billetera...</translation>
</message>
<message>
<source>Close All Wallets…</source>
@@ -567,19 +579,19 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">Pide pagos (genera codigos QR and bitcoin: URls)</translation>
+ <translation type="unfinished">Solicitar pagos (genera códigos QR y URI de tipo "bitcoin:")</translation>
</message>
<message>
<source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de direcciones de envío y etiquetas</translation>
+ <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de envío usadas</translation>
</message>
<message>
<source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de direcciones de recepción y etiquetas</translation>
+ <translation type="unfinished">Mostrar la lista de etiquetas y direcciones de recepción usadas</translation>
</message>
<message>
<source>&amp;Command-line options</source>
- <translation type="unfinished">&amp;Opciones de linea de comando</translation>
+ <translation type="unfinished">&amp;Opciones de línea de comandos</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
@@ -598,7 +610,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">El último bloque recibido fue generado hace %1</translation>
+ <translation type="unfinished">El último bloque recibido se generó hace %1.</translation>
</message>
<message>
<source>Transactions after this will not yet be visible.</source>
@@ -606,7 +618,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Atención</translation>
+ <translation type="unfinished">Advertencia</translation>
</message>
<message>
<source>Information</source>
@@ -622,11 +634,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Cargar PSBT desde el &amp;portapapeles...</translation>
+ <translation type="unfinished">Cargar TBPF desde el &amp;portapapeles...</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">Cargar una transacción de Bitcoin parcialmente firmada desde el Portapapeles</translation>
+ <translation type="unfinished">Cargar una transacción de Bitcoin parcialmente firmada desde el portapapeles</translation>
</message>
<message>
<source>Node window</source>
@@ -642,11 +654,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;Direcciones de entrega</translation>
+ <translation type="unfinished">&amp;Direcciones de destino</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Abrir un bitcoin: URI</translation>
+ <translation type="unfinished">Abrir un URI de tipo "bitcoin:"</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -675,14 +687,26 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Cerrar todas las billeteras</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrar una billetera</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Mostrar el mensaje de ayuda %1 para obtener una lista de los posibles comandos de Bitcoin</translation>
+ <translation type="unfinished">Mostrar el mensaje de ayuda %1 para obtener una lista de las posibles opciones de línea de comandos de Bitcoin</translation>
</message>
<message>
<source>&amp;Mask values</source>
<translation type="unfinished">&amp;Ocultar valores</translation>
</message>
<message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">Ocultar los valores en la pestaña de vista general</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">billetera predeterminada</translation>
</message>
@@ -708,7 +732,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Nombre de la billetera </translation>
+ <translation type="unfinished">Nombre de la billetera</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -767,6 +791,14 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Error al crear billetera</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">No se puede crear una billetera nueva, ya que el software se compiló sin compatibilidad con sqlite (requerida para billeteras basadas en descriptores)</translation>
+ </message>
+ <message>
<source>Warning: %1</source>
<translation type="unfinished">Advertencia: %1</translation>
</message>
@@ -865,10 +897,6 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Comisión:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Remanente:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Después de la comisión:</translation>
</message>
@@ -957,10 +985,6 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar remanente</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
@@ -969,14 +993,6 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">(%1 bloqueado)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">sí</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Esta etiqueta se pone roja si algún destinatario recibe un importe menor que el actual límite del remanente.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Puede variar +/- %1 satoshi(s) por entrada.</translation>
</message>
@@ -1027,19 +1043,74 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<message>
<source>Load Wallets</source>
<extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
- <translation type="unfinished">Cargar monederos</translation>
+ <translation type="unfinished">Cargar billeteras</translation>
</message>
<message>
<source>Loading wallets…</source>
<extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
- <translation type="unfinished">Cargando monederos...</translation>
+ <translation type="unfinished">Cargando billeteras...</translation>
+ </message>
+</context>
+<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">¿Seguro deseas migrar la billetera &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">La migración de la billetera la convertirá en una o más billeteras basadas en descriptores. Será necesario realizar una nueva copia de seguridad de la billetera.
+Si esta billetera contiene scripts solo de observación, se creará una nueva billetera que los contenga.
+Si esta billetera contiene scripts solucionables pero no de observación, se creará una nueva billetera diferente que los contenga.
+
+El proceso de migración creará una copia de seguridad de la billetera antes de proceder. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de esta billetera. En caso de que la migración falle, se puede restaurar la copia de seguridad con la funcionalidad "Restaurar billetera".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migración errónea</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migración correcta</translation>
</message>
</context>
<context>
<name>OpenWalletActivity</name>
<message>
+ <source>Open wallet failed</source>
+ <translation type="unfinished">Fallo al abrir billetera</translation>
+ </message>
+ <message>
<source>Open wallet warning</source>
- <translation type="unfinished">Advertencia sobre crear monedero</translation>
+ <translation type="unfinished">Advertencia al abrir billetera</translation>
</message>
<message>
<source>default wallet</source>
@@ -1053,7 +1124,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
- <translation type="unfinished">Abriendo Monedero &lt;b&gt;%1&lt;/b&gt;...</translation>
+ <translation type="unfinished">Abriendo billetera &lt;b&gt;%1&lt;/b&gt;...</translation>
</message>
</context>
<context>
@@ -1092,11 +1163,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">¿Estás seguro de que deseas cerrar el monedero &lt;i&gt;%1&lt;/i&gt;?</translation>
+ <translation type="unfinished">¿Seguro deseas cerrar la billetera &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
<message>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
- <translation type="unfinished">Cerrar el monedero durante demasiado tiempo puede causar la resincronización de toda la cadena si la poda es habilitada.</translation>
+ <translation type="unfinished">Cerrar la billetera durante demasiado tiempo puede causar la resincronización de toda la cadena si el podado está habilitado.</translation>
</message>
<message>
<source>Close all wallets</source>
@@ -1104,14 +1175,22 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">¿Está seguro de que desea cerrar todas las billeteras?</translation>
+ <translation type="unfinished">¿Seguro quieres cerrar todas las billeteras?</translation>
</message>
</context>
<context>
<name>CreateWalletDialog</name>
<message>
<source>Create Wallet</source>
- <translation type="unfinished">Crear Billetera</translation>
+ <translation type="unfinished">Crear billetera</translation>
+ </message>
+ <message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Estás a un paso de crear tu nueva billetera.</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Escribe un nombre y, si quieres, activa las opciones avanzadas.</translation>
</message>
<message>
<source>Wallet Name</source>
@@ -1119,15 +1198,15 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Wallet</source>
- <translation type="unfinished">Cartera</translation>
+ <translation type="unfinished">Billetera</translation>
</message>
<message>
<source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">Encriptar la billetera. La billetera será encriptada con una contraseña de tu elección.</translation>
+ <translation type="unfinished">Encriptar la billetera. La billetera se encriptará con una frase de contraseña de tu elección.</translation>
</message>
<message>
<source>Encrypt Wallet</source>
- <translation type="unfinished">Encriptar la billetera</translation>
+ <translation type="unfinished">Encriptar billetera</translation>
</message>
<message>
<source>Advanced Options</source>
@@ -1135,7 +1214,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">Desactivar las claves privadas para esta billetera. Las billeteras con claves privadas desactivadas no tendrán claves privadas y no podrán tener ninguna semilla HD o claves privadas importadas. Esto es ideal para billeteras de solo lectura.</translation>
+ <translation type="unfinished">Desactivar las claves privadas para esta billetera. Las billeteras con claves privadas desactivadas no tendrán claves privadas y no podrán tener ninguna semilla HD ni claves privadas importadas. Esto es ideal para billeteras solo de observación.</translation>
</message>
<message>
<source>Disable Private Keys</source>
@@ -1143,19 +1222,15 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
- <translation type="unfinished">Crea una billetera en blanco. Las billeteras en blanco inicialmente no tienen llaves privadas o texto. Las llaves privadas y las direcciones pueden ser importadas, o se puede establecer una semilla HD, más tarde.</translation>
+ <translation type="unfinished">Crea una billetera en blanco. Las billeteras en blanco inicialmente no tienen llaves privadas ni scripts. Las llaves privadas y las direcciones pueden ser importadas o se puede establecer una semilla HD más tarde.</translation>
</message>
<message>
<source>Make Blank Wallet</source>
- <translation type="unfinished">Crear billetera vacía</translation>
+ <translation type="unfinished">Crear billetera en blanco</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Use descriptores para la gestión de scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Descriptor de la billetera</translation>
+ <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
+ <translation type="unfinished">Usa un dispositivo de firma externo, por ejemplo, una billetera de hardware. Configura primero el script del firmante externo en las preferencias de la billetera.</translation>
</message>
<message>
<source>External signer</source>
@@ -1166,13 +1241,9 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Crear</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilado sin soporte de sqlite (requerido para billeteras descriptoras)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Compilado sin soporte de firma externa (necesario para la firma externa)</translation>
+ <translation type="unfinished">Compilado sin compatibilidad con firma externa (requerida para la firma externa)</translation>
</message>
</context>
<context>
@@ -1187,11 +1258,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>The label associated with this address list entry</source>
- <translation type="unfinished">La etiqueta asociada con esta entrada de la lista de direcciones</translation>
+ <translation type="unfinished">La etiqueta asociada con esta entrada en la lista de direcciones</translation>
</message>
<message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation type="unfinished">La dirección asociada con esta entrada en la libreta de direcciones. Solo puede ser modificada para direcciones de envío.</translation>
+ <translation type="unfinished">La dirección asociada con esta entrada en la lista de direcciones. Solo se puede modificar para las direcciones de envío.</translation>
</message>
<message>
<source>&amp;Address</source>
@@ -1199,7 +1270,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>New sending address</source>
- <translation type="unfinished">Nueva dirección para enviar</translation>
+ <translation type="unfinished">Nueva dirección de envío</translation>
</message>
<message>
<source>Edit receiving address</source>
@@ -1207,11 +1278,19 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Edit sending address</source>
- <translation type="unfinished">Editar dirección de envio</translation>
+ <translation type="unfinished">Editar dirección de envío</translation>
</message>
<message>
<source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">La dirección introducida "%1" no es una dirección Bitcoin valida.</translation>
+ <translation type="unfinished">La dirección ingresada "%1" no es una dirección de Bitcoin válida.</translation>
+ </message>
+ <message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">La dirección "%1" ya existe como dirección de recepción con la etiqueta "%2" y, por lo tanto, no se puede agregar como dirección de envío.</translation>
+ </message>
+ <message>
+ <source>The entered address "%1" is already in the address book with label "%2".</source>
+ <translation type="unfinished">La dirección ingresada "%1" ya está en la libreta de direcciones con la etiqueta "%2".</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
@@ -1219,18 +1298,18 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>New key generation failed.</source>
- <translation type="unfinished">La generación de nueva clave falló.</translation>
+ <translation type="unfinished">Error al generar clave nueva.</translation>
</message>
</context>
<context>
<name>FreespaceChecker</name>
<message>
<source>A new data directory will be created.</source>
- <translation type="unfinished">Un nuevo directorio de datos será creado.</translation>
+ <translation type="unfinished">Se creará un nuevo directorio de datos.</translation>
</message>
<message>
<source>name</source>
- <translation type="unfinished">Nombre</translation>
+ <translation type="unfinished">nombre</translation>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
@@ -1242,7 +1321,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Cannot create data directory here.</source>
- <translation type="unfinished">Es imposible crear la carpeta de datos aquí.</translation>
+ <translation type="unfinished">No se puede crear un directorio de datos aquí.</translation>
</message>
</context>
<context>
@@ -1274,11 +1353,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">Al menos %1 GB de información será almacenado en este directorio, y seguirá creciendo a través del tiempo.</translation>
+ <translation type="unfinished">Se almacenará al menos %1 GB de información en este directorio, que aumentará con el tiempo.</translation>
</message>
<message>
<source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">Aproximadamente %1 GB de información será almacenado en este directorio.</translation>
+ <translation type="unfinished">Se almacenará aproximadamente %1 GB de información en este directorio.</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
@@ -1290,39 +1369,39 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>%1 will download and store a copy of the Bitcoin block chain.</source>
- <translation type="unfinished">%1 descargará y almacenará una copia del blockchain de Bitcoin.</translation>
+ <translation type="unfinished">%1 descargará y almacenará una copia de la cadena de bloques de Bitcoin.</translation>
</message>
<message>
<source>The wallet will also be stored in this directory.</source>
- <translation type="unfinished">El monedero también será almacenado en este directorio.</translation>
+ <translation type="unfinished">La billetera también se almacenará en este directorio.</translation>
</message>
<message>
<source>Error: Specified data directory "%1" cannot be created.</source>
- <translation type="unfinished">Error: El directorio de datos especificado "%1" no pudo ser creado.</translation>
+ <translation type="unfinished">Error: No se puede crear el directorio de datos especificado "%1" .</translation>
</message>
<message>
<source>Welcome</source>
- <translation type="unfinished">bienvenido</translation>
+ <translation type="unfinished">Te damos la bienvenida</translation>
</message>
<message>
<source>Welcome to %1.</source>
- <translation type="unfinished">Bienvenido a %1.</translation>
+ <translation type="unfinished">Te damos la bienvenida a %1.</translation>
</message>
<message>
<source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
- <translation type="unfinished">Al ser la primera vez que se ejecuta el programa, puede elegir donde %1 almacenará sus datos.</translation>
+ <translation type="unfinished">Como es la primera vez que se ejecuta el programa, puedes elegir dónde %1 almacenará los datos.</translation>
</message>
<message>
<source>Limit block chain storage to</source>
- <translation type="unfinished">Limitar el almacenamiento de cadena de bloques a</translation>
+ <translation type="unfinished">Limitar el almacenamiento de la cadena de bloques a</translation>
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">Revertir esta configuración requiere descargar la blockchain completa nuevamente. Es más rápido descargar la cadena completa y podarla después. Desactiva algunas funciones avanzadas.</translation>
+ <translation type="unfinished">Para revertir esta configuración, se debe descargar de nuevo la cadena de bloques completa. Es más rápido descargar la cadena completa y podarla después. Desactiva algunas funciones avanzadas.</translation>
</message>
<message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
- <translation type="unfinished">El primer proceso de sincronización consume muchos recursos, y es posible que puedan ocurrir problemas de hardware que anteriormente no hayas notado. Cada vez que ejecutes %1 automáticamente se reiniciará el proceso de sincronización desde el punto que lo dejaste anteriormente.</translation>
+ <translation type="unfinished">La sincronización inicial consume muchos recursos y es posible que exponga problemas de hardware en la computadora que anteriormente pasaron desapercibidos. Cada vez que ejecutes %1, seguirá descargando desde el punto en el que quedó.</translation>
</message>
<message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
@@ -1330,7 +1409,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
- <translation type="unfinished">Si elegiste la opción de limitar el tamaño del blockchain (pruning), de igual manera será descargada y procesada la información histórica, pero será eliminada al finalizar este proceso para disminuir el uso del disco duro.</translation>
+ <translation type="unfinished">Si elegiste la opción de limitar el almacenamiento de la cadena de bloques (podado), los datos históricos se deben descargar y procesar de igual manera, pero se eliminarán después para disminuir el uso del disco.</translation>
</message>
<message>
<source>Use the default data directory</source>
@@ -1338,7 +1417,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Use a custom data directory:</source>
- <translation type="unfinished">usar un directorio de datos personalizado:</translation>
+ <translation type="unfinished">Usar un directorio de datos personalizado:</translation>
</message>
</context>
<context>
@@ -1349,18 +1428,22 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>About %1</source>
- <translation type="unfinished">Sobre %1</translation>
+ <translation type="unfinished">Acerca de %1</translation>
</message>
<message>
<source>Command-line options</source>
- <translation type="unfinished">opciones de linea de comando</translation>
+ <translation type="unfinished">Opciones de línea de comandos</translation>
</message>
</context>
<context>
<name>ShutdownWindow</name>
<message>
+ <source>%1 is shutting down…</source>
+ <translation type="unfinished">%1 se está cerrando...</translation>
+ </message>
+ <message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">No apague el equipo hasta que desaparezca esta ventana.</translation>
+ <translation type="unfinished">No apagues la computadora hasta que desaparezca esta ventana.</translation>
</message>
</context>
<context>
@@ -1371,11 +1454,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
- <translation type="unfinished">Las transacciones recientes aún no pueden ser visibles, y por lo tanto el saldo de su monedero podría ser incorrecto. Esta información será correcta cuando su monedero haya terminado de sincronizarse con la red de bitcoin, como se detalla abajo.</translation>
+ <translation type="unfinished">Es posible que las transacciones recientes aún no sean visibles y, por lo tanto, el saldo de la billetera podría ser incorrecto. Esta información será correcta una vez que la billetera haya terminado de sincronizarse con la red de Bitcoin, como se detalla abajo.</translation>
</message>
<message>
<source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
- <translation type="unfinished">La red no aceptará el intentar gastar bitcoins que están afectados por transacciones aún no mostradas.</translation>
+ <translation type="unfinished">La red no aceptará si se intenta gastar bitcoins afectados por las transacciones que aún no se muestran.</translation>
</message>
<message>
<source>Number of blocks left</source>
@@ -1386,6 +1469,10 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Desconocido...</translation>
</message>
<message>
+ <source>calculating…</source>
+ <translation type="unfinished">calculando...</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation type="unfinished">Hora del último bloque</translation>
</message>
@@ -1407,11 +1494,11 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
- <translation type="unfinished">%1 está actualmente sincronizándose. Descargará cabeceras y bloques de nodos semejantes y los validará hasta alcanzar la cabeza de la cadena de bloques.</translation>
+ <translation type="unfinished">%1 se está sincronizando actualmente. Descargará encabezados y bloques de pares, y los validará hasta alcanzar el extremo de la cadena de bloques.</translation>
</message>
<message>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Desconocido. Sincronizando cabeceras (%1, %2%)…</translation>
+ <translation type="unfinished">Desconocido. Sincronizando encabezados (%1, %2%)…</translation>
</message>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
@@ -1470,11 +1557,15 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
- <translation type="unfinished">Muestra si el proxy SOCKS5 por defecto se utiliza para conectarse a pares a través de este tipo de red.</translation>
+ <translation type="unfinished">Muestra si el proxy SOCKS5 por defecto suministrado se utiliza para llegar a los pares a través de este tipo de red.</translation>
</message>
<message>
<source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
- <translation type="unfinished">Minimizar en vez de salir de la aplicación cuando la ventana está cerrada. Cuando se activa esta opción, la aplicación sólo se cerrará después de seleccionar Salir en el menú.</translation>
+ <translation type="unfinished">Minimizar en vez de salir de la aplicación cuando la ventana está cerrada. Cuando se activa esta opción, la aplicación solo se cerrará después de seleccionar "Salir" en el menú.</translation>
+ </message>
+ <message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
</message>
<message>
<source>Options set in this dialog are overridden by the command line:</source>
@@ -1565,12 +1656,12 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
- <translation type="unfinished">Activar controles de &amp;PSBT</translation>
+ <translation type="unfinished">Activar controles de &amp;TBPF</translation>
</message>
<message>
<source>Whether to show PSBT controls.</source>
<extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
- <translation type="unfinished">Si se muestran los controles de PSBT.</translation>
+ <translation type="unfinished">Si se muestran los controles de TBPF.</translation>
</message>
<message>
<source>External Signer (e.g. hardware wallet)</source>
@@ -1693,25 +1784,13 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<translation type="unfinished">Usar un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña de vista general:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">"%1" insertado</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">"%1" con la coincidencia más aproximada</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Cancelar</translation>
</message>
<message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">Compilado sin soporte de firma externa (necesario para la firma externa)</translation>
+ <translation type="unfinished">Compilado sin compatibilidad con firma externa (requerida para la firma externa)</translation>
</message>
<message>
<source>default</source>
@@ -1765,7 +1844,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>This change would require a client restart.</source>
- <translation type="unfinished">Estos cambios requieren el reinicio del cliente.</translation>
+ <translation type="unfinished">Estos cambios requieren reiniciar el cliente.</translation>
</message>
<message>
<source>The supplied proxy address is invalid.</source>
@@ -1791,7 +1870,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Watch-only:</source>
- <translation type="unfinished">Solo lectura:</translation>
+ <translation type="unfinished">Solo de observación:</translation>
</message>
<message>
<source>Available:</source>
@@ -1827,7 +1906,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Your current balance in watch-only addresses</source>
- <translation type="unfinished">Tu saldo actual en direcciones de solo lectura</translation>
+ <translation type="unfinished">Tu saldo actual en direcciones solo de observación</translation>
</message>
<message>
<source>Spendable:</source>
@@ -1839,26 +1918,26 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Unconfirmed transactions to watch-only addresses</source>
- <translation type="unfinished">Transacciones sin confirmar hacia direcciones de solo lectura</translation>
+ <translation type="unfinished">Transacciones sin confirmar hacia direcciones solo de observación</translation>
</message>
<message>
<source>Mined balance in watch-only addresses that has not yet matured</source>
- <translation type="unfinished">Saldo minado en direcciones de solo lectura que aún no ha madurado</translation>
+ <translation type="unfinished">Saldo minado en direcciones solo de observación que aún no ha madurado</translation>
</message>
<message>
<source>Current total balance in watch-only addresses</source>
- <translation type="unfinished">Saldo total actual en direcciones de solo lectura</translation>
+ <translation type="unfinished">Saldo total actual en direcciones solo de observación</translation>
</message>
<message>
<source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
- <translation type="unfinished">Modo de privacidad activado para la pestaña de vista general. Para mostrar los valores, anula la selección de Configuración-&gt;Ocultar valores.</translation>
+ <translation type="unfinished">Modo de privacidad activado para la pestaña de vista general. Para mostrar los valores, anula la selección de "Configuración-&gt;Ocultar valores".</translation>
</message>
</context>
<context>
<name>PSBTOperationsDialog</name>
<message>
<source>PSBT Operations</source>
- <translation type="unfinished">Operaciones PSBT</translation>
+ <translation type="unfinished">Operaciones TBPF</translation>
</message>
<message>
<source>Sign Tx</source>
@@ -1918,7 +1997,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>PSBT copied to clipboard.</source>
- <translation type="unfinished">PSBT copiada al portapapeles.</translation>
+ <translation type="unfinished">TBPF copiada al portapapeles.</translation>
</message>
<message>
<source>Save Transaction Data</source>
@@ -1927,15 +2006,19 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Transacción firmada parcialmente (binaria) </translation>
+ <translation type="unfinished">Transacción parcialmente firmada (binario) </translation>
</message>
<message>
<source>PSBT saved to disk.</source>
- <translation type="unfinished">PSBT guardada en en el disco.</translation>
+ <translation type="unfinished">TBPF guardada en el disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envía %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">dirección propia</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -1994,7 +2077,7 @@ Solo es posible firmar con direcciones de tipo legacy.</translation>
</message>
<message>
<source>Cannot start bitcoin: click-to-pay handler</source>
- <translation type="unfinished">No se puede iniciar Bitcoin: controlador de clic para pagar</translation>
+ <translation type="unfinished">No se puede iniciar el controlador "bitcoin: click-to-pay"</translation>
</message>
<message>
<source>URI handling</source>
@@ -2119,19 +2202,23 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>Client version</source>
- <translation type="unfinished">Versión del Cliente</translation>
+ <translation type="unfinished">Versión del cliente</translation>
</message>
<message>
<source>&amp;Information</source>
<translation type="unfinished">&amp;Información</translation>
</message>
<message>
+ <source>Datadir</source>
+ <translation type="unfinished">Directorio de datos</translation>
+ </message>
+ <message>
<source>To specify a non-default location of the data directory use the '%1' option.</source>
<translation type="unfinished">Para especificar una ubicación no predeterminada del directorio de datos, usa la opción "%1".</translation>
</message>
<message>
<source>Blocksdir</source>
- <translation type="unfinished">Bloques dir</translation>
+ <translation type="unfinished">Directorio de bloques</translation>
</message>
<message>
<source>To specify a non-default location of the blocks directory use the '%1' option.</source>
@@ -2163,11 +2250,11 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>Current number of transactions</source>
- <translation type="unfinished">Numero total de transacciones</translation>
+ <translation type="unfinished">Número total de transacciones</translation>
</message>
<message>
<source>Memory usage</source>
- <translation type="unfinished">Memoria utilizada</translation>
+ <translation type="unfinished">Uso de memoria</translation>
</message>
<message>
<source>Wallet: </source>
@@ -2175,11 +2262,11 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>(none)</source>
- <translation type="unfinished">(ninguno)</translation>
+ <translation type="unfinished">(ninguna)</translation>
</message>
<message>
<source>&amp;Reset</source>
- <translation type="unfinished">&amp;Reestablecer</translation>
+ <translation type="unfinished">&amp;Restablecer</translation>
</message>
<message>
<source>Received</source>
@@ -2202,6 +2289,22 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Selecciona un par para ver la información detallada.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versión de la capa de transporte: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Transporte</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Cadena de identificador de la sesión BIP324 en formato hexadecimal, si existe.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Identificador de sesión</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Versión</translation>
</message>
@@ -2215,7 +2318,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>Starting Block</source>
- <translation type="unfinished">Bloque de inicio</translation>
+ <translation type="unfinished">Bloque inicial</translation>
</message>
<message>
<source>Synced Headers</source>
@@ -2245,17 +2348,17 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<message>
<source>Address Relay</source>
<extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Retransmisión de dirección</translation>
+ <translation type="unfinished">Retransmisión de direcciones</translation>
</message>
<message>
<source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
<extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">El número total de direcciones recibidas desde este par que se procesaron (excluye las direcciones omitidas debido a la limitación de volumen).</translation>
+ <translation type="unfinished">El número total de direcciones recibidas desde este par que se procesaron (excluye las direcciones desestimadas debido a la limitación de volumen).</translation>
</message>
<message>
<source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
<extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">El número total de direcciones recibidas desde este par que se omitieron (no se procesaron) debido a la limitación de volumen.</translation>
+ <translation type="unfinished">El número total de direcciones recibidas desde este par que se desestimaron (no se procesaron) debido a la limitación de volumen.</translation>
</message>
<message>
<source>Addresses Processed</source>
@@ -2265,7 +2368,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<message>
<source>Addresses Rate-Limited</source>
<extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Direcciones omitidas por limitación de volumen</translation>
+ <translation type="unfinished">Direcciones desestimadas por limitación de volumen</translation>
</message>
<message>
<source>User Agent</source>
@@ -2313,7 +2416,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>High bandwidth BIP152 compact block relay: %1</source>
- <translation type="unfinished">Retransmisión de bloque compacto BIP152 en modo de banda ancha: %1</translation>
+ <translation type="unfinished">Retransmisión de bloques compactos BIP152 en banda ancha: %1</translation>
</message>
<message>
<source>High Bandwidth</source>
@@ -2321,7 +2424,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>Connection Time</source>
- <translation type="unfinished">Duración de la conexión</translation>
+ <translation type="unfinished">Tiempo de conexión</translation>
</message>
<message>
<source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
@@ -2390,7 +2493,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>Clear console</source>
- <translation type="unfinished">Limpiar consola</translation>
+ <translation type="unfinished">Borrar consola</translation>
</message>
<message>
<source>In:</source>
@@ -2431,6 +2534,21 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Recuperación de dirección saliente: de corta duración, para solicitar direcciones</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Detectando: el par puede ser v1 o v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocolo de transporte de texto simple sin encriptar</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: protocolo de transporte encriptado BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">Seleccionamos el par para la retransmisión de banda ancha</translation>
</message>
@@ -2474,7 +2592,7 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
</message>
<message>
<source>&amp;Unban</source>
- <translation type="unfinished">&amp;Desbloquear</translation>
+ <translation type="unfinished">&amp;Levantar prohibición</translation>
</message>
<message>
<source>Network activity disabled</source>
@@ -2485,6 +2603,10 @@ Si recibes este error, debes solicitar al comerciante que te proporcione un URI
<translation type="unfinished">Ejecutar comando sin ninguna billetera</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Ejecutar comando usando la billetera "%1"</translation>
</message>
@@ -2503,7 +2625,7 @@ Utiliza %3 y %4 para aumentar o disminuir el tamaño de la fuente.
Escribe %5 para ver los comandos disponibles.
Para obtener más información sobre cómo usar esta consola, escribe %6.
-%7 ADVERTENCIA: Los estafadores han estado diciéndoles a los usuarios que escriban comandos aquí para robarles el contenido de sus billeteras. No uses esta consola sin entender completamente las ramificaciones de un comando.%8</translation>
+%7 ADVERTENCIA: Los estafadores suelen decirles a los usuarios que escriban comandos aquí para robarles el contenido de sus billeteras. No uses esta consola sin entender completamente las ramificaciones de un comando.%8</translation>
</message>
<message>
<source>Executing…</source>
@@ -2532,7 +2654,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>Ban for</source>
- <translation type="unfinished">Prohibir para</translation>
+ <translation type="unfinished">Prohibir por</translation>
</message>
<message>
<source>Never</source>
@@ -2563,7 +2685,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>An optional label to associate with the new receiving address.</source>
- <translation type="unfinished">Una etiqueta opcional para asociar con la nueva dirección de recepción</translation>
+ <translation type="unfinished">Una etiqueta opcional para asociar con la nueva dirección de recepción.</translation>
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
@@ -2575,7 +2697,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
- <translation type="unfinished">Una etiqueta opcional para asociar con la nueva dirección de recepción (utilizada por ti para identificar una factura). También se adjunta a la solicitud de pago.</translation>
+ <translation type="unfinished">Una etiqueta opcional para asociar con la nueva dirección de recepción (puedes usarla para identificar una factura). También se adjunta a la solicitud de pago.</translation>
</message>
<message>
<source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
@@ -2756,7 +2878,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>automatically selected</source>
- <translation type="unfinished">Seleccionado automaticamente</translation>
+ <translation type="unfinished">seleccionado automáticamente</translation>
</message>
<message>
<source>Insufficient funds!</source>
@@ -2820,7 +2942,7 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
</message>
<message>
<source>Send to multiple recipients at once</source>
- <translation type="unfinished">Enviar a múltiples destinatarios</translation>
+ <translation type="unfinished">Enviar a múltiples destinatarios a la vez</translation>
</message>
<message>
<source>Add &amp;Recipient</source>
@@ -2835,10 +2957,6 @@ Para obtener más información sobre cómo usar esta consola, escribe %6.
<translation type="unfinished">Entradas...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Remanente:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Elegir...</translation>
</message>
@@ -2860,7 +2978,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
- <translation type="unfinished">Si la comisión es demasiado baja, es posible que la transacción nunca se confirme (leer la información sobre herramientas).</translation>
+ <translation type="unfinished">Si la comisión es demasiado baja, es posible que la transacción nunca se confirme (leer la información en pantalla).</translation>
</message>
<message>
<source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
@@ -2872,11 +2990,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Enable Replace-By-Fee</source>
- <translation type="unfinished">Activar "Reemplazar-por-comisión"</translation>
+ <translation type="unfinished">Activar "Remplazar por comisión"</translation>
</message>
<message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
- <translation type="unfinished">Con la función "Reemplazar-por-comisión" (BIP-125), puedes aumentar la comisión de una transacción después de enviarla. Sin esta, es posible que se recomiende una comisión más alta para compensar el mayor riesgo de retraso de la transacción.</translation>
+ <translation type="unfinished">Con la función "Remplazar por comisión" (BIP-125), puedes aumentar la comisión de una transacción después de enviarla. Sin esta, es posible que se recomiende una comisión más alta para compensar el mayor riesgo de retraso de la transacción.</translation>
</message>
<message>
<source>Clear &amp;All</source>
@@ -2915,10 +3033,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar remanente</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
@@ -2946,11 +3060,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
- </message>
- <message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde la billetera '%1'</translation>
+ <translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (TBPF) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con TBPF.</translation>
</message>
<message>
<source>%1 to '%2'</source>
@@ -2985,12 +3095,12 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Transacción firmada parcialmente (binaria) </translation>
+ <translation type="unfinished">Transacción parcialmente firmada (binario) </translation>
</message>
<message>
<source>PSBT saved</source>
<extracomment>Popup message when a PSBT has been saved to a file</extracomment>
- <translation type="unfinished">PSBT guardada</translation>
+ <translation type="unfinished">TBPF guardada</translation>
</message>
<message>
<source>External balance:</source>
@@ -3002,7 +3112,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
- <translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar-por-comisión", BIP-125).</translation>
+ <translation type="unfinished">Puedes aumentar la comisión después (indica "Remplazar por comisión", BIP-125).</translation>
</message>
<message>
<source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
@@ -3010,6 +3120,10 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Revisa por favor la propuesta de transacción. Esto producirá una transacción de Bitcoin parcialmente firmada (TBPF) que puedes guardar o copiar y, luego, firmar; por ejemplo, una billetera %1 fuera de línea o una billetera de hardware compatible con TBPF.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero "%2"</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">¿Quieres crear esta transacción?</translation>
@@ -3017,7 +3131,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<message>
<source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">Revisa la transacción. Puedes crear y enviar esta transacción de Bitcoin parcialmente firmada (PSBT), que además puedes guardar o copiar y, luego, firmar; por ejemplo, una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
+ <translation type="unfinished">Revisa la transacción. Puedes crear y enviar esta transacción de Bitcoin parcialmente firmada (TBPF), que además puedes guardar o copiar y, luego, firmar; por ejemplo, una billetera %1 sin conexión o una billetera de hardware compatible con TBPF.</translation>
</message>
<message>
<source>Please, review your transaction.</source>
@@ -3030,7 +3144,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Not signalling Replace-By-Fee, BIP-125.</source>
- <translation type="unfinished">No indica "Reemplazar-por-comisión", BIP-125.</translation>
+ <translation type="unfinished">No indica "Remplazar por comisión", BIP-125.</translation>
</message>
<message>
<source>Total Amount</source>
@@ -3044,19 +3158,19 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">Se copió la PSBT al portapapeles. También puedes guardarla.</translation>
+ <translation type="unfinished">Se copió la TBPF al portapapeles. También puedes guardarla.</translation>
</message>
<message>
<source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT guardada en el disco</translation>
+ <translation type="unfinished">TBPF guardada en el disco</translation>
</message>
<message>
<source>Confirm send coins</source>
- <translation type="unfinished">Confirmar el envió de monedas</translation>
+ <translation type="unfinished">Confirmar el envío de monedas</translation>
</message>
<message>
<source>Watch-only balance:</source>
- <translation type="unfinished">Saldo de solo lectura:</translation>
+ <translation type="unfinished">Saldo solo de observación:</translation>
</message>
<message>
<source>The recipient address is not valid. Please recheck.</source>
@@ -3188,11 +3302,11 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<name>SignVerifyMessageDialog</name>
<message>
<source>Signatures - Sign / Verify a Message</source>
- <translation type="unfinished">Firmas - Firmar / verificar un mensaje</translation>
+ <translation type="unfinished">Firmas: firmar o verificar un mensaje</translation>
</message>
<message>
<source>&amp;Sign Message</source>
- <translation type="unfinished">&amp;Firmar Mensaje</translation>
+ <translation type="unfinished">&amp;Firmar mensaje</translation>
</message>
<message>
<source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
@@ -3276,7 +3390,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>The entered address is invalid.</source>
- <translation type="unfinished">La dirección ingresada es inválida</translation>
+ <translation type="unfinished">La dirección ingresada es inválida.</translation>
</message>
<message>
<source>Please check the address and try again.</source>
@@ -3300,7 +3414,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Message signing failed.</source>
- <translation type="unfinished">Falló la firma del mensaje.</translation>
+ <translation type="unfinished">Error al firmar el mensaje.</translation>
</message>
<message>
<source>Message signed.</source>
@@ -3404,7 +3518,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">Solo lectura</translation>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>label</source>
@@ -3470,8 +3584,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Índice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(No se verificó el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3572,16 +3686,12 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Enviada a</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pago a ti mismo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minada</translation>
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">Solo lectura</translation>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>(n/a)</source>
@@ -3605,7 +3715,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished">Si una dirección de solo lectura está involucrada en esta transacción o no.</translation>
+ <translation type="unfinished">Si una dirección solo de observación está involucrada en esta transacción o no.</translation>
</message>
<message>
<source>User-defined intent/purpose of the transaction.</source>
@@ -3651,10 +3761,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Enviada a</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">A ti mismo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minada</translation>
</message>
@@ -3734,7 +3840,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Watch-only</source>
- <translation type="unfinished">Solo lectura</translation>
+ <translation type="unfinished">Solo de observación</translation>
</message>
<message>
<source>Date</source>
@@ -3766,7 +3872,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
</message>
<message>
<source>Exporting Successful</source>
- <translation type="unfinished">Exportación exitosa</translation>
+ <translation type="unfinished">Exportación correcta</translation>
</message>
<message>
<source>The transaction history was successfully saved to %1.</source>
@@ -3797,7 +3903,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>Unable to decode PSBT from clipboard (invalid base64)</source>
- <translation type="unfinished">No se puede decodificar la PSBT desde el portapapeles (Base64 inválida)</translation>
+ <translation type="unfinished">No se puede decodificar la TBPF desde el portapapeles (Base64 inválida)</translation>
</message>
<message>
<source>Load Transaction Data</source>
@@ -3805,15 +3911,15 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>Partially Signed Transaction (*.psbt)</source>
- <translation type="unfinished">Transacción firmada parcialmente (*.psbt)</translation>
+ <translation type="unfinished">Transacción parcialmente firmada (*.psbt)</translation>
</message>
<message>
<source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">El archivo PSBT debe ser más pequeño de 100 MiB</translation>
+ <translation type="unfinished">El archivo TBPF debe ser más pequeño de 100 MiB</translation>
</message>
<message>
<source>Unable to decode PSBT</source>
- <translation type="unfinished">No se puede decodificar PSBT</translation>
+ <translation type="unfinished">No se puede decodificar TBPF</translation>
</message>
</context>
<context>
@@ -3861,7 +3967,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>PSBT copied</source>
- <translation type="unfinished">PSBT copiada</translation>
+ <translation type="unfinished">TBPF copiada</translation>
</message>
<message>
<source>Copied to clipboard</source>
@@ -3936,6 +4042,10 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">%s dañado. Trata de usar la herramienta de la billetera de Bitcoin para rescatar o restaurar una copia de seguridad.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se dejó el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s solicitud para escuchar en el puerto%u. Este puerto se considera "malo" y, por lo tanto, es poco probable que algún par se conecte a él. Consulta doc/p2p-bad-ports.md para obtener detalles y una lista completa.</translation>
</message>
@@ -3964,10 +4074,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Error al cargar la billetera. Esta requiere que se descarguen bloques, y el software actualmente no admite la carga de billeteras mientras los bloques se descargan fuera de orden, cuando se usan instantáneas de assumeutxo. La billetera debería poder cargarse correctamente después de que la sincronización del nodo alcance la altura %s.</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">¡Error al leer %s! Todas las claves se leyeron correctamente, pero es probable que falten los datos de la transacción o la libreta de direcciones, o que sean incorrectos.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">¡Error al leer %s! Es probable que falten los datos de la transacción o que sean incorrectos. Rescaneando billetera.</translation>
</message>
@@ -3981,7 +4087,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <translation type="unfinished">Error: La versión del archivo volcado no es compatible. Esta versión de la billetera de Bitcoin solo admite archivos de volcado de la versión 1. Se obtuvo un archivo de volcado con la versión %s</translation>
+ <translation type="unfinished">Error: La versión del archivo de volcado no es compatible. Esta versión de la billetera de Bitcoin solo admite archivos de volcado de la versión 1. Se obtuvo un archivo de volcado con la versión %s</translation>
</message>
<message>
<source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
@@ -4036,6 +4142,10 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Poda: la última sincronización de la billetera sobrepasa los datos podados. Tienes que ejecutar -reindex (descarga toda la cadena de bloques de nuevo en caso de tener un nodo podado)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Error al cambiar el nombre de "%s" a "%s". Para resolverlo, mueve o elimina manualmente el directorio %s de la instantánea no válida. De lo contrario, encontrarás el mismo error de nuevo en el siguiente inicio.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: versión desconocida del esquema de la billetera sqlite %d. Solo se admite la versión %d.</translation>
</message>
@@ -4044,10 +4154,6 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">La base de datos de bloques contiene un bloque que parece ser del futuro. Es posible que se deba a que la fecha y hora de la computadora están mal configuradas. Reconstruye la base de datos de bloques solo si tienes la certeza de que la fecha y hora de la computadora son correctas.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">La base de datos del índice de bloques contiene un "txindex" de tipo legacy. Para borrar el espacio de disco ocupado, ejecuta un -reindex completo; de lo contrario, ignora este error. Este mensaje de error no se volverá a mostrar.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">El importe de la transacción es demasiado pequeño para enviarlo después de deducir la comisión</translation>
</message>
@@ -4084,6 +4190,10 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Se proporcionó un formato de archivo de billetera desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">El nivel de registro de la categoría específica no es compatible: %1$s=%2$s. Se esperaba %1$s=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %3$s. Niveles de registro válidos: %4 $s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">El formato de la base de datos chainstate es incompatible. Reinicia con -reindex-chainstate para reconstruir la base de datos chainstate.</translation>
</message>
@@ -4092,6 +4202,10 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">La billetera se creó correctamente. El tipo de billetera "legacy" se está descontinuando, por lo que la asistencia para crear y abrir estas billeteras se eliminará en el futuro.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">La billetera se creó correctamente. El tipo de billetera "legacy" se está descontinuando, por lo que la asistencia para crear y abrir estas billeteras se eliminará en el futuro. Las billeteras "legacy" se pueden migrar a una billetera basada en descriptores con "migratewallet".</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Advertencia: El formato de la billetera del archivo de volcado "%s" no coincide con el formato especificado en la línea de comandos "%s".</translation>
</message>
@@ -4125,7 +4239,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>Cannot resolve -%s address: '%s'</source>
- <translation type="unfinished">No se puede resolver la dirección de -%s: '%s'</translation>
+ <translation type="unfinished">No se puede resolver la dirección de -%s: "%s"</translation>
</message>
<message>
<source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
@@ -4140,30 +4254,10 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">La actualización -txindex iniciada por una versión anterior no puede completarse. Reinicia con la versión anterior o ejecuta un -reindex completo.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se dejó el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">El valor establecido para %s es demasiado alto. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -blockfilterindex. Desactiva temporalmente blockfilterindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -coinstatsindex. Desactiva temporalmente coinstatsindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -txindex. Desactiva temporalmente txindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">No se pueden proporcionar conexiones específicas y hacer que addrman encuentre conexiones salientes al mismo tiempo.</translation>
</message>
@@ -4172,6 +4266,10 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Error al cargar %s: Se está cargando la billetera firmante externa sin que se haya compilado la compatibilidad del firmante externo</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Error al leer %s. Todas las claves se leyeron correctamente, pero es probable que falten los datos de la transacción o metadatos de direcciones, o bien que sean incorrectos.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Error: No se puede identificar si los datos de la libreta de direcciones en la billetera pertenecen a billeteras migradas</translation>
</message>
@@ -4184,6 +4282,10 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
<translation type="unfinished">Error: No se puede identificar si la transacción %s en la billetera pertenece a billeteras migradas</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
@@ -4225,7 +4327,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
- <translation type="unfinished">La transacción requiere un destino de valor distinto de cero, una tasa de comisión distinta de cero, o una entrada preseleccionada.</translation>
+ <translation type="unfinished">La transacción requiere un destino de valor distinto de 0, una tasa de comisión distinta de 0, o una entrada preseleccionada.</translation>
</message>
<message>
<source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
@@ -4233,7 +4335,7 @@ Ir a "Archivo &gt; Abrir billetera" para cargar una.
</message>
<message>
<source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará el pool de memoria.</translation>
+ <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará la mempool.</translation>
</message>
<message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
@@ -4258,10 +4360,6 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">La categoría especifica de nivel de registro no es compatible: -loglevel=%s. Se espera -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %s. Niveles de registro válidos: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4282,6 +4380,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">La configuración para %s solo se aplica en la red %s cuando se encuentra en la sección [%s].</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">Derechos de autor (C) %i-%i</translation>
+ </message>
+ <message>
<source>Corrupted block database detected</source>
<translation type="unfinished">Se detectó que la base de datos de bloques está dañada.</translation>
</message>
@@ -4310,6 +4412,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error al crear %s</translation>
</message>
@@ -4343,7 +4449,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error opening block database</source>
- <translation type="unfinished">Error al abrir base de datos de bloques</translation>
+ <translation type="unfinished">Error al abrir la base de datos de bloques</translation>
</message>
<message>
<source>Error reading configuration file: %s</source>
@@ -4358,16 +4464,12 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos de la billetera</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: No se puede extraer el destino del scriptpubkey generado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción solo de lectura a la billetera respectiva</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pudieron eliminar las transacciones solo de lectura</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: No se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4383,15 +4485,15 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo crear una billetera solo de lectura</translation>
+ <translation type="unfinished">Error: No se pudo crear una billetera solo de observación</translation>
</message>
<message>
<source>Error: Got key that was not hex: %s</source>
- <translation type="unfinished">Error: Se recibió una clave que no es hex: %s</translation>
+ <translation type="unfinished">Error: Se recibió una clave que no es hexadecimal (%s)</translation>
</message>
<message>
<source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">Error: Se recibió un valor que no es hex: %s</translation>
+ <translation type="unfinished">Error: Se recibió un valor que no es hexadecimal (%s)</translation>
</message>
<message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
@@ -4406,10 +4508,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pudieron eliminar todas las transacciones solo de lectura</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Esta billetera ya usa SQLite</translation>
</message>
@@ -4434,14 +4532,35 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se pueden leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de lectura</translation>
+ <translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
<message>
<source>Error: Unable to write record to new wallet</source>
<translation type="unfinished">Error: No se puede escribir el registro en la nueva billetera</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Fallo al escuchar en todos los puertos. Usa -listen=0 si quieres hacerlo.</translation>
</message>
@@ -4450,10 +4569,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al rescanear la billetera durante la inicialización</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Error al iniciar índices, cerrando...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
@@ -4479,7 +4606,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">dbcache insuficiente para la verificación de bloques</translation>
+ <translation type="unfinished">Dbcache insuficiente para la verificación de bloques</translation>
</message>
<message>
<source>Insufficient funds</source>
@@ -4511,11 +4638,11 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Importe inválido para -%s=&lt;amount&gt;: '%s'</translation>
+ <translation type="unfinished">Importe inválido para -%s=&lt;amount&gt;: "%s"</translation>
</message>
<message>
<source>Invalid netmask specified in -whitelist: '%s'</source>
- <translation type="unfinished">Máscara de red inválida especificada en -whitelist: '%s'</translation>
+ <translation type="unfinished">Máscara de red inválida especificada en -whitelist: "%s"</translation>
</message>
<message>
<source>Invalid port specified in %s: '%s'</source>
@@ -4535,7 +4662,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Loading banlist…</source>
- <translation type="unfinished">Cargando lista de bloqueos...</translation>
+ <translation type="unfinished">Cargando lista de prohibiciones...</translation>
</message>
<message>
<source>Loading block index…</source>
@@ -4555,7 +4682,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Need to specify a port with -whitebind: '%s'</source>
- <translation type="unfinished">Se necesita especificar un puerto con -whitebind: '%s'</translation>
+ <translation type="unfinished">Se necesita especificar un puerto con -whitebind: "%s"</translation>
</message>
<message>
<source>No addresses available</source>
@@ -4583,7 +4710,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Pruning blockstore…</source>
- <translation type="unfinished">Podando almacén de bloques…</translation>
+ <translation type="unfinished">Podando almacenamiento de bloques…</translation>
</message>
<message>
<source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
@@ -4674,6 +4801,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Esta es la comisión de transacción que pagarás si envías una transacción.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">El importe de la transacción es demasiado pequeño</translation>
</message>
@@ -4686,10 +4817,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Índice de salidas de cambio de transacciones fuera de alcance</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción tiene una cadena demasiado larga del pool de memoria</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacción debe incluir al menos un destinatario</translation>
</message>
@@ -4739,7 +4866,7 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
</message>
<message>
<source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">No puede iniciar el servidor HTTP. Consulta el registro de depuración para obtener información.</translation>
+ <translation type="unfinished">No se puede iniciar el servidor HTTP. Consulta el registro de depuración para obtener información.</translation>
</message>
<message>
<source>Unable to unload the wallet before migrating</source>
@@ -4766,14 +4893,30 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">El nivel de registro global -loglevel=%s no es compatible. Valores válidos: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">El nivel de registro global %s=%s no es compatible. Valores válidos: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates no se admite en la cadena %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_DO.ts b/src/qt/locale/bitcoin_es_DO.ts
index c70dfaa321..b49fe13730 100644
--- a/src/qt/locale/bitcoin_es_DO.ts
+++ b/src/qt/locale/bitcoin_es_DO.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">Escoger</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Envío de direcciones</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Direcciones de recepción</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Estas son tus direcciones Bitcoin para realizar pagos. Verifica siempre el monto y la dirección de recepción antes de enviar monedas. </translation>
</message>
@@ -101,6 +93,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Tuvimos un problema al guardar la dirección en la lista %1. Intenta de Nuevo.</translation>
</message>
<message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Recepción de direcciones - %1
+</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Error al exportar</translation>
</message>
@@ -295,6 +292,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Monto</translation>
</message>
@@ -626,16 +631,28 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Cerrar todos los monederos</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrar una billetera</translation>
+ </message>
+ <message>
<source>&amp;Mask values</source>
<translation type="unfinished">&amp;Ocultar valores</translation>
</message>
<message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">Ocultar los valores en la pestaña de vista general</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">billetera por defecto</translation>
</message>
<message>
<source>No wallets available</source>
- <translation type="unfinished">No hay carteras disponibles</translation>
+ <translation type="unfinished">Monederos no disponibles</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -662,10 +679,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;Ventana</translation>
</message>
<message>
- <source>Main Window</source>
- <translation type="unfinished">Ventana principal</translation>
- </message>
- <message>
<source>%1 client</source>
<translation type="unfinished">%1 cliente</translation>
</message>
@@ -710,6 +723,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Error al crear billetera</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">No se puede crear una nueva billetera, el software se compiló sin soporte sqlite (requerido para billeteras descriptivas)</translation>
+ </message>
+ <message>
<source>Warning: %1</source>
<translation type="unfinished">Advertencia: %1</translation>
</message>
@@ -808,10 +829,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Comisión:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Después de tasas:</translation>
</message>
@@ -908,14 +925,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 bloqueado)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">si</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Esta etiqueta se vuelve roja si algún receptor recibe un importe inferior al umbral actual establecido para el polvo.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Puede variar en +/- %1 satoshi(s) por entrada.</translation>
</message>
@@ -935,11 +944,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>CreateWalletActivity</name>
<message>
- <source>Create Wallet</source>
- <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">Crear billetera</translation>
- </message>
- <message>
<source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
<translation type="unfinished">Creando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
@@ -975,6 +979,57 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Estas seguro de wue deseas migrar la billetera 1 %1 1 ?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">La migración de la billetera la convertirá en una o más billeteras basadas en descriptores. Será necesario realizar una nueva copia de seguridad de la billetera.
+Si esta billetera contiene scripts solo de lectura, se creará una nueva billetera que los contenga.
+Si esta billetera contiene scripts solucionables pero no de lectura, se creará una nueva billetera diferente que los contenga.
+
+El proceso de migración creará una copia de seguridad de la billetera antes de migrar. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de esta billetera. En el caso de una migración incorrecta, la copia de seguridad puede restaurarse con la funcionalidad "Restore Wallet" (Restaurar billetera).</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migración errónea</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migración correcta</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet warning</source>
@@ -987,7 +1042,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Abrir billetera</translation>
+ <translation type="unfinished">Abrir monedero</translation>
</message>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1026,10 +1081,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>WalletController</name>
<message>
- <source>Close wallet</source>
- <translation type="unfinished">Cerrar cartera</translation>
- </message>
- <message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
<translation type="unfinished">¿Estás seguro de que deseas cerrar el monedero &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
@@ -1039,7 +1090,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">Cerrar todas las billeteras</translation>
+ <translation type="unfinished">Cerrar todos los monederos</translation>
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
@@ -1049,8 +1100,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>CreateWalletDialog</name>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Estás a un paso de crear tu nueva billetera.</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Escribe un nombre y, si lo deseas, activa las opciones avanzadas.</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
- <translation type="unfinished">Nombre de la billetera </translation>
+ <translation type="unfinished">Nombre del monedero</translation>
</message>
<message>
<source>Wallet</source>
@@ -1061,10 +1120,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Encriptar la billetera. La billetera será encriptada con una contraseña de tu elección.</translation>
</message>
<message>
- <source>Advanced Options</source>
- <translation type="unfinished">Opciones Avanzadas</translation>
- </message>
- <message>
<source>Disable Private Keys</source>
<translation type="unfinished">Desactivar las claves privadas</translation>
</message>
@@ -1077,10 +1132,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Crear billetera vacía</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Use descriptores para la gestión de scriptPubKey</translation>
- </message>
- <message>
<source>External signer</source>
<translation type="unfinished">Firmante externo</translation>
</message>
@@ -1089,10 +1140,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Crear</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilado sin soporte de sqlite (requerido para billeteras descriptoras)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Compilado sin soporte de firma externa (necesario para la firma externa)</translation>
@@ -1294,10 +1341,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Incremento del progreso por hora</translation>
</message>
<message>
- <source>Estimated time left until synced</source>
- <translation type="unfinished">Tiempo estimado antes de sincronizar</translation>
- </message>
- <message>
<source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
<translation type="unfinished">%1 está actualmente sincronizándose. Descargará cabeceras y bloques de nodos semejantes y los validará hasta alcanzar la cabeza de la cadena de bloques.</translation>
</message>
@@ -1353,6 +1396,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Minimice en lugar de salir de la aplicación cuando la ventana esté cerrada. Cuando esta opción está habilitada, la aplicación se cerrará solo después de seleccionar Salir en el menú.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Las opciones establecidas en este diálogo serán anuladas por la línea de comandos:</translation>
</message>
@@ -1469,10 +1516,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Asignar puerto usando NA&amp;T-PMP</translation>
</message>
<message>
- <source>Accept connections from outside.</source>
- <translation type="unfinished">Acepta conexiones desde afuera.</translation>
- </message>
- <message>
<source>Allow incomin&amp;g connections</source>
<translation type="unfinished">Permitir conexiones entrantes</translation>
</message>
@@ -1561,18 +1604,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Usar un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña de vista general:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">"%1" insertado</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">"%1" con la coincidencia más aproximada</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Aceptar</translation>
</message>
@@ -1798,8 +1829,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT guardada en en el disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envía %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">dirección propia</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2021,10 +2056,6 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Monedero:</translation>
</message>
<message>
- <source>(none)</source>
- <translation type="unfinished">(ninguno)</translation>
- </message>
- <message>
<source>&amp;Reset</source>
<translation type="unfinished">&amp;Reestablecer</translation>
</message>
@@ -2049,6 +2080,22 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Selecciona un par para ver la información detallada.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versión de la capa de transporte: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Transporte</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Cadena de identificación de la sesión BIP324 en formato hexadecimal, si existe.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Identificador de sesión</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Si retransmitimos las transacciones a este par.</translation>
</message>
@@ -2155,10 +2202,6 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Banda ancha</translation>
</message>
<message>
- <source>Connection Time</source>
- <translation type="unfinished">Tiempo de conexión</translation>
- </message>
- <message>
<source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
<translation type="unfinished">Tiempo transcurrido desde que se recibió de este par un nuevo bloque que superó las comprobaciones de validez iniciales.</translation>
</message>
@@ -2258,6 +2301,21 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Recuperación de dirección saliente: de corta duración, para solicitar direcciones</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Detectando: el par puede ser v1 o v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocolo de transporte de texto simple sin cifrar</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: protocolo de transporte encriptado BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">Seleccionamos el par para la retransmisión de banda ancha</translation>
</message>
@@ -2300,6 +2358,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2625,10 +2687,6 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<translation type="unfinished">Entradas...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Elegir...</translation>
</message>
@@ -2719,10 +2777,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde la billetera '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 a %2</translation>
</message>
@@ -2771,6 +2825,10 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar-por-comisión", BIP-125).</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">¿Quieres crear esta transacción?</translation>
@@ -3206,8 +3264,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Indice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(No se verificó el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3292,10 +3350,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Enviado a</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pago propio</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
@@ -3367,10 +3421,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Enviado a</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">A usted mismo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
@@ -3628,6 +3678,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">%s corrupto. Intenta utilizar la herramienta de la billetera de bitcoin para rescatar o restaurar una copia de seguridad.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea no válida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Comunique este incidente a %s, indicando cómo obtuvo la instantánea. Se dejó el estado de encadenamiento de la instantánea no válida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s solicitud para escuchar en el puerto%u. Este puerto se considera "malo" y, por lo tanto, es poco probable que algún par se conecte a él. Consulta doc/p2p-bad-ports.md para obtener detalles y una lista completa.</translation>
</message>
@@ -3652,10 +3706,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error al cargar la billetera. Esta requiere que se descarguen bloques, y el software actualmente no admite la carga de billeteras mientras los bloques se descargan fuera de orden, cuando se usan instantáneas de assumeutxo. La billetera debería poder cargarse correctamente después de que la sincronización del nodo alcance la altura %s.</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">¡Error al leer %s! Todas las claves se leyeron correctamente, pero es probable que falten los datos de la transacción o la libreta de direcciones, o que sean incorrectos.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">¡Error al leer %s! Es probable que falten los datos de la transacción o que sean incorrectos. Reescaneando billetera.</translation>
</message>
@@ -3720,6 +3770,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Poda: la última sincronización de la billetera sobrepasa los datos podados. Tienes que ejecutar -reindex (descarga toda la cadena de bloques de nuevo en caso de tener un nodo podado)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Error de renombrado de «%s» → «%s». Debería resolver esto manualmente moviendo o borrando el directorio %s de la instantánea no válida, en otro caso encontrará el mismo error de nuevo en el arranque siguiente.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: versión desconocida del esquema de la billetera sqlite %d. Solo se admite la versión %d.</translation>
</message>
@@ -3728,10 +3782,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">La base de datos de bloques contiene un bloque que parece ser del futuro. Es posible que se deba a que la fecha y hora de la computadora están mal configuradas. Reconstruye la base de datos de bloques solo si tienes la certeza de que la fecha y hora de la computadora son correctas.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">La base de datos del índice de bloques contiene un "txindex" heredado. Para borrar el espacio de disco ocupado, ejecute un -reindex completo; de lo contrario, ignore este error. Este mensaje de error no se volverá a mostrar.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">El monto de la transacción es demasiado pequeño para enviarlo después de deducir la comisión</translation>
</message>
@@ -3768,6 +3818,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Se proporcionó un formato de archivo de billetera desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Nivel de boletín del acceso especificado en categoría no mantenida en %1$s=%2$s. Se esperaba %1$s=1:2. Categorías válidas: %3$s. Niveles de boletín válidos: %4 $s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">El formato de la base de datos chainstate es incompatible. Reinicia con -reindex-chainstate para reconstruir la base de datos chainstate.</translation>
</message>
@@ -3776,6 +3830,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">La billetera se creó correctamente. El tipo de billetera "legacy" se está descontinuando, por lo que la asistencia para crear y abrir estas billeteras se eliminará en el futuro.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Monedero correctamente cargado. El tipo de billetero heredado está siendo obsoleto y mantenimiento para creación de monederos heredados serán eliminados en el futuro. Los monederos heredados pueden ser migrados a un descriptor de monedero con migratewallet.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Advertencia: el formato de la billetera del archivo de volcado "%s" no coincide con el formato especificado en la línea de comandos "%s".</translation>
</message>
@@ -3824,30 +3882,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">La actualización -txindex iniciada por una versión anterior no puede completarse. Reinicia con la versión anterior o ejecuta un -reindex completo.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se dejó el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">La configuración de %s es demasiado alta. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -blockfilterindex. Desactiva temporalmente blockfilterindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -coinstatsindex. Desactiva temporalmente coinstatsindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -txindex. Desactiva temporalmente txindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">No se pueden proporcionar conexiones específicas y hacer que addrman encuentre conexiones salientes al mismo tiempo.</translation>
</message>
@@ -3856,6 +3894,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error al cargar %s: Se está cargando la billetera firmante externa sin que se haya compilado la compatibilidad del firmante externo</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Error leyendo %s. Todas las teclas leídas correctamente, pero los datos de transacción o metadatos de dirección puedan ser ausentes o incorrectos.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Error: No se puede identificar si los datos de la libreta de direcciones en la billetera pertenecen a billeteras migradas</translation>
</message>
@@ -3868,6 +3910,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error: No se puede identificar si la transacción %s en la billetera pertenece a billeteras migradas</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
@@ -3942,10 +3988,6 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">La categoría especifica de nivel de registro no es compatible: -loglevel=%s. Se espera -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %s. Niveles de registro válidos: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -3990,6 +4032,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error al crear %s</translation>
</message>
@@ -4034,16 +4080,12 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos de la billetera</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción solo de observación a la billetera respectiva</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pudo eliminar las transacciones solo de observación</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4082,10 +4124,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pudo eliminar todas las transacciones solo de observación</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Esta billetera ya usa SQLite</translation>
</message>
@@ -4110,6 +4148,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se pueden leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
@@ -4118,6 +4160,23 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se puede escribir el registro en la nueva billetera</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Ha fallado la escucha en todos los puertos. Use -listen=0 si desea esto.</translation>
</message>
@@ -4126,10 +4185,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al rescanear la billetera durante la inicialización</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Es erróneo al iniciar indizados, se apaga...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
@@ -4314,10 +4381,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El monto de la transacción es demasiado pequeño para pagar la comisión</translation>
</message>
<message>
- <source>This is experimental software.</source>
- <translation type="unfinished">Este es un software experimental.</translation>
- </message>
- <message>
<source>This is the minimum transaction fee you pay on every transaction.</source>
<translation type="unfinished">Esta es la tarifa mínima a pagar en cada transacción.</translation>
</message>
@@ -4326,6 +4389,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Esta es la tarifa a pagar si realizas una transacción.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Transacción muy pequeña</translation>
</message>
@@ -4338,10 +4405,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Índice de salidas de cambio de transacciones fuera de alcance</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción tiene largo tiempo en una cadena mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacción debe tener al menos un destinatario</translation>
</message>
@@ -4414,14 +4477,30 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">El nivel de registro de depuración global -loglevel=%s no es compatible. Valores válidos: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Nivel de acceso global %s = %s no mantenido. Los valores válidos son: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates no está mantenido en el encadenamiento %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_MX.ts b/src/qt/locale/bitcoin_es_MX.ts
index 63e21937a0..ee6865bbd7 100644
--- a/src/qt/locale/bitcoin_es_MX.ts
+++ b/src/qt/locale/bitcoin_es_MX.ts
@@ -3,260 +3,105 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Hacer clic derecho para editar la dirección o etiqueta</translation>
+ <translation type="unfinished">0xB006A7c1B9639BE87461Ee9 0xB006A7c1B9639BE87461Ee9</translation>
</message>
<message>
- <source>&amp;New</source>
- <translation type="unfinished">&amp;Nuevoa</translation>
- </message>
- <message>
- <source>C&amp;lose</source>
- <translation type="unfinished">&amp;Cerrar</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation type="unfinished">Ingresar una dirección o etiqueta para buscar</translation>
+ <source>Create a new address</source>
+ <translation type="unfinished">0xB006A7c1B9639BE87461Ee9 0xB006A7c1B9639BE87461Ee9</translation>
</message>
<message>
- <source>Choose the address to send coins to</source>
- <translation type="unfinished">Elige la dirección para enviar monedas a</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished">Elige la dirección con la que se recibirán monedas</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation type="unfinished">&amp;Seleccionar</translation>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Nuevo</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Direcciones de envío</translation>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation type="unfinished">Copiar la dirección actualmente seleccionada al portapapeles del sistema</translation>
</message>
<message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Direcciones de recepción</translation>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Enviando direcciones- %1</translation>
</message>
<message>
- <source>Comma separated file</source>
- <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Archivo separado por comas</translation>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Recepción de direcciones - %1</translation>
</message>
</context>
<context>
<name>AskPassphraseDialog</name>
<message>
<source>Encrypt wallet</source>
- <translation type="unfinished">Encriptar billetera</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation type="unfinished">Confirmar el encriptado de la billetera</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">Advertencia: Si encriptas la billetera y pierdes tu frase de contraseña, ¡&lt;b&gt;PERDERÁS TODOS TUS BITCOINS&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">¿Seguro quieres encriptar la billetera?</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation type="unfinished">Billetera encriptada</translation>
- </message>
- <message>
- <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation type="unfinished">Recuerda que encriptar tu billetera no garantiza la protección total contra el robo de tus bitcoins si la computadora está infectada con malware.</translation>
- </message>
- <message>
- <source>Wallet to be encrypted</source>
- <translation type="unfinished">Billetera para encriptar</translation>
- </message>
- <message>
- <source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">Tu billetera está a punto de encriptarse.</translation>
- </message>
- <message>
- <source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Tu billetera ahora está encriptada.</translation>
- </message>
- <message>
- <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
- <translation type="unfinished">IMPORTANTE: Cualquier copia de seguridad anterior que hayas hecho del archivo de la billetera se deberá reemplazar por el nuevo archivo encriptado que generaste. Por motivos de seguridad, las copias de seguridad realizadas anteriormente quedarán obsoletas en cuanto empieces a usar la nueva billetera encriptada.</translation>
- </message>
- <message>
- <source>Wallet encryption failed</source>
- <translation type="unfinished">Falló el encriptado de la billetera</translation>
- </message>
- <message>
- <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation type="unfinished">El encriptado de la billetera falló debido a un error interno. La billetera no se encriptó.</translation>
- </message>
- <message>
- <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">La frase de contraseña ingresada para el descifrado de la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo . Si esto tiene éxito, establece una nueva frase de contraseña para evitar este problema en el futuro.</translation>
- </message>
- <message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">La contraseña de la cartera ha sido exitosamente cambiada.</translation>
- </message>
- <message>
- <source>Passphrase change failed</source>
- <translation type="unfinished">Error al cambiar la frase de contraseña</translation>
- </message>
- <message>
- <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">La frase de contraseña que se ingresó para descifrar la billetera es incorrecta. Contiene un carácter nulo (es decir, un byte cero). Si la frase de contraseña se configuró con una versión de este software anterior a la 25.0, vuelve a intentarlo solo con los caracteres hasta el primer carácter nulo, pero sin incluirlo.</translation>
- </message>
- </context>
-<context>
- <name>BitcoinApplication</name>
- <message>
- <source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">El archivo de configuración %1 puede estar corrupto o no ser válido.</translation>
+ <translation type="unfinished">Encrypt wallet jesus daniel</translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
- <source>Do you want to reset settings to default values, or to abort without making changes?</source>
- <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
- <translation type="unfinished">¿Deseas restablecer los valores a la configuración predeterminada o abortar sin realizar los cambios?</translation>
- </message>
- <message>
- <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
- <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
- <translation type="unfinished">Un error fatal ha ocurrido. Comprueba que el archivo de configuración soporta escritura, o intenta ejecutar de nuevo el programa con -nosettings</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation type="unfinished">Importe</translation>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
</message>
<message>
- <source>Block Relay</source>
- <extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">Retransmisión de bloques</translation>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
</message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform>%n segundo</numerusform>
- <numerusform>%n segundos</numerusform>
+ <numerusform>%n second(s)</numerusform>
+ <numerusform>%n second(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform>%n minuto</numerusform>
- <numerusform>%n minutos</numerusform>
+ <numerusform>%n minute(s)</numerusform>
+ <numerusform>%n minute(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform>%n hora</numerusform>
- <numerusform>%n horas</numerusform>
+ <numerusform>%n hour(s)</numerusform>
+ <numerusform>%n hour(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
- <numerusform>%n día</numerusform>
- <numerusform>%n días</numerusform>
+ <numerusform>%n day(s)</numerusform>
+ <numerusform>%n day(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
- <numerusform>%n semana</numerusform>
- <numerusform>%n semanas</numerusform>
+ <numerusform>%n week(s)</numerusform>
+ <numerusform>%n week(s)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform>%n año</numerusform>
- <numerusform>%n años</numerusform>
+ <numerusform>%n year(s)</numerusform>
+ <numerusform>%n year(s)</numerusform>
</translation>
</message>
</context>
<context>
<name>BitcoinGUI</name>
- <message>
- <source>&amp;Minimize</source>
- <translation type="unfinished">&amp;Minimizar</translation>
- </message>
- <message>
- <source>Connecting to peers…</source>
- <translation type="unfinished">Conectando a pares...</translation>
- </message>
- <message>
- <source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished"> 
-Solicitar pagos (genera códigos QR y bitcoin: URI)
- </translation>
- </message>
- <message>
- <source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de direcciones y etiquetas de envío usadas</translation>
- </message>
- <message>
- <source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">Mostrar la lista de direcciones y etiquetas de recepción usadas</translation>
- </message>
- <message>
- <source>&amp;Command-line options</source>
- <translation type="unfinished">opciones de la &amp;Linea de comandos</translation>
- </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>%n bloque procesado del historial de transacciones.</numerusform>
- <numerusform>%n bloques procesados del historial de transacciones.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
+ <numerusform>Processed %n block(s) of transaction history.</numerusform>
</translation>
</message>
<message>
- <source>Catching up…</source>
- <translation type="unfinished">Poniéndose al día...</translation>
- </message>
- <message>
- <source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">Las transacciones después de esto todavía no serán visibles.</translation>
- </message>
- <message>
- <source>Warning</source>
- <translation type="unfinished">Aviso</translation>
- </message>
- <message>
- <source>Information</source>
- <translation type="unfinished">Información </translation>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
</message>
<message>
- <source>Up to date</source>
- <translation type="unfinished">Actualizado al dia </translation>
- </message>
- <message>
- <source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Cargar PSBT desde el &amp;portapapeles...</translation>
- </message>
- <message>
- <source>Restore Wallet…</source>
- <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
- <translation type="unfinished">Restaurar billetera…</translation>
- </message>
- <message>
- <source>Restore a wallet from a backup file</source>
- <extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">Restaurar una billetera desde un archivo de copia de seguridad</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">cartera predeterminada</translation>
- </message>
- <message>
- <source>No wallets available</source>
- <translation type="unfinished">No hay carteras disponibles</translation>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrar una billetera</translation>
</message>
<message>
<source>Load Wallet Backup</source>
@@ -289,18 +134,62 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Error al crear billetera</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">No se puede crear una nueva billetera, el software se compiló sin soporte sqlite (requerido para billeteras descriptivas)</translation>
+ </message>
+ <message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">Advertencia: %1</translation>
+ </message>
+ <message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">Fecha: %1
+</translation>
+ </message>
+ <message>
<source>Amount: %1
</source>
<translation type="unfinished">Importe: %1
</translation>
</message>
<message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">Billetera: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation type="unfinished">Tipo: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation type="unfinished">Etiqueta: %1
+</translation>
+ </message>
+ <message>
<source>Address: %1
</source>
<translation type="unfinished">Dirección: %1
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">Transacción enviada</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation type="unfinished">Transacción recibida</translation>
+ </message>
+ <message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
<translation type="unfinished">Clave privada &lt;b&gt;deshabilitada&lt;/b&gt;</translation>
</message>
@@ -320,6 +209,10 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">Selección de monedas</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">Cantidad:</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation type="unfinished">Importe:</translation>
</message>
@@ -327,110 +220,67 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<source>Fee:</source>
<translation type="unfinished">Comisión:</translation>
</message>
- <message>
- <source>Dust:</source>
- <translation type="unfinished">Remanente:</translation>
- </message>
- <message>
- <source>After Fee:</source>
- <translation type="unfinished">Después de la comisión:</translation>
- </message>
- <message>
- <source>Amount</source>
- <translation type="unfinished">Importe</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">Confirmada</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation type="unfinished">Copiar importe</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">Copiar &amp;importe</translation>
- </message>
- <message>
- <source>Copy transaction &amp;ID and output index</source>
- <translation type="unfinished">Copiar &amp;identificador de transacción e índice de salidas</translation>
- </message>
- <message>
- <source>L&amp;ock unspent</source>
- <translation type="unfinished">&amp;Bloquear importe no gastado</translation>
- </message>
- <message>
- <source>yes</source>
- <translation type="unfinished">sí</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Esta etiqueta se pone roja si algún destinatario recibe un importe menor que el actual limite del remanente monetario.</translation>
- </message>
</context>
<context>
- <name>CreateWalletActivity</name>
+ <name>MigrateWalletActivity</name>
<message>
- <source>Create Wallet</source>
- <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">Crear billetera</translation>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
</message>
<message>
- <source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
- <translation type="unfinished">Creando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
<message>
- <source>Too many external signers found</source>
- <translation type="unfinished">Se encontraron demasiados firmantes externos</translation>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">La migración de la billetera la convertirá en una o más billeteras basadas en descriptores. Será necesario realizar una nueva copia de seguridad de la billetera.
+Si esta billetera contiene scripts solo de lectura, se creará una nueva billetera que los contenga.
+Si esta billetera contiene scripts solucionables pero no de lectura, se creará una nueva billetera diferente que los contenga.
+
+El proceso de migración creará una copia de seguridad de la billetera antes de migrar. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de esta billetera. En el caso de una migración incorrecta, la copia de seguridad puede restaurarse con la funcionalidad "Restore Wallet" (Restaurar billetera).</translation>
</message>
-</context>
-<context>
- <name>LoadWalletsActivity</name>
<message>
- <source>Load Wallets</source>
- <extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
- <translation type="unfinished">Cargar monederos</translation>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
</message>
<message>
- <source>Loading wallets…</source>
- <extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
- <translation type="unfinished">Cargando monederos...</translation>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
</message>
-</context>
-<context>
- <name>RestoreWalletActivity</name>
<message>
- <source>Restore Wallet</source>
- <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">Restaurar billetera</translation>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
</message>
<message>
- <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">Restaurando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
</message>
<message>
- <source>Restore wallet failed</source>
- <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">Error al restaurar la billetera</translation>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
</message>
<message>
- <source>Restore wallet warning</source>
- <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
- <translation type="unfinished">Advertencia al restaurar billetera</translation>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migración errónea</translation>
</message>
<message>
- <source>Restore wallet message</source>
- <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">Mensaje al restaurar billetera</translation>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migración correcta</translation>
</message>
</context>
<context>
- <name>WalletController</name>
+ <name>CreateWalletDialog</name>
<message>
- <source>Close wallet</source>
- <translation type="unfinished">Cerrar cartera</translation>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Estás a un paso de crear tu nueva billetera.</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Escribe un nombre y, si lo deseas, activa las opciones avanzadas.</translation>
</message>
</context>
<context>
@@ -438,8 +288,8 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform>%n GB de espacio disponible</numerusform>
- <numerusform>%n GB de espacio disponible</numerusform>
+ <numerusform>%n GB of space available</numerusform>
+ <numerusform>%n GB of space available</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -456,1094 +306,153 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<numerusform>(%n GB needed for full chain)</numerusform>
</translation>
</message>
- <message>
- <source>Choose data directory</source>
- <translation type="unfinished">Elegir directorio de datos</translation>
- </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
- <numerusform>(suficiente para restaurar copias de seguridad de %n día de antigüedad)</numerusform>
- <numerusform>(suficiente para restaurar copias de seguridad de %n días de antigüedad)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
</translation>
</message>
- <message>
- <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
- <translation type="unfinished">Al hacer clic en OK, %1 iniciará el proceso de descarga y procesará la cadena de bloques %4 completa (%2 GB), empezando con la transacción más antigua en %3 cuando %4 se ejecutó inicialmente.</translation>
- </message>
</context>
<context>
- <name>ModalOverlay</name>
- <message>
- <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Desconocido. Presincronizando encabezados (%1, %2%)…</translation>
- </message>
-</context>
-<context>
- <name>OpenURIDialog</name>
- <message>
- <source>Paste address from clipboard</source>
- <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">Pegar dirección desde el portapapeles</translation>
- </message>
-</context>
-<context>
<name>OptionsDialog</name>
<message>
- <source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">Al activar el modo de podado, se reduce considerablemente el espacio de disco necesario para almacenar las transacciones. Todos los bloques aún se validan completamente. Para revertir esta opción, se requiere descargar de nuevo toda la cadena de bloques.</translation>
- </message>
- <message>
- <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
- <translation type="unfinished">Ruta completa a un script compatible con %1 (p. ej., C:\Descargas\hwi.exe o /Usuarios/Tú/Descargas/hwi.py). Advertencia: ¡El malware podría robarte tus monedas!</translation>
- </message>
- <message>
- <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
- <translation type="unfinished">Minimice en lugar de salir de la aplicación cuando la ventana esté cerrada. Cuando esta opción está habilitada, la aplicación se cerrará solo después de seleccionar Salir en el menú.</translation>
- </message>
- <message>
- <source>Options set in this dialog are overridden by the command line:</source>
- <translation type="unfinished">Las opciones establecidas en este diálogo serán anuladas por la línea de comandos:</translation>
- </message>
- <message>
- <source>Open Configuration File</source>
- <translation type="unfinished">Abrir archivo de configuración</translation>
- </message>
- <message>
- <source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
- <extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
- <translation type="unfinished">Tamaño máximo de la caché de la base de datos. Una caché más grande puede contribuir a una sincronización más rápida, después de lo cual el beneficio es menos pronunciado para la mayoría de los casos de uso. Disminuir el tamaño de la caché reducirá el uso de la memoria. La memoria mempool no utilizada se comparte para esta caché.</translation>
- </message>
- <message>
- <source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
- <extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
- <translation type="unfinished">Establezca el número de hilos de verificación de scripts. Los valores negativos corresponden al número de núcleos que se desea dejar libres al sistema.</translation>
- </message>
- <message>
- <source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
- <extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
- <translation type="unfinished">Esto le permite a usted o a una herramienta de terceros comunicarse con el nodo a través de la línea de comandos y los comandos JSON-RPC.</translation>
- </message>
- <message>
- <source>Enable R&amp;PC server</source>
- <extracomment>An Options window setting to enable the RPC server.</extracomment>
- <translation type="unfinished">Activar servidor R&amp;PC</translation>
- </message>
- <message>
- <source>W&amp;allet</source>
- <translation type="unfinished">&amp;Billetera</translation>
- </message>
- <message>
- <source>Whether to set subtract fee from amount as default or not.</source>
- <extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
- <translation type="unfinished">Si se resta la comisión del importe por defecto o no.</translation>
- </message>
- <message>
- <source>Subtract &amp;fee from amount by default</source>
- <extracomment>An Options window setting to set subtracting the fee from a sending amount as default.</extracomment>
- <translation type="unfinished">Restar &amp;comisión del importe por defecto</translation>
- </message>
- <message>
- <source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
- <translation type="unfinished">Si deshabilitas el gasto del cambio sin confirmar, no se puede usar el cambio de una transacción hasta que esta tenga al menos una confirmación. Esto también afecta cómo se calcula el saldo.</translation>
- </message>
- <message>
- <source>&amp;Spend unconfirmed change</source>
- <translation type="unfinished">&amp;Gastar cambio sin confirmar</translation>
- </message>
- <message>
- <source>Enable &amp;PSBT controls</source>
- <extracomment>An options window setting to enable PSBT controls.</extracomment>
- <translation type="unfinished">Activar controles de &amp;PSBT</translation>
- </message>
- <message>
- <source>Whether to show PSBT controls.</source>
- <extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
- <translation type="unfinished">Si se muestran los controles de PSBT.</translation>
- </message>
- <message>
- <source>External Signer (e.g. hardware wallet)</source>
- <translation type="unfinished">Firmante externo (p. ej., billetera de hardware)</translation>
- </message>
- <message>
- <source>&amp;External signer script path</source>
- <translation type="unfinished">&amp;Ruta al script del firmante externo</translation>
- </message>
- <message>
- <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
- <translation type="unfinished">Abrir automáticamente el puerto del cliente de Bitcoin en el router. Esto solo funciona cuando el router es compatible con NAT-PMP y está activo. El puerto externo podría ser aleatorio</translation>
- </message>
- <message>
- <source>Map port using NA&amp;T-PMP</source>
- <translation type="unfinished">Asignar puerto usando NA&amp;T-PMP</translation>
- </message>
- <message>
- <source>User Interface &amp;language:</source>
- <translation type="unfinished">&amp;Lenguaje de la interfaz de usuario:</translation>
- </message>
- <message>
- <source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
- <translation type="unfinished">Las URL de terceros (por ejemplo, un explorador de bloques) que aparecen en la pestaña de transacciones como elementos del menú contextual. El hash de la transacción remplaza el valor %s en la URL. Varias URL se separan con una barra vertical (|).</translation>
- </message>
- <message>
- <source>&amp;Third-party transaction URLs</source>
- <translation type="unfinished">&amp;URL de transacciones de terceros</translation>
- </message>
- <message>
- <source>none</source>
- <translation type="unfinished">ninguno</translation>
- </message>
- <message>
- <source>Current settings will be backed up at "%1".</source>
- <extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
- <translation type="unfinished">Se realizará una copia de seguridad de la configuración actual en "%1".</translation>
- </message>
- <message>
- <source>Continue</source>
- <translation type="unfinished">Continuar</translation>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
</message>
</context>
<context>
- <name>OptionsModel</name>
- <message>
- <source>Could not read setting "%1", %2.</source>
- <translation type="unfinished">No se puede leer la configuración "%1", %2.</translation>
- </message>
-</context>
-<context>
<name>PSBTOperationsDialog</name>
<message>
- <source>PSBT Operations</source>
- <translation type="unfinished">Operaciones PSBT</translation>
- </message>
- <message>
- <source>Cannot sign inputs while wallet is locked.</source>
- <translation type="unfinished">No se pueden firmar entradas mientras la billetera está bloqueada.</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (Binary)</source>
- <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Transacción firmada parcialmente (binaria) </translation>
- </message>
- <message>
- <source>Total Amount</source>
- <translation type="unfinished">Importe total</translation>
- </message>
- <message>
- <source>(But no wallet is loaded.)</source>
- <translation type="unfinished">(Pero no se cargó ninguna billetera).</translation>
- </message>
- </context>
-<context>
- <name>PaymentServer</name>
- <message>
- <source>Cannot process payment request because BIP70 is not supported.
-Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
-If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
- <translation type="unfinished">No se puede procesar la solicitud de pago porque no existe compatibilidad con BIP70.
-Debido a los fallos de seguridad generalizados en BIP70, se recomienda encarecidamente ignorar las instrucciones del comerciante para cambiar de billetera.
-Si recibes este error, debes solicitar al comerciante que te proporcione un URI compatible con BIP21.</translation>
- </message>
- </context>
-<context>
- <name>PeerTableModel</name>
- <message>
- <source>Age</source>
- <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">Duración</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
</message>
</context>
<context>
<name>RPCConsole</name>
<message>
- <source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">Si retransmitimos las transacciones a este par.</translation>
- </message>
- <message>
- <source>Transaction Relay</source>
- <translation type="unfinished">Retransmisión de transacción</translation>
- </message>
- <message>
- <source>Last Transaction</source>
- <translation type="unfinished">Última transacción</translation>
- </message>
- <message>
- <source>Whether we relay addresses to this peer.</source>
- <extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Si retransmitimos las direcciones a este par.</translation>
- </message>
- <message>
- <source>Address Relay</source>
- <extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">Retransmisión de dirección</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
- <extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">El número total de direcciones recibidas desde este par que se procesaron (excluye las direcciones omitidas debido a la limitación de volumen).</translation>
- </message>
- <message>
- <source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
- <extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">El número total de direcciones recibidas desde este par que se omitieron (no se procesaron) debido a la limitación de volumen.</translation>
- </message>
- <message>
- <source>Addresses Processed</source>
- <extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">Direcciones procesadas</translation>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versión de la capa de transporte: %1</translation>
</message>
<message>
- <source>Addresses Rate-Limited</source>
- <extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">Direcciones omitidas por limitación de volumen</translation>
+ <source>Transport</source>
+ <translation type="unfinished">Transporte</translation>
</message>
<message>
- <source>Last Send</source>
- <translation type="unfinished">Último envío</translation>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Cadena de identificación de la sesión BIP324 en formato hexadecimal, si existe.</translation>
</message>
<message>
- <source>Last Receive</source>
- <translation type="unfinished">Última recepción</translation>
+ <source>Session ID</source>
+ <translation type="unfinished">Identificador de sesión</translation>
</message>
<message>
- <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
- <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
- <translation type="unfinished">Recuperación de dirección saliente: de corta duración, para solicitar direcciones</translation>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Detectando: el par puede ser v1 o v2</translation>
</message>
<message>
- <source>&amp;Copy IP/Netmask</source>
- <extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
- <translation type="unfinished">&amp;Copiar IP/Máscara de red</translation>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocolo de transporte de texto simple sin cifrar</translation>
</message>
<message>
- <source>Executing command without any wallet</source>
- <translation type="unfinished">Ejecutar comando sin ninguna billetera</translation>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: protocolo de transporte encriptado BIP324</translation>
</message>
<message>
- <source>Welcome to the %1 RPC console.
-Use up and down arrows to navigate history, and %2 to clear screen.
-Use %3 and %4 to increase or decrease the font size.
-Type %5 for an overview of available commands.
-For more information on using this console, type %6.
-
-%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
- <extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
- <translation type="unfinished">Te damos la bienvenida a la consola RPC de %1.
-Utiliza las flechas hacia arriba y abajo para navegar por el historial y %2 para borrar la pantalla.
-Utiliza %3 y %4 para aumentar o disminuir el tamaño de la fuente.
-Escribe %5 para ver los comandos disponibles.
-Para obtener más información sobre cómo usar esta consola, escribe %6.
-
-%7 ADVERTENCIA: Los estafadores han estado activos diciendo a los usuarios que escriban comandos aquí, robando el contenido de sus billeteras. No uses esta consola sin entender completamente las ramificaciones de un comando.%8</translation>
- </message>
- <message>
- <source>Yes</source>
- <translation type="unfinished">Sí</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">De</translation>
- </message>
- </context>
-<context>
- <name>ReceiveCoinsDialog</name>
- <message>
- <source>&amp;Amount:</source>
- <translation type="unfinished">&amp;Importe:</translation>
- </message>
- <message>
- <source>&amp;Message:</source>
- <translation type="unfinished">&amp;Mensaje:</translation>
- </message>
- <message>
- <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
- <translation type="unfinished">Mensaje opcional para adjuntar a la solicitud de pago, que se mostrará cuando se abra la solicitud. Nota: Este mensaje no se enviará con el pago a través de la red de Bitcoin.</translation>
- </message>
- <message>
- <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">Usa este formulario para solicitar pagos. Todos los campos son &lt;b&gt;opcionales&lt;/b&gt;.</translation>
- </message>
- <message>
- <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
- <translation type="unfinished">Un importe opcional para solicitar. Déjalo vacío o pon cero para no solicitar un importe específico.</translation>
- </message>
- <message>
- <source>&amp;Create new receiving address</source>
- <translation type="unfinished">&amp;Crear nueva dirección de recepción</translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">Borrar todos los campos del formulario.</translation>
- </message>
- <message>
- <source>Clear</source>
- <translation type="unfinished">Borrar</translation>
- </message>
- <message>
- <source>Show the selected request (does the same as double clicking an entry)</source>
- <translation type="unfinished">Mostrar la solicitud seleccionada (equivale a hacer doble clic en una entrada)</translation>
- </message>
- <message>
- <source>Remove the selected entries from the list</source>
- <translation type="unfinished">Eliminar las entradas seleccionadas de la lista</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">Copiar &amp;importe</translation>
- </message>
- <message>
- <source>Not recommended due to higher fees and less protection against typos.</source>
- <translation type="unfinished">No se recomienda debido a las altas comisiones y la poca protección contra errores tipográficos.</translation>
- </message>
- <message>
- <source>Generates an address compatible with older wallets.</source>
- <translation type="unfinished">Genera una dirección compatible con billeteras más antiguas.</translation>
- </message>
- <message>
- <source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
- <translation type="unfinished">Genera una dirección segwit nativa (BIP-173). No es compatible con algunas billeteras antiguas.</translation>
- </message>
- <message>
- <source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
- <translation type="unfinished">Bech32m (BIP-350) es una actualización de Bech32. La compatibilidad con la billetera todavía es limitada.</translation>
- </message>
- </context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Amount:</source>
- <translation type="unfinished">Importe:</translation>
- </message>
- <message>
- <source>Copy &amp;Address</source>
- <translation type="unfinished">Copiar &amp;dirección</translation>
- </message>
- <message>
- <source>Verify this address on e.g. a hardware wallet screen</source>
- <translation type="unfinished">Verificar esta dirección, por ejemplo, en la pantalla de una billetera de hardware</translation>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
</message>
</context>
<context>
<name>SendCoinsDialog</name>
<message>
- <source>Amount:</source>
- <translation type="unfinished">Importe:</translation>
- </message>
- <message>
- <source>Fee:</source>
- <translation type="unfinished">Comisión:</translation>
- </message>
- <message>
- <source>After Fee:</source>
- <translation type="unfinished">Después de la comisión:</translation>
- </message>
- <message>
- <source>Clear all fields of the form.</source>
- <translation type="unfinished">Borrar todos los campos del formulario.</translation>
- </message>
- <message>
- <source>Dust:</source>
- <translation type="unfinished">Remanente:</translation>
- </message>
- <message>
- <source>Confirm the send action</source>
- <translation type="unfinished">Confirmar el envío</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation type="unfinished">Copiar importe</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (Binary)</source>
- <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">Transacción firmada parcialmente (binaria) </translation>
- </message>
- <message>
- <source>Do you want to create this transaction?</source>
- <extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
- <translation type="unfinished">¿Quieres crear esta transacción?</translation>
- </message>
- <message>
- <source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">Revisa por favor la transacción. Puedes crear y enviar esta transacción de Bitcoin parcialmente firmada (PSBT), que además puedes guardar o copiar y, luego, firmar; por ejemplo, una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
+ <source>Quantity:</source>
+ <translation type="unfinished">Cantidad:</translation>
</message>
<message>
- <source>Please, review your transaction.</source>
- <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
- <translation type="unfinished">Revisa la transacción.</translation>
- </message>
- <message>
- <source>Total Amount</source>
- <translation type="unfinished">Importe total</translation>
- </message>
- <message>
- <source>Unsigned Transaction</source>
- <comment>PSBT copied</comment>
- <extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
- <translation type="unfinished">Transacción sin firmar</translation>
- </message>
- <message>
- <source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">Se copió la PSBT al portapapeles. También puedes guardarla.</translation>
- </message>
- <message>
- <source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT guardada en el disco</translation>
- </message>
- <message>
- <source>The recipient address is not valid. Please recheck.</source>
- <translation type="unfinished">La dirección del destinatario no es válida. Revísala.</translation>
- </message>
- <message>
- <source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">El importe por pagar tiene que ser mayor que 0.</translation>
- </message>
- <message>
- <source>The amount exceeds your balance.</source>
- <translation type="unfinished">El importe sobrepasa el saldo.</translation>
- </message>
- <message>
- <source>Duplicate address found: addresses should only be used once each.</source>
- <translation type="unfinished">Se encontró una dirección duplicada: las direcciones solo se deben usar una vez.</translation>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero '%2'</translation>
</message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>Estimado para comenzar confirmación dentro de %n bloque.</numerusform>
- <numerusform>Estimado para comenzar confirmación dentro de %n bloques.</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
+ <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
</translation>
</message>
- <message>
- <source>Warning: Invalid Bitcoin address</source>
- <translation type="unfinished">Advertencia: Dirección de Bitcoin inválida</translation>
- </message>
- <message>
- <source>Warning: Unknown change address</source>
- <translation type="unfinished">Advertencia: Dirección de cambio desconocida</translation>
- </message>
- <message>
- <source>Confirm custom change address</source>
- <translation type="unfinished">Confirmar la dirección de cambio personalizada</translation>
- </message>
- </context>
-<context>
- <name>SendCoinsEntry</name>
- <message>
- <source>A&amp;mount:</source>
- <translation type="unfinished">&amp;Importe:</translation>
- </message>
- <message>
- <source>Pay &amp;To:</source>
- <translation type="unfinished">Pagar &amp;a:</translation>
- </message>
- <message>
- <source>The Bitcoin address to send the payment to</source>
- <translation type="unfinished">La dirección de Bitcoin a la que se enviará el pago</translation>
- </message>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Pegar dirección desde el portapapeles</translation>
- </message>
- <message>
- <source>Remove this entry</source>
- <translation type="unfinished">Eliminar esta entrada</translation>
- </message>
- <message>
- <source>Enter a label for this address to add it to the list of used addresses</source>
- <translation type="unfinished">Ingresar una etiqueta para esta dirección a fin de agregarla a la lista de direcciones utilizadas</translation>
- </message>
- </context>
-<context>
- <name>SignVerifyMessageDialog</name>
- <message>
- <source>Paste address from clipboard</source>
- <translation type="unfinished">Pegar dirección desde el portapapeles</translation>
- </message>
</context>
<context>
- <name>SplashScreen</name>
- <message>
- <source>(press q to shutdown and continue later)</source>
- <translation type="unfinished">(presiona q para apagar y seguir luego)</translation>
- </message>
- <message>
- <source>press q to shutdown</source>
- <translation type="unfinished">presiona q para apagar </translation>
- </message>
-</context>
-<context>
<name>TransactionDesc</name>
- <message>
- <source>0/unconfirmed, in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
- <translation type="unfinished">0/sin confirmar, en el pool de memoria</translation>
- </message>
- <message>
- <source>0/unconfirmed, not in memory pool</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
- <translation type="unfinished">0/sin confirmar, no está en el pool de memoria</translation>
- </message>
- <message>
- <source>%1/unconfirmed</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
- <translation type="unfinished">%1/sin confirmar</translation>
- </message>
- <message>
- <source>%1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
- <translation type="unfinished">%1 confirmaciones</translation>
- </message>
- <message>
- <source>From</source>
- <translation type="unfinished">De</translation>
- </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>madura en %n bloque más</numerusform>
- <numerusform>madura en %n bloques más</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
+ <numerusform>matures in %n more block(s)</numerusform>
</translation>
</message>
<message>
- <source>Amount</source>
- <translation type="unfinished">Importe</translation>
- </message>
- </context>
-<context>
- <name>TransactionDescDialog</name>
- <message>
- <source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">En este panel se muestra una descripción detallada de la transacción</translation>
- </message>
- </context>
-<context>
- <name>TransactionTableModel</name>
- <message>
- <source>Confirmed (%1 confirmations)</source>
- <translation type="unfinished">Confirmada (%1 confirmaciones)</translation>
- </message>
- <message>
- <source>Generated but not accepted</source>
- <translation type="unfinished">Generada pero no aceptada</translation>
- </message>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Recibida con</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Enviada a</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Minada</translation>
- </message>
- <message>
- <source>Date and time that the transaction was received.</source>
- <translation type="unfinished">Fecha y hora en las que se recibió la transacción.</translation>
- </message>
- <message>
- <source>Amount removed from or added to balance.</source>
- <translation type="unfinished">Importe restado del saldo o sumado a este.</translation>
- </message>
-</context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Received with</source>
- <translation type="unfinished">Recibida con</translation>
- </message>
- <message>
- <source>Sent to</source>
- <translation type="unfinished">Enviada a</translation>
- </message>
- <message>
- <source>Mined</source>
- <translation type="unfinished">Minada</translation>
- </message>
- <message>
- <source>Min amount</source>
- <translation type="unfinished">Importe mínimo</translation>
- </message>
- <message>
- <source>Copy &amp;amount</source>
- <translation type="unfinished">Copiar &amp;importe</translation>
- </message>
- <message>
- <source>Copy transaction &amp;ID</source>
- <translation type="unfinished">Copiar &amp;identificador de transacción</translation>
- </message>
- <message>
- <source>Copy &amp;raw transaction</source>
- <translation type="unfinished">Copiar transacción &amp;sin procesar</translation>
- </message>
- <message>
- <source>A&amp;bandon transaction</source>
- <translation type="unfinished">&amp;Abandonar transacción</translation>
- </message>
- <message>
- <source>Show in %1</source>
- <extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
- <translation type="unfinished">Mostrar en %1</translation>
- </message>
- <message>
- <source>Comma separated file</source>
- <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Archivo separado por comas</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">Confirmada</translation>
- </message>
- <message>
- <source>The transaction history was successfully saved to %1.</source>
- <translation type="unfinished">El historial de transacciones se guardó correctamente en %1.</translation>
- </message>
- <message>
- <source>to</source>
- <translation type="unfinished">a</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Copied to clipboard</source>
- <comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">Copiada al portapapeles</translation>
- </message>
- </context>
-<context>
- <name>WalletView</name>
- <message>
- <source>There was an error trying to save the wallet data to %1.</source>
- <translation type="unfinished">Hubo un error al intentar guardar los datos de la billetera en %1.</translation>
- </message>
- <message>
- <source>The wallet data was successfully saved to %1.</source>
- <translation type="unfinished">Los datos de la billetera se guardaron correctamente en %1.</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
</context>
<context>
<name>bitcoin-core</name>
<message>
- <source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
- <translation type="unfinished">%s solicitud para escuchar en el puerto%u. Este puerto se considera "malo" y, por lo tanto, es poco probable que algún par se conecte a él. Consulta doc/p2p-bad-ports.md para obtener detalles y una lista completa.</translation>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
</message>
<message>
- <source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
- <translation type="unfinished">Es posible que el espacio en disco %s no tenga capacidad para los archivos de bloque. Aproximadamente %u GB de datos se almacenarán en este directorio.</translation>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
- <translation type="unfinished">Error al cargar la billetera. Esta requiere que se descarguen bloques, y el software actualmente no admite la carga de billeteras mientras los bloques se descargan fuera de orden, cuando se usan instantáneas de assumeutxo. La billetera debería poder cargarse correctamente después de que la sincronización del nodo alcance la altura %s.</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
- <translation type="unfinished">¡Error al leer %s! Es probable que falten los datos de la transacción o que sean incorrectos. Reescaneando billetera.</translation>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
</message>
<message>
- <source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
- <translation type="unfinished">Error: el registro del formato del archivo de volcado es incorrecto. Se obtuvo "%s"; se esperaba "formato".</translation>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
</message>
<message>
- <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">Error: el registro del identificador del archivo de volcado es incorrecto. Se obtuvo "%s"; se esperaba "%s".</translation>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
</message>
<message>
- <source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <translation type="unfinished">Error: la versión del archivo volcado no es compatible. Esta versión de la billetera de bitcoin solo admite archivos de volcado de la versión 1. Se obtuvo un archivo de volcado con la versión %s</translation>
- </message>
- <message>
- <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
- <translation type="unfinished">Error: las billeteras heredadas solo admiten los tipos de dirección "legacy", "p2sh-segwit" y "bech32".</translation>
- </message>
- <message>
- <source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">Error: No se pueden producir descriptores para esta billetera tipo legacy. Asegúrate de proporcionar la frase de contraseña de la billetera si está encriptada.</translation>
- </message>
- <message>
- <source>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>
- <translation type="unfinished">Archivo peers.dat inválido o corrupto (%s). Si crees que se trata de un error, infórmalo a %s. Como alternativa, puedes quitar el archivo (%s) (renombrarlo, moverlo o eliminarlo) para que se cree uno nuevo en el siguiente inicio.</translation>
- </message>
- <message>
- <source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">No se proporcionó el archivo de volcado. Para usar createfromdump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
- </message>
- <message>
- <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">No se proporcionó el archivo de volcado. Para usar dump, se debe proporcionar -dumpfile=&lt;filename&gt;.</translation>
- </message>
- <message>
- <source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <translation type="unfinished">No se proporcionó el formato de archivo de billetera. Para usar createfromdump, se debe proporcionar -format=&lt;format&gt;.</translation>
- </message>
- <message>
- <source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
- <translation type="unfinished">El modo de poda no es compatible con -reindex-chainstate. Usa en su lugar un -reindex completo.</translation>
- </message>
- <message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">La base de datos del índice de bloques contiene un "txindex" heredado. Para borrar el espacio de disco ocupado, ejecute un -reindex completo; de lo contrario, ignore este error. Este mensaje de error no se volverá a mostrar.</translation>
- </message>
- <message>
- <source>The transaction amount is too small to send after the fee has been deducted</source>
- <translation type="unfinished">El importe de la transacción es demasiado pequeño para enviarlo después de deducir la comisión</translation>
- </message>
- <message>
- <source>This is the transaction fee you may pay when fee estimates are not available.</source>
- <translation type="unfinished">Esta es la comisión de transacción que puedes pagar cuando los cálculos de comisiones no estén disponibles.</translation>
- </message>
- <message>
- <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
- <translation type="unfinished">Se proporcionó un formato de archivo de billetera desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
- </message>
- <message>
- <source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
- <translation type="unfinished">El formato de la base de datos chainstate es incompatible. Reinicia con -reindex-chainstate para reconstruir la base de datos chainstate.</translation>
- </message>
- <message>
- <source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
- <translation type="unfinished">La billetera se creó correctamente. El tipo de billetera "legacy" se está descontinuando, por lo que la asistencia para crear y abrir estas billeteras se eliminará en el futuro.</translation>
- </message>
- <message>
- <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
- <translation type="unfinished">Advertencia: el formato de la billetera del archivo de volcado "%s" no coincide con el formato especificado en la línea de comandos "%s".</translation>
- </message>
- <message>
- <source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
- <translation type="unfinished">Los datos del testigo para los bloques después de la altura %d requieren validación. Reinicia con -reindex.</translation>
- </message>
- <message>
- <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <translation type="unfinished">No se puede establecer el valor de -forcednsseed con la variable true al establecer el valor de -dnsseed con la variable false.</translation>
- </message>
- <message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">La actualización -txindex iniciada por una versión anterior no puede completarse. Reinicia con la versión anterior o ejecuta un -reindex completo.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se dejó el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
- </message>
- <message>
- <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
- <translation type="unfinished">La configuración de %s es demasiado alta. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -blockfilterindex. Desactiva temporalmente blockfilterindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -coinstatsindex. Desactiva temporalmente coinstatsindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -txindex. Desactiva temporalmente txindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
- <translation type="unfinished">No se pueden proporcionar conexiones específicas y hacer que addrman encuentre conexiones salientes al mismo tiempo.</translation>
- </message>
- <message>
- <source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
- <translation type="unfinished">Error al cargar %s: Se está cargando la billetera firmante externa sin que se haya compilado la compatibilidad del firmante externo</translation>
- </message>
- <message>
- <source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Error: No se puede identificar si los datos de la libreta de direcciones en la billetera pertenecen a billeteras migradas</translation>
- </message>
- <message>
- <source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
- <translation type="unfinished">Error: Se crearon descriptores duplicados durante la migración. Tu billetera podría estar dañada.</translation>
- </message>
- <message>
- <source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Error: No se puede identificar si la transacción %s en la billetera pertenece a billeteras migradas</translation>
- </message>
- <message>
- <source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
- <translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
- </message>
- <message>
- <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
- <translation type="unfinished">Error al calcular la comisión. La opción "fallbackfee" está desactivada. Espera algunos bloques o activa %s.</translation>
- </message>
- <message>
- <source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
- <translation type="unfinished">Opciones incompatibles: -dnsseed=1 se especificó explícitamente, pero -onlynet prohíbe conexiones a IPv4/IPv6.</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s" (debe ser al menos la comisión mínima de retransmisión de %s para evitar transacciones atascadas)</translation>
- </message>
- <message>
- <source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
- <translation type="unfinished">Las conexiones salientes están restringidas a CJDNS (-onlynet=cjdns), pero no se proporciona -cjdnsreachable</translation>
- </message>
- <message>
- <source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0</source>
- <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero el proxy para conectarse con la red Tor está explícitamente prohibido: -onion=0.</translation>
- </message>
- <message>
- <source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given</source>
- <translation type="unfinished">Las conexiones salientes están restringidas a Tor (-onlynet=onion), pero no se proporciona el proxy para conectarse con la red Tor: no se indican -proxy, -onion ni -listenonion.</translation>
- </message>
- <message>
- <source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
- <translation type="unfinished">Las conexiones salientes están restringidas a i2p (-onlynet=i2p), pero no se proporciona -i2psam</translation>
- </message>
- <message>
- <source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">El tamaño de las entradas supera el peso máximo. Intenta enviar una cantidad menor o consolidar manualmente las UTXO de la billetera.</translation>
- </message>
- <message>
- <source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
- <translation type="unfinished">La cantidad total de monedas preseleccionadas no cubre la meta de la transacción. Permite que se seleccionen automáticamente otras entradas o incluye más monedas manualmente.</translation>
- </message>
- <message>
- <source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
- <translation type="unfinished">La transacción requiere un destino de valor distinto de cero, una tasa de comisión distinta de cero, o una entrada preseleccionada.</translation>
- </message>
- <message>
- <source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
- <translation type="unfinished">No se validó la instantánea de UTXO. Reinicia para reanudar la descarga de bloques inicial normal o intenta cargar una instantánea diferente.</translation>
- </message>
- <message>
- <source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">Las UTXO sin confirmar están disponibles, pero si se gastan, se crea una cadena de transacciones que rechazará el pool de memoria.</translation>
- </message>
- <message>
- <source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
-
-The wallet might have been tampered with or created with malicious intent.
-</source>
- <translation type="unfinished">Se encontró una entrada heredada inesperada en la billetera del descriptor. Cargando billetera%s
-
-Es posible que la billetera haya sido manipulada o creada con malas intenciones.
-</translation>
- </message>
- <message>
- <source>Unrecognized descriptor found. Loading wallet %s
-
-The wallet might had been created on a newer version.
-Please try running the latest software version.
-</source>
- <translation type="unfinished">Se encontró un descriptor desconocido. Cargando billetera %s.
-
-La billetera se pudo hacer creado con una versión más reciente.
-Intenta ejecutar la última versión del software.
-</translation>
- </message>
- <message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">La categoría especifica de nivel de registro no es compatible: -loglevel=%s. Se espera -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %s. Niveles de registro válidos: %s.</translation>
- </message>
- <message>
- <source>
-Unable to cleanup failed migration</source>
- <translation type="unfinished">
-No se puede limpiar la migración fallida</translation>
- </message>
- <message>
- <source>
-Unable to restore backup of wallet.</source>
- <translation type="unfinished">
-No se puede restaurar la copia de seguridad de la billetera.</translation>
- </message>
- <message>
- <source>Block verification was interrupted</source>
- <translation type="unfinished">Se interrumpió la verificación de bloques</translation>
- </message>
- <message>
- <source>Dump file %s does not exist.</source>
- <translation type="unfinished">El archivo de volcado %s no existe.</translation>
- </message>
- <message>
- <source>Error reading configuration file: %s</source>
- <translation type="unfinished">Error al leer el archivo de configuración: %s</translation>
- </message>
- <message>
- <source>Error reading from database, shutting down.</source>
- <translation type="unfinished">Error al leer la base de datos. Se cerrará la aplicación.</translation>
- </message>
- <message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción solo de observación a la billetera respectiva</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pudo eliminar las transacciones solo de observación</translation>
- </message>
- <message>
- <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
- <translation type="unfinished">Error: La suma de comprobación del archivo de volcado no coincide. Calculada:%s; prevista:%s.</translation>
- </message>
- <message>
- <source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo crear una billetera solo de observación</translation>
- </message>
- <message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pudo eliminar todas las transacciones solo de observación</translation>
- </message>
- <message>
- <source>Error: This wallet already uses SQLite</source>
- <translation type="unfinished">Error: Esta billetera ya usa SQLite</translation>
- </message>
- <message>
- <source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Error: Esta billetera ya es de descriptores</translation>
- </message>
- <message>
- <source>Error: Unable to begin reading all records in the database</source>
- <translation type="unfinished">Error: No se puede comenzar a leer todos los registros en la base de datos</translation>
- </message>
- <message>
- <source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">Error: No se puede realizar una copia de seguridad de tu billetera</translation>
- </message>
- <message>
- <source>Error: Unable to parse version %u as a uint32_t</source>
- <translation type="unfinished">Error: No se puede analizar la versión %ucomo uint32_t</translation>
- </message>
- <message>
- <source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">Error: No se pueden leer todos los registros en la base de datos</translation>
- </message>
- <message>
- <source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de observación</translation>
- </message>
- <message>
- <source>Input not found or already spent</source>
- <translation type="unfinished">No se encontró o ya se gastó la entrada</translation>
- </message>
- <message>
- <source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">dbcache insuficiente para la verificación de bloques</translation>
- </message>
- <message>
- <source>Invalid -i2psam address or hostname: '%s'</source>
- <translation type="unfinished">Dirección -i2psam o nombre de host inválido: "%s" </translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
- <translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s" (debe ser por lo menos %s)</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Importe inválido para %s=&lt;amount&gt;: "%s"</translation>
- </message>
- <message>
- <source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">Puerto no válido especificado en%s: '%s'</translation>
- </message>
- <message>
- <source>Invalid pre-selected input %s</source>
- <translation type="unfinished">Entrada preseleccionada no válida %s</translation>
- </message>
- <message>
- <source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">Fallo en la escucha para conexiones entrantes (la escucha devolvió el error %s)</translation>
- </message>
- <message>
- <source>Missing amount</source>
- <translation type="unfinished">Falta la cantidad</translation>
- </message>
- <message>
- <source>Missing solving data for estimating transaction size</source>
- <translation type="unfinished">Faltan datos de resolución para estimar el tamaño de la transacción</translation>
- </message>
- <message>
- <source>No addresses available</source>
- <translation type="unfinished">No hay direcciones disponibles</translation>
- </message>
- <message>
- <source>Not found pre-selected input %s</source>
- <translation type="unfinished">Entrada preseleccionada no encontrada%s</translation>
- </message>
- <message>
- <source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">Entrada preseleccionada no solucionable %s</translation>
- </message>
- <message>
- <source>Signing transaction failed</source>
- <translation type="unfinished">Fallo al firmar la transacción</translation>
- </message>
- <message>
- <source>Specified data directory "%s" does not exist.</source>
- <translation type="unfinished">El directorio de datos especificado "%s" no existe.</translation>
- </message>
- <message>
- <source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">El importe de la transacción es muy pequeño para pagar la comisión</translation>
- </message>
- <message>
- <source>This is the minimum transaction fee you pay on every transaction.</source>
- <translation type="unfinished">Esta es la comisión mínima de transacción que pagas en cada transacción.</translation>
- </message>
- <message>
- <source>This is the transaction fee you will pay if you send a transaction.</source>
- <translation type="unfinished">Esta es la comisión de transacción que pagarás si envías una transacción.</translation>
- </message>
- <message>
- <source>Transaction amount too small</source>
- <translation type="unfinished">El importe de la transacción es demasiado pequeño</translation>
- </message>
- <message>
- <source>Transaction amounts must not be negative</source>
- <translation type="unfinished">Los importes de la transacción no pueden ser negativos</translation>
- </message>
- <message>
- <source>Transaction change output index out of range</source>
- <translation type="unfinished">Índice de salidas de cambio de transacciones fuera de alcance</translation>
- </message>
- <message>
- <source>Transaction must have at least one recipient</source>
- <translation type="unfinished">La transacción debe incluir al menos un destinatario</translation>
- </message>
- <message>
- <source>Transaction needs a change address, but we can't generate it.</source>
- <translation type="unfinished">La transacción necesita una dirección de cambio, pero no podemos generarla.</translation>
- </message>
- <message>
- <source>Transaction too large</source>
- <translation type="unfinished">Transacción demasiado grande</translation>
- </message>
- <message>
- <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">No se puede asignar memoria para -maxsigcachesize: "%s" MiB</translation>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
</message>
<message>
- <source>Unable to find UTXO for external input</source>
- <translation type="unfinished">No se puede encontrar UTXO para la entrada externa</translation>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
</message>
<message>
- <source>Unable to parse -maxuploadtarget: '%s'</source>
- <translation type="unfinished">No se puede analizar -maxuploadtarget: "%s"</translation>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
</message>
<message>
- <source>Unable to unload the wallet before migrating</source>
- <translation type="unfinished">No se puede descargar la billetera antes de la migración</translation>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">El nivel de registro de depuración global -loglevel=%s no es compatible. Valores válidos: %s.</translation>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
</message>
<message>
- <source>Settings file could not be read</source>
- <translation type="unfinished">El archivo de configuración no se puede leer</translation>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
</message>
<message>
- <source>Settings file could not be written</source>
- <translation type="unfinished">El archivo de configuración no se puede escribir</translation>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
</message>
-</context>
+ </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_es_SV.ts b/src/qt/locale/bitcoin_es_SV.ts
index a01d0641f9..2edd75a5da 100644
--- a/src/qt/locale/bitcoin_es_SV.ts
+++ b/src/qt/locale/bitcoin_es_SV.ts
@@ -54,14 +54,6 @@
<translation type="unfinished">&amp;Escoger</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Envío de direcciones</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Direcciones de recepción</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Estas son sus direcciones Bitcoin para enviar pagos. Compruebe siempre la cantidad y la dirección de recibo antes de transferir monedas.</translation>
</message>
@@ -93,6 +85,11 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">Archivo separado por comas</translation>
</message>
<message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Recepción de direcciones - %1
+</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Error al exportar</translation>
</message>
@@ -262,8 +259,12 @@ Usa el boton "Crear nueva direccion de recibimiento" en la pestaña de recibir p
<translation type="unfinished">%1 todavía no ha terminado de forma segura...</translation>
</message>
<message>
- <source>unknown</source>
- <translation type="unfinished">desconocido</translation>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
</message>
<message>
<source>Amount</source>
@@ -560,46 +561,54 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">Cerrar todos los monederos</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrar una billetera</translation>
+ </message>
+ <message>
<source>&amp;Mask values</source>
<translation type="unfinished">&amp;Ocultar valores</translation>
</message>
<message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">Ocultar los valores en la pestaña de vista general</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">billetera por defecto</translation>
</message>
<message>
<source>No wallets available</source>
- <translation type="unfinished">No hay carteras disponibles</translation>
+ <translation type="unfinished">Monederos no disponibles</translation>
</message>
<message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Datos del monedero </translation>
+ <translation type="unfinished">Datos de la billetera</translation>
</message>
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Cargar copia de seguridad del monedero</translation>
+ <translation type="unfinished">Cargar copia de seguridad de billetera</translation>
</message>
<message>
<source>Restore Wallet</source>
<extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">Restaurar monedero</translation>
+ <translation type="unfinished">Restaurar billetera</translation>
</message>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
- <translation type="unfinished">Nombre de la billetera </translation>
+ <translation type="unfinished">Nombre del monedero</translation>
</message>
<message>
<source>&amp;Window</source>
<translation type="unfinished">&amp;Ventana</translation>
</message>
<message>
- <source>Main Window</source>
- <translation type="unfinished">Ventana principal</translation>
- </message>
- <message>
<source>%1 client</source>
<translation type="unfinished">%1 cliente</translation>
</message>
@@ -609,20 +618,20 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">&amp;Mostrar</translation>
+ <translation type="unfinished">M&amp;ostrar</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n conexión activa con la red de Bitcoin.</numerusform>
- <numerusform>%n conexiónes activas con la red de Bitcoin.</numerusform>
+ <numerusform>%n conexiones activas con la red Bitcoin</numerusform>
+ <numerusform>%n conexiones activas con la red Bitcoin </numerusform>
</translation>
</message>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">Haz clic para ver más acciones.</translation>
+ <translation type="unfinished">Hacer clic para ver más acciones.</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -641,7 +650,15 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">Presincronizando cabeceras (%1%)...</translation>
+ <translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Error al crear billetera</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">No se puede crear una nueva billetera, el software se compiló sin soporte sqlite (requerido para billeteras descriptivas)</translation>
</message>
<message>
<source>Warning: %1</source>
@@ -742,50 +759,18 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">Comisión:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Después de la comisión:</translation>
</message>
<message>
- <source>Change:</source>
- <translation type="unfinished">Cambio:</translation>
- </message>
- <message>
- <source>(un)select all</source>
- <translation type="unfinished">(des)marcar todos</translation>
- </message>
- <message>
- <source>Tree mode</source>
- <translation type="unfinished">Modo arbol</translation>
- </message>
- <message>
- <source>List mode</source>
- <translation type="unfinished">Modo de lista</translation>
- </message>
- <message>
<source>Amount</source>
<translation type="unfinished">Monto</translation>
</message>
<message>
- <source>Received with label</source>
- <translation type="unfinished">Recibido con etiqueta</translation>
- </message>
- <message>
<source>Received with address</source>
<translation type="unfinished">Recibido con etiqueta</translation>
</message>
<message>
- <source>Date</source>
- <translation type="unfinished">Fecha</translation>
- </message>
- <message>
- <source>Confirmations</source>
- <translation type="unfinished">Confirmaciones</translation>
- </message>
- <message>
<source>Confirmed</source>
<translation type="unfinished">Confirmada</translation>
</message>
@@ -830,26 +815,10 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">Copiar después de la tarifa</translation>
</message>
<message>
- <source>Copy bytes</source>
- <translation type="unfinished">Copiar bytes</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation type="unfinished">Copiar cambio</translation>
- </message>
- <message>
<source>(%1 locked)</source>
<translation type="unfinished">(%1 bloqueado)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">sí</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Esta etiqueta se vuelve roja si algún receptor recibe un importe inferior al umbral actual establecido para el polvo.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Puede variar en +/- %1 satoshi(s) por entrada.</translation>
</message>
@@ -861,19 +830,10 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<source>change from %1 (%2)</source>
<translation type="unfinished">Cambio desde %1 (%2)</translation>
</message>
- <message>
- <source>(change)</source>
- <translation type="unfinished">(cambio)</translation>
- </message>
-</context>
+ </context>
<context>
<name>CreateWalletActivity</name>
<message>
- <source>Create Wallet</source>
- <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">Crear billetera</translation>
- </message>
- <message>
<source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
<translation type="unfinished">Creando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
@@ -909,6 +869,57 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Estas seguro de wue deseas migrar la billetera 1 %1 1 ?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">La migración de la billetera la convertirá en una o más billeteras basadas en descriptores. Será necesario realizar una nueva copia de seguridad de la billetera.
+Si esta billetera contiene scripts solo de lectura, se creará una nueva billetera que los contenga.
+Si esta billetera contiene scripts solucionables pero no de lectura, se creará una nueva billetera diferente que los contenga.
+
+El proceso de migración creará una copia de seguridad de la billetera antes de migrar. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de esta billetera. En el caso de una migración incorrecta, la copia de seguridad puede restaurarse con la funcionalidad "Restore Wallet" (Restaurar billetera).</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migración errónea</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migración correcta</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet warning</source>
@@ -921,7 +932,7 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Abrir billetera</translation>
+ <translation type="unfinished">Abrir monedero</translation>
</message>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -960,10 +971,6 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<context>
<name>WalletController</name>
<message>
- <source>Close wallet</source>
- <translation type="unfinished">Cerrar cartera</translation>
- </message>
- <message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
<translation type="unfinished">¿Estás seguro de que deseas cerrar el monedero &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
@@ -973,7 +980,7 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">Cerrar todas las billeteras</translation>
+ <translation type="unfinished">Cerrar todos los monederos</translation>
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
@@ -983,18 +990,22 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<context>
<name>CreateWalletDialog</name>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Estás a un paso de crear tu nueva billetera.</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Escribe un nombre y, si lo deseas, activa las opciones avanzadas.</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
- <translation type="unfinished">Nombre de la billetera </translation>
+ <translation type="unfinished">Nombre del monedero</translation>
</message>
<message>
<source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
<translation type="unfinished">Encriptar la billetera. La billetera será encriptada con una contraseña de tu elección.</translation>
</message>
<message>
- <source>Advanced Options</source>
- <translation type="unfinished">Opciones Avanzadas</translation>
- </message>
- <message>
<source>Disable Private Keys</source>
<translation type="unfinished">Desactivar las claves privadas</translation>
</message>
@@ -1007,10 +1018,6 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">Crear billetera vacía</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Use descriptores para la gestión de scriptPubKey</translation>
- </message>
- <message>
<source>External signer</source>
<translation type="unfinished">Firmante externo</translation>
</message>
@@ -1019,10 +1026,6 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">Crear</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilado sin soporte de sqlite (requerido para billeteras descriptoras)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Compilado sin soporte de firma externa (necesario para la firma externa)</translation>
@@ -1200,10 +1203,6 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">Incremento del progreso por hora</translation>
</message>
<message>
- <source>Estimated time left until synced</source>
- <translation type="unfinished">Tiempo estimado antes de sincronizar</translation>
- </message>
- <message>
<source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
<translation type="unfinished">%1 está actualmente sincronizándose. Descargará cabeceras y bloques de nodos semejantes y los validará hasta alcanzar la cabeza de la cadena de bloques.</translation>
</message>
@@ -1263,6 +1262,10 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">Minimice en lugar de salir de la aplicación cuando la ventana esté cerrada. Cuando esta opción está habilitada, la aplicación se cerrará solo después de seleccionar Salir en el menú.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Las opciones establecidas en este diálogo serán anuladas por la línea de comandos:</translation>
</message>
@@ -1367,10 +1370,6 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">Asignar puerto usando NA&amp;T-PMP</translation>
</message>
<message>
- <source>Accept connections from outside.</source>
- <translation type="unfinished">Acepta conexiones desde afuera.</translation>
- </message>
- <message>
<source>Allow incomin&amp;g connections</source>
<translation type="unfinished">Permitir conexiones entrantes</translation>
</message>
@@ -1439,18 +1438,6 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">Usar un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña Resumen:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">"%1" insertado</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">"%1" con la coincidencia más aproximada</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">Cancelar</translation>
</message>
@@ -1509,10 +1496,6 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<source>The configuration file could not be opened.</source>
<translation type="unfinished">El archivo de configuración no se pudo abrir.</translation>
</message>
- <message>
- <source>This change would require a client restart.</source>
- <translation type="unfinished">Este cambio requeriría un reinicio del cliente.</translation>
- </message>
</context>
<context>
<name>OptionsModel</name>
@@ -1656,8 +1639,12 @@ Solicitar pagos (genera códigos QR y bitcoin: URI)
<translation type="unfinished">PSBT guardada en en el disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envia %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">dirección personal</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -1771,18 +1758,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">&amp;Guardar imagen...</translation>
</message>
<message>
- <source>&amp;Copy Image</source>
- <translation type="unfinished">&amp;Copiar imagen</translation>
- </message>
- <message>
<source>Resulting URI too long, try to reduce the text for label / message.</source>
<translation type="unfinished">URI resultante demasiado larga. Intente reducir el texto de la etiqueta / mensaje.</translation>
</message>
<message>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">Fallo al codificar URI en código QR.</translation>
- </message>
- <message>
<source>QR code support not available.</source>
<translation type="unfinished">La compatibilidad con el código QR no está disponible.</translation>
</message>
@@ -1803,10 +1782,6 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">N/D</translation>
</message>
<message>
- <source>Client version</source>
- <translation type="unfinished">Versión del cliente</translation>
- </message>
- <message>
<source>&amp;Information</source>
<translation type="unfinished">&amp;Información</translation>
</message>
@@ -1855,10 +1830,6 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Monedero:</translation>
</message>
<message>
- <source>(none)</source>
- <translation type="unfinished">(ninguno)</translation>
- </message>
- <message>
<source>&amp;Reset</source>
<translation type="unfinished">&amp;Reestablecer</translation>
</message>
@@ -1883,6 +1854,22 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Selecciona un par para ver la información detallada.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versión de la capa de transporte: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Transporte</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Cadena de identificación de la sesión BIP324 en formato hexadecimal, si existe.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Identificador de sesión</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Si retransmitimos las transacciones a este par.</translation>
</message>
@@ -1985,10 +1972,6 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Banda ancha</translation>
</message>
<message>
- <source>Connection Time</source>
- <translation type="unfinished">Tiempo de conexión</translation>
- </message>
- <message>
<source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
<translation type="unfinished">Tiempo transcurrido desde que se recibió de este par un nuevo bloque que superó las comprobaciones de validez iniciales.</translation>
</message>
@@ -2088,6 +2071,21 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Recuperación de dirección saliente: de corta duración, para solicitar direcciones</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Detectando: el par puede ser v1 o v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocolo de transporte de texto simple sin cifrar</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: protocolo de transporte encriptado BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">Seleccionamos el par para la retransmisión de banda ancha</translation>
</message>
@@ -2130,6 +2128,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2190,10 +2192,6 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<translation type="unfinished">&amp;Importe:</translation>
</message>
<message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Etiqueta:</translation>
- </message>
- <message>
<source>&amp;Message:</source>
<translation type="unfinished">&amp;Mensaje:</translation>
</message>
@@ -2242,18 +2240,10 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<translation type="unfinished">Muestra la petición seleccionada (También doble clic)</translation>
</message>
<message>
- <source>Show</source>
- <translation type="unfinished">Mostrar</translation>
- </message>
- <message>
<source>Remove the selected entries from the list</source>
<translation type="unfinished">Eliminar las entradas seleccionadas de la lista</translation>
</message>
<message>
- <source>Remove</source>
- <translation type="unfinished">Eliminar</translation>
- </message>
- <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">Copiar &amp;URI</translation>
</message>
@@ -2290,10 +2280,6 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<translation type="unfinished">Bech32m (BIP-350) es una actualización de Bech32. La compatibilidad con la billetera todavía es limitada.</translation>
</message>
<message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">No se pudo desbloquear el monedero.</translation>
- </message>
- <message>
<source>Could not generate new %1 address</source>
<translation type="unfinished">No se ha podido generar una nueva dirección %1</translation>
</message>
@@ -2309,10 +2295,6 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<translation type="unfinished">Importe:</translation>
</message>
<message>
- <source>Message:</source>
- <translation type="unfinished">Mensaje:</translation>
- </message>
- <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">Copiar &amp;URI</translation>
</message>
@@ -2336,18 +2318,10 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<context>
<name>RecentRequestsTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">Fecha</translation>
- </message>
- <message>
<source>Label</source>
<translation type="unfinished">Nombre</translation>
</message>
<message>
- <source>Message</source>
- <translation type="unfinished">Mensaje</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(sin etiqueta)</translation>
</message>
@@ -2395,10 +2369,6 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<translation type="unfinished">Después de la comisión:</translation>
</message>
<message>
- <source>Change:</source>
- <translation type="unfinished">Cambio:</translation>
- </message>
- <message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished">Al activarse, si la dirección esta vacía o es inválida, las monedas serán enviadas a una nueva dirección generada.</translation>
</message>
@@ -2435,10 +2405,6 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<translation type="unfinished">Entradas...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Elegir...</translation>
</message>
@@ -2499,14 +2465,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Copiar después de la tarifa</translation>
</message>
<message>
- <source>Copy bytes</source>
- <translation type="unfinished">Copiar bytes</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation type="unfinished">Copiar cambio</translation>
- </message>
- <message>
<source>Sign on device</source>
<extracomment>"device" usually means a hardware wallet.</extracomment>
<translation type="unfinished">Firmar en el dispositivo</translation>
@@ -2525,10 +2483,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde la billetera '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 a %2</translation>
</message>
@@ -2577,6 +2531,10 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar-por-comisión", BIP-125).</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">¿Quieres crear esta transacción?</translation>
@@ -2618,10 +2576,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">PSBT guardada en el disco</translation>
</message>
<message>
- <source>Confirm send coins</source>
- <translation type="unfinished">Confirmar el envío de monedas</translation>
- </message>
- <message>
<source>Watch-only balance:</source>
<translation type="unfinished">Saldo solo de observación:</translation>
</message>
@@ -2646,10 +2600,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Se encontró una dirección duplicada: las direcciones solo se deben usar una vez.</translation>
</message>
<message>
- <source>Transaction creation failed!</source>
- <translation type="unfinished">¡Fallo al crear la transacción!</translation>
- </message>
- <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">Una comisión mayor que %1 se considera como una comisión absurda-mente alta.</translation>
</message>
@@ -2692,10 +2642,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">&amp;Pagar a:</translation>
</message>
<message>
- <source>&amp;Label:</source>
- <translation type="unfinished">&amp;Etiqueta:</translation>
- </message>
- <message>
<source>Choose previously used address</source>
<translation type="unfinished">Seleccionar dirección usada anteriormente</translation>
</message>
@@ -2720,10 +2666,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Usar el saldo disponible</translation>
</message>
<message>
- <source>Message:</source>
- <translation type="unfinished">Mensaje:</translation>
- </message>
- <message>
<source>Enter a label for this address to add it to the list of used addresses</source>
<translation type="unfinished">Ingresar una etiqueta para esta dirección a fin de agregarla a la lista de direcciones utilizadas</translation>
</message>
@@ -2857,11 +2799,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<source>The signature did not match the message digest.</source>
<translation type="unfinished">La firma no coincide con el resumen del mensaje.</translation>
</message>
- <message>
- <source>Message verified.</source>
- <translation type="unfinished">Mensaje verificado.</translation>
- </message>
-</context>
+ </context>
<context>
<name>SplashScreen</name>
<message>
@@ -2905,10 +2843,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Estado</translation>
</message>
<message>
- <source>Date</source>
- <translation type="unfinished">Fecha</translation>
- </message>
- <message>
<source>Source</source>
<translation type="unfinished">Fuente</translation>
</message>
@@ -2917,10 +2851,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">De</translation>
</message>
<message>
- <source>unknown</source>
- <translation type="unfinished">desconocido</translation>
- </message>
- <message>
<source>To</source>
<translation type="unfinished">Para</translation>
</message>
@@ -2928,10 +2858,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<source>own address</source>
<translation type="unfinished">dirección personal</translation>
</message>
- <message>
- <source>label</source>
- <translation type="unfinished">etiqueta</translation>
- </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2956,14 +2882,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Cantidad total</translation>
</message>
<message>
- <source>Message</source>
- <translation type="unfinished">Mensaje</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation type="unfinished">Comentario</translation>
- </message>
- <message>
<source>Transaction ID</source>
<translation type="unfinished">Identificador de transacción</translation>
</message>
@@ -2980,8 +2898,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Indice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (No se ha verificado el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -2992,10 +2910,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Las monedas generadas deben madurar %1 bloques antes de que puedan ser gastadas. Una vez que generas este bloque, es propagado por la red para ser añadido a la cadena de bloques. Si falla el intento de meterse en la cadena, su estado cambiará a "no aceptado" y ya no se puede gastar. Esto puede ocurrir ocasionalmente si otro nodo genera un bloque a pocos segundos del tuyo.</translation>
</message>
<message>
- <source>Transaction</source>
- <translation type="unfinished">Transacción</translation>
- </message>
- <message>
<source>Inputs</source>
<translation type="unfinished">Entradas</translation>
</message>
@@ -3018,10 +2932,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<context>
<name>TransactionTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">Fecha</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">Tipo</translation>
</message>
@@ -3058,10 +2968,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Enviada a</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pago a ti mismo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
@@ -3074,10 +2980,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Fecha y hora en las que se recibió la transacción.</translation>
</message>
<message>
- <source>Type of transaction.</source>
- <translation type="unfinished">Tipo de transacción.</translation>
- </message>
- <message>
<source>Amount removed from or added to balance.</source>
<translation type="unfinished">Importe restado del saldo o sumado a este.</translation>
</message>
@@ -3085,14 +2987,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<context>
<name>TransactionView</name>
<message>
- <source>All</source>
- <translation type="unfinished">Todo</translation>
- </message>
- <message>
- <source>Today</source>
- <translation type="unfinished">Hoy</translation>
- </message>
- <message>
<source>This week</source>
<translation type="unfinished">Esta semana</translation>
</message>
@@ -3105,10 +2999,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">El mes pasado </translation>
</message>
<message>
- <source>This year</source>
- <translation type="unfinished">Este año</translation>
- </message>
- <message>
<source>Received with</source>
<translation type="unfinished">Recibido con</translation>
</message>
@@ -3117,10 +3007,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Enviada a</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">A ti mismo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
@@ -3199,10 +3085,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Confirmada</translation>
</message>
<message>
- <source>Date</source>
- <translation type="unfinished">Fecha</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">Tipo</translation>
</message>
@@ -3332,7 +3214,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Datos del monedero </translation>
+ <translation type="unfinished">Datos de la billetera</translation>
</message>
<message>
<source>Backup Failed</source>
@@ -3366,6 +3248,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">%s corrupto. Intenta utilizar la herramienta del monedero bitcoin-monedero para salvar o restaurar una copia de seguridad.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea no válida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Comunique este incidente a %s, indicando cómo obtuvo la instantánea. Se dejó el estado de encadenamiento de la instantánea no válida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s solicitud para escuchar en el puerto%u. Este puerto se considera "malo" y, por lo tanto, es poco probable que algún par se conecte a él. Consulta doc/p2p-bad-ports.md para obtener detalles y una lista completa.</translation>
</message>
@@ -3450,6 +3336,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Poda: la última sincronización de la billetera sobrepasa los datos podados. Tienes que ejecutar -reindex (descarga toda la cadena de bloques de nuevo en caso de tener un nodo podado)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Error de renombrado de «%s» → «%s». Debería resolver esto manualmente moviendo o borrando el directorio %s de la instantánea no válida, en otro caso encontrará el mismo error de nuevo en el arranque siguiente.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: versión desconocida del esquema de la billetera sqlite %d. Solo se admite la versión %d</translation>
</message>
@@ -3458,10 +3348,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">La base de datos de bloques contiene un bloque que parece ser del futuro. Es posible que se deba a que la fecha y hora de la computadora están mal configuradas. Reconstruye la base de datos de bloques solo si tienes la certeza de que la fecha y hora de la computadora son correctas.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">El índice de bloque db contiene un «txindex» heredado. Para borrar el espacio de disco ocupado, ejecute un -reindex completo, de lo contrario ignore este error. Este mensaje de error no se volverá a mostrar.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">El monto de la transacción es demasiado pequeño para enviarlo después de deducir la comisión</translation>
</message>
@@ -3498,6 +3384,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Se proporcionó un formato de billetera desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Nivel de boletín del acceso especificado en categoría no mantenida en %1$s=%2$s. Se esperaba %1$s=1:2. Categorías válidas: %3$s. Niveles de boletín válidos: %4 $s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">El formato de la base de datos chainstate es incompatible. Reinicia con -reindex-chainstate para reconstruir la base de datos chainstate.</translation>
</message>
@@ -3506,6 +3396,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">La billetera se creó correctamente. El tipo de billetera "legacy" se está descontinuando, por lo que la asistencia para crear y abrir estas billeteras se eliminará en el futuro.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Monedero correctamente cargado. El tipo de billetero heredado está siendo obsoleto y mantenimiento para creación de monederos heredados serán eliminados en el futuro. Los monederos heredados pueden ser migrados a un descriptor de monedero con migratewallet.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Advertencia: el formato de la billetera del archivo de volcado "%s" no coincide con el formato especificado en la línea de comandos "%s".</translation>
</message>
@@ -3554,30 +3448,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">La actualización -txindex iniciada por una versión anterior no puede completarse. Reinicia con la versión anterior o ejecuta un -reindex completo.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se dejó el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">El valor establecido para %s es demasiado alto. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -blockfilterindex. Desactiva temporalmente blockfilterindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -coinstatsindex. Desactiva temporalmente coinstatsindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -txindex. Desactiva temporalmente txindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">No se pueden proporcionar conexiones específicas y hacer que addrman encuentre conexiones salientes al mismo tiempo.</translation>
</message>
@@ -3586,6 +3460,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error al cargar %s: Se está cargando la billetera firmante externa sin que se haya compilado la compatibilidad del firmante externo</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Error leyendo %s. Todas las teclas leídas correctamente, pero los datos de transacción o metadatos de dirección puedan ser ausentes o incorrectos.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Error: No se puede identificar si los datos de la libreta de direcciones en la billetera pertenecen a billeteras migradas</translation>
</message>
@@ -3598,6 +3476,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error: No se puede identificar si la transacción %s en la billetera pertenece a billeteras migradas</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
@@ -3672,10 +3554,6 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">La categoría especifica de nivel de registro no es compatible: -loglevel=%s. Se espera -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %s. Niveles de registro válidos: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -3704,14 +3582,14 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">¡El espacio en disco es demasiado pequeño!</translation>
</message>
<message>
- <source>Done loading</source>
- <translation type="unfinished">Listo Cargando</translation>
- </message>
- <message>
<source>Dump file %s does not exist.</source>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error al crear %s</translation>
</message>
@@ -3740,16 +3618,12 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos de la billetera</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción solo de observación a la billetera respectiva</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pudo eliminar las transacciones solo de observación</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3788,10 +3662,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pudo eliminar todas las transacciones solo de observación</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Esta billetera ya usa SQLite</translation>
</message>
@@ -3816,6 +3686,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se pueden leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
@@ -3824,14 +3698,39 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se puede escribir el registro en la nueva billetera</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ </message>
+ <message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Fallo al rescanear la billetera durante la inicialización</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Es erróneo al iniciar indizados, se apaga...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
@@ -3856,10 +3755,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">dbcache insuficiente para la verificación de bloques</translation>
</message>
<message>
- <source>Insufficient funds</source>
- <translation type="unfinished">Fondos Insuficientes</translation>
- </message>
- <message>
<source>Invalid -i2psam address or hostname: '%s'</source>
<translation type="unfinished">La dirección -i2psam o el nombre de host no es válido: "%s" </translation>
</message>
@@ -3924,10 +3819,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">No hay direcciones disponibles</translation>
</message>
<message>
- <source>Not enough file descriptors available.</source>
- <translation type="unfinished">No hay suficientes descriptores de archivo disponibles.</translation>
- </message>
- <message>
<source>Not found pre-selected input %s</source>
<translation type="unfinished">Entrada preseleccionada no encontrada%s</translation>
</message>
@@ -4016,10 +3907,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El monto de la transacción es demasiado pequeño para pagar la comisión</translation>
</message>
<message>
- <source>This is experimental software.</source>
- <translation type="unfinished">Este es un software experimental.</translation>
- </message>
- <message>
<source>This is the minimum transaction fee you pay on every transaction.</source>
<translation type="unfinished">Mínimo de impuesto que pagarás con cada transacción.</translation>
</message>
@@ -4028,6 +3915,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Esta es la comisión por transacción a pagar si realiza una transacción.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">El importe de la transacción es demasiado pequeño</translation>
</message>
@@ -4040,10 +3931,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Índice de salidas de cambio de transacciones fuera de alcance</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción tiene largo tiempo en una cadena mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacción debe tener al menos un destinatario</translation>
</message>
@@ -4116,14 +4003,30 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">El nivel de registro de depuración global -loglevel=%s no es compatible. Valores válidos: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Nivel de acceso global %s = %s no mantenido. Los valores válidos son: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates no está mantenido en el encadenamiento %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_es_VE.ts b/src/qt/locale/bitcoin_es_VE.ts
index f1d4b4a5b1..139fc7b42e 100644
--- a/src/qt/locale/bitcoin_es_VE.ts
+++ b/src/qt/locale/bitcoin_es_VE.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">Escoger</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Direcciones de envío</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Direcciones de recepción</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Estas son sus direcciones Bitcoin para enviar pagos. Compruebe siempre la cantidad y la dirección de recibo antes de transferir monedas.</translation>
</message>
@@ -102,6 +94,14 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Hubo un error al intentar guardar la lista de direcciones a %1. Por favor trate de nuevo.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Direcciones de envío - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Direcciones de recepción - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">La exportación falló</translation>
</message>
@@ -177,7 +177,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">Ingrese la nueva contraseña para la billetera. Use una contraseña de diez o más caracteres aleatorios, u ocho o más palabras.</translation>
+ <translation type="unfinished">Ingresa la nueva frase de contraseña para la billetera. &lt;br/&gt;Usa una frase de contraseña de &lt;b&gt;diez o más caracteres aleatorios&lt;/b&gt;, u &lt;b&gt;ocho o más palabras&lt;/b&gt;.</translation>
</message>
<message>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
@@ -291,6 +291,14 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">desconocido</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fuente predeterminada del sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizada...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Cantidad</translation>
</message>
@@ -631,10 +639,22 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Cerrar todos los monederos</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrar una billetera</translation>
+ </message>
+ <message>
<source>&amp;Mask values</source>
<translation type="unfinished">&amp;Ocultar valores</translation>
</message>
<message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">Ocultar los valores en la pestaña de vista general</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">billetera por defecto</translation>
</message>
@@ -667,10 +687,6 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">&amp;Ventana</translation>
</message>
<message>
- <source>Main Window</source>
- <translation type="unfinished">Ventana principal</translation>
- </message>
- <message>
<source>%1 client</source>
<translation type="unfinished">%1 cliente</translation>
</message>
@@ -715,6 +731,14 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Presincronizando encabezados (%1%)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Error al crear billetera</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">No se puede crear una nueva billetera, el software se compiló sin soporte sqlite (requerido para billeteras descriptivas)</translation>
+ </message>
+ <message>
<source>Warning: %1</source>
<translation type="unfinished">Advertencia: %1</translation>
</message>
@@ -768,7 +792,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
- <translation type="unfinished">La generación de la clave HD está &lt;b&gt; desactivada &lt;/ b&gt;</translation>
+ <translation type="unfinished">La generación de la clave HD está &lt;b&gt; desactivada&lt;/b&gt;</translation>
</message>
<message>
<source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -813,10 +837,6 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Tasa:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Después de tasas:</translation>
</message>
@@ -905,10 +925,6 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar dust</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
@@ -917,14 +933,6 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">(%1 bloqueado)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">si</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Esta etiqueta se vuelve roja si algún receptor recibe un importe inferior al umbral actual establecido para el polvo.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Puede variar +/- %1 satoshi(s) por entrada.</translation>
</message>
@@ -944,11 +952,6 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<context>
<name>CreateWalletActivity</name>
<message>
- <source>Create Wallet</source>
- <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">Crear billetera</translation>
- </message>
- <message>
<source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
<translation type="unfinished">Creando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
@@ -984,6 +987,57 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">¿Seguro deseas migrar la billetera &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">La migración de la billetera la convertirá en una o más billeteras basadas en descriptores. Será necesario realizar una nueva copia de seguridad de la billetera.
+Si esta billetera contiene scripts solo de lectura, se creará una nueva billetera que los contenga.
+Si esta billetera contiene scripts solucionables pero no de lectura, se creará una nueva billetera diferente que los contenga.
+
+El proceso de migración creará una copia de seguridad de la billetera antes de migrar. Este archivo de copia de seguridad se llamará &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak y se encontrará en el directorio de esta billetera. En el caso de una migración incorrecta, la copia de seguridad puede restaurarse con la funcionalidad "Restore Wallet" (Restaurar billetera).</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar billetera</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrando billetera &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">La migración de la billetera "%1" se realizó correctamente.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Guiones vigilantes han sido migrados a un monedero con el nombre '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Solucionable pero ninguno de los guiones vigilados han sido migrados a un monedero llamados '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migración errónea</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migración correcta</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet warning</source>
@@ -996,7 +1050,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Abrir billetera</translation>
+ <translation type="unfinished">Abrir monedero</translation>
</message>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1048,7 +1102,7 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">Cerrar todas las billeteras</translation>
+ <translation type="unfinished">Cerrar todos los monederos</translation>
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
@@ -1058,8 +1112,16 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<context>
<name>CreateWalletDialog</name>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Estás a un paso de crear tu nueva billetera.</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Escribe un nombre y, si lo deseas, activa las opciones avanzadas.</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
- <translation type="unfinished">Nombre de la billetera </translation>
+ <translation type="unfinished">Nombre del monedero</translation>
</message>
<message>
<source>Wallet</source>
@@ -1070,10 +1132,6 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Encriptar la billetera. La billetera será encriptada con una contraseña de tu elección.</translation>
</message>
<message>
- <source>Advanced Options</source>
- <translation type="unfinished">Opciones Avanzadas</translation>
- </message>
- <message>
<source>Disable Private Keys</source>
<translation type="unfinished">Desactivar las claves privadas</translation>
</message>
@@ -1086,10 +1144,6 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Crear billetera vacía</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Use descriptores para la gestión de scriptPubKey</translation>
- </message>
- <message>
<source>External signer</source>
<translation type="unfinished">Firmante externo</translation>
</message>
@@ -1098,10 +1152,6 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Crear</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilado sin soporte de sqlite (requerido para billeteras descriptoras)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Compilado sin soporte de firma externa (necesario para la firma externa)</translation>
@@ -1303,10 +1353,6 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Incremento del progreso por hora</translation>
</message>
<message>
- <source>Estimated time left until synced</source>
- <translation type="unfinished">Tiempo estimado antes de sincronizar</translation>
- </message>
- <message>
<source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
<translation type="unfinished">%1 está actualmente sincronizándose. Descargará cabeceras y bloques de nodos semejantes y los validará hasta alcanzar la cabeza de la cadena de bloques.</translation>
</message>
@@ -1366,6 +1412,10 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Minimice en lugar de salir de la aplicación cuando la ventana esté cerrada. Cuando esta opción está habilitada, la aplicación se cerrará solo después de seleccionar Salir en el menú.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fuente en la pestaña Resumen:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Las opciones establecidas en este diálogo serán anuladas por la línea de comandos:</translation>
</message>
@@ -1482,10 +1532,6 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Asignar puerto usando NA&amp;T-PMP</translation>
</message>
<message>
- <source>Accept connections from outside.</source>
- <translation type="unfinished">Acepta conexiones desde afuera.</translation>
- </message>
- <message>
<source>Allow incomin&amp;g connections</source>
<translation type="unfinished">Permitir conexiones entrantes</translation>
</message>
@@ -1574,18 +1620,6 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">Usar un proxy SOCKS&amp;5 independiente para comunicarse con pares a través de los servicios onion de Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fuente monoespaciada en la pestaña de vista general:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">"%1" insertado</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">"%1" con la coincidencia más aproximada</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Aceptar</translation>
</message>
@@ -1811,8 +1845,12 @@ Registrarse solo es posible utilizando una direccion tipo "Legal"</translation>
<translation type="unfinished">PSBT guardada en en el disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envía %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envía %1 a %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">dirección personal</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -1942,18 +1980,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">&amp;Guardar imagen...</translation>
</message>
<message>
- <source>&amp;Copy Image</source>
- <translation type="unfinished">&amp;Copiar imagen</translation>
- </message>
- <message>
<source>Resulting URI too long, try to reduce the text for label / message.</source>
<translation type="unfinished">El URI resultante es demasiado largo, así que trate de reducir el texto de la etiqueta o el mensaje.</translation>
</message>
<message>
- <source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">Fallo al codificar URI en código QR.</translation>
- </message>
- <message>
<source>QR code support not available.</source>
<translation type="unfinished">La compatibilidad con el código QR no está disponible.</translation>
</message>
@@ -2026,10 +2056,6 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Monedero:</translation>
</message>
<message>
- <source>(none)</source>
- <translation type="unfinished">(ninguno)</translation>
- </message>
- <message>
<source>&amp;Reset</source>
<translation type="unfinished">&amp;Reestablecer</translation>
</message>
@@ -2054,6 +2080,22 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Selecciona un par para ver la información detallada.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versión de la capa de transporte: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Transporte</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Cadena de identificación de la sesión BIP324 en formato hexadecimal, si existe.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Identificador de sesión</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Si retransmitimos las transacciones a este par.</translation>
</message>
@@ -2160,10 +2202,6 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Banda ancha</translation>
</message>
<message>
- <source>Connection Time</source>
- <translation type="unfinished">Tiempo de conexión</translation>
- </message>
- <message>
<source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
<translation type="unfinished">Tiempo transcurrido desde que se recibió de este par un nuevo bloque que superó las comprobaciones de validez iniciales.</translation>
</message>
@@ -2263,6 +2301,21 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Recuperación de dirección saliente: de corta duración, para solicitar direcciones</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Detectando: el par puede ser v1 o v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocolo de transporte de texto simple sin cifrar</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: protocolo de transporte encriptado BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">Seleccionamos el par para la retransmisión de banda ancha</translation>
</message>
@@ -2305,6 +2358,10 @@ Si recibe este error, debe solicitar al comerciante que le proporcione un URI co
<translation type="unfinished">Ejecutar comando sin monedero</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Ventana de nodo - [%1]</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2382,7 +2439,7 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">Use este formulario para solicitar pagos. Todos los campos son &lt;b&gt; opcionales &lt;/ b&gt;.</translation>
+ <translation type="unfinished">Use este formulario para solicitar pagos. Todos los campos son &lt;b&gt;opcionales&lt;/b&gt;.</translation>
</message>
<message>
<source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
@@ -2519,10 +2576,6 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<translation type="unfinished">Etiqueta</translation>
</message>
<message>
- <source>Message</source>
- <translation type="unfinished">Mensaje</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(sin etiqueta)</translation>
</message>
@@ -2622,10 +2675,6 @@ Escribe %5 para ver un resumen de los comandos disponibles. Para más informaci
<translation type="unfinished">Entradas...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvo:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Elegir...</translation>
</message>
@@ -2694,10 +2743,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar dust</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
@@ -2720,10 +2765,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Crea una transacción de Bitcoin parcialmente firmada (PSBT) para usarla, por ejemplo, con una billetera %1 sin conexión o una billetera de hardware compatible con PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">desde la billetera '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 a %2</translation>
</message>
@@ -2772,6 +2813,10 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Puedes aumentar la comisión después (indica "Reemplazar-por-comisión", BIP-125).</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 desde monedero '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">¿Quieres crear esta transacción?</translation>
@@ -2813,10 +2858,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">PSBT guardada en el disco</translation>
</message>
<message>
- <source>Confirm send coins</source>
- <translation type="unfinished">Confirmar el envío de monedas</translation>
- </message>
- <message>
<source>Watch-only balance:</source>
<translation type="unfinished">Saldo solo de observación:</translation>
</message>
@@ -2841,10 +2882,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Se encontró una dirección duplicada: las direcciones solo se deben usar una vez.</translation>
</message>
<message>
- <source>Transaction creation failed!</source>
- <translation type="unfinished">¡Fallo al crear la transacción!</translation>
- </message>
- <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">Una comisión mayor que %1 se considera como una comisión absurda-mente alta.</translation>
</message>
@@ -3060,11 +3097,7 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<source>The signature did not match the message digest.</source>
<translation type="unfinished">La firma no coincide con el resumen del mensaje.</translation>
</message>
- <message>
- <source>Message verified.</source>
- <translation type="unfinished">Mensaje verificado.</translation>
- </message>
-</context>
+ </context>
<context>
<name>SplashScreen</name>
<message>
@@ -3131,10 +3164,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<source>own address</source>
<translation type="unfinished">dirección personal</translation>
</message>
- <message>
- <source>label</source>
- <translation type="unfinished">etiqueta</translation>
- </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -3159,14 +3188,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Cantidad total</translation>
</message>
<message>
- <source>Message</source>
- <translation type="unfinished">Mensaje</translation>
- </message>
- <message>
- <source>Comment</source>
- <translation type="unfinished">Comentario</translation>
- </message>
- <message>
<source>Transaction ID</source>
<translation type="unfinished">Identificador de transacción</translation>
</message>
@@ -3183,8 +3204,8 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Indice de salida</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(No se verificó el certificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (El certificado no fue verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3261,10 +3282,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Enviada a</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pago a ti mismo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
@@ -3277,10 +3294,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Fecha y hora en las que se recibió la transacción.</translation>
</message>
<message>
- <source>Type of transaction.</source>
- <translation type="unfinished">Tipo de transacción.</translation>
- </message>
- <message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
<translation type="unfinished">Si una dirección de solo observación está involucrada en esta transacción o no.</translation>
</message>
@@ -3296,14 +3309,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<context>
<name>TransactionView</name>
<message>
- <source>All</source>
- <translation type="unfinished">Todo</translation>
- </message>
- <message>
- <source>Today</source>
- <translation type="unfinished">Hoy</translation>
- </message>
- <message>
<source>This week</source>
<translation type="unfinished">Esta semana</translation>
</message>
@@ -3316,10 +3321,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">El mes pasado </translation>
</message>
<message>
- <source>This year</source>
- <translation type="unfinished">Este año</translation>
- </message>
- <message>
<source>Received with</source>
<translation type="unfinished">Recibido con</translation>
</message>
@@ -3328,10 +3329,6 @@ Nota: Dado que la comisión se calcula por byte, una tasa de "100 satoshis por k
<translation type="unfinished">Enviada a</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">A ti mismo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
@@ -3589,6 +3586,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">%s corrupto. Intenta utilizar la herramienta de la billetera de bitcoin para rescatar o restaurar una copia de seguridad.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea no válida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Comunique este incidente a %s, indicando cómo obtuvo la instantánea. Se dejó el estado de encadenamiento de la instantánea no válida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s solicitud para escuchar en el puerto%u. Este puerto se considera "malo" y, por lo tanto, es poco probable que algún par se conecte a él. Consulta doc/p2p-bad-ports.md para obtener detalles y una lista completa.</translation>
</message>
@@ -3613,10 +3614,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error al cargar la billetera. Esta requiere que se descarguen bloques, y el software actualmente no admite la carga de billeteras mientras los bloques se descargan fuera de orden, cuando se usan instantáneas de assumeutxo. La billetera debería poder cargarse correctamente después de que la sincronización del nodo alcance la altura %s.</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">¡Error al leer %s! Todas las claves se leyeron correctamente, pero es probable que falten los datos de la transacción o la libreta de direcciones, o que sean incorrectos.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">¡Error al leer %s! Es probable que falten los datos de la transacción o que sean incorrectos. Reescaneando billetera.</translation>
</message>
@@ -3681,6 +3678,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Poda: la última sincronización de la billetera sobrepasa los datos podados. Tienes que ejecutar -reindex (descarga toda la cadena de bloques de nuevo en caso de tener un nodo podado)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Error de renombrado de «%s» → «%s». Debería resolver esto manualmente moviendo o borrando el directorio %s de la instantánea no válida, en otro caso encontrará el mismo error de nuevo en el arranque siguiente.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: versión desconocida del esquema de la billetera sqlite %d. Solo se admite la versión %d.</translation>
</message>
@@ -3689,10 +3690,6 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">La base de datos de bloques contiene un bloque que parece ser del futuro. Es posible que se deba a que la fecha y hora de la computadora están mal configuradas. Reconstruye la base de datos de bloques solo si tienes la certeza de que la fecha y hora de la computadora son correctas.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">La base de datos del índice de bloques contiene un "txindex" heredado. Para borrar el espacio de disco ocupado, ejecute un -reindex completo; de lo contrario, ignore este error. Este mensaje de error no se volverá a mostrar.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">El monto de la transacción es demasiado pequeño para enviarlo después de deducir la comisión</translation>
</message>
@@ -3729,6 +3726,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Se proporcionó un formato de archivo de billetera desconocido "%s". Proporciona uno entre "bdb" o "sqlite".</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Nivel de boletín del acceso especificado en categoría no mantenida en %1$s=%2$s. Se esperaba %1$s=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %3$s. Niveles de boletín válidos: %4 $s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">El formato de la base de datos chainstate es incompatible. Reinicia con -reindex-chainstate para reconstruir la base de datos chainstate.</translation>
</message>
@@ -3737,6 +3738,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">La billetera se creó correctamente. El tipo de billetera "legacy" se está descontinuando, por lo que la asistencia para crear y abrir estas billeteras se eliminará en el futuro.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Monedero correctamente cargado. El tipo de billetero heredado está siendo obsoleto y mantenimiento para creación de monederos heredados serán eliminados en el futuro. Los monederos heredados pueden ser migrados a un descriptor de monedero con migratewallet.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Advertencia: el formato de la billetera del archivo de volcado "%s" no coincide con el formato especificado en la línea de comandos "%s".</translation>
</message>
@@ -3785,30 +3790,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">No se puede escribir en el directorio de datos "%s"; comprueba los permisos.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">La actualización -txindex iniciada por una versión anterior no puede completarse. Reinicia con la versión anterior o ejecuta un -reindex completo.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s no pudo validar el estado de la instantánea -assumeutxo. Esto indica un problema de hardware, un error en el software o una modificación incorrecta del software que permitió que se cargara una instantánea inválida. Por consiguiente, el nodo se apagará y dejará de utilizar cualquier estado basado en la instantánea, restableciendo la altura de la cadena de %d a %d. En el siguiente reinicio, el nodo reanudará la sincronización desde %d sin usar datos de instantánea. Reporta este incidente a %s, indicando cómo obtuviste la instantánea. Se dejó el estado de cadena de la instantánea inválida en el disco por si resulta útil para diagnosticar el problema que causó este error.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">La configuración de %s es demasiado alta. Las comisiones tan grandes se podrían pagar en una sola transacción.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -blockfilterindex. Desactiva temporalmente blockfilterindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -coinstatsindex. Desactiva temporalmente coinstatsindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">La opción -reindex-chainstate no es compatible con -txindex. Desactiva temporalmente txindex cuando uses -reindex-chainstate, o remplaza -reindex-chainstate por -reindex para reconstruir completamente todos los índices.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">No se pueden proporcionar conexiones específicas y hacer que addrman encuentre conexiones salientes al mismo tiempo.</translation>
</message>
@@ -3817,6 +3802,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error al cargar %s: Se está cargando la billetera firmante externa sin que se haya compilado la compatibilidad del firmante externo</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Error leyendo %s. Todas las teclas leídas correctamente, pero los datos de transacción o metadatos de dirección puedan ser ausentes o incorrectos.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Error: No se puede identificar si los datos de la libreta de direcciones en la billetera pertenecen a billeteras migradas</translation>
</message>
@@ -3829,6 +3818,10 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
<translation type="unfinished">Error: No se puede identificar si la transacción %s en la billetera pertenece a billeteras migradas</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">No se pudo calcular la comisión de incremento porque las UTXO sin confirmar dependen de un grupo enorme de transacciones no confirmadas.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">No se pudo cambiar el nombre del archivo peers.dat inválido. Muévelo o elimínalo, e intenta de nuevo.</translation>
</message>
@@ -3870,7 +3863,7 @@ Ir a Archivo &gt; Abrir billetera para cargar una.
</message>
<message>
<source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
- <translation type="unfinished">La transacción requiere un destino de valor distinto de cero, una tasa de comisión distinta de cero, o una entrada preseleccionada.</translation>
+ <translation type="unfinished">La transacción requiere un destino de valor distinto de 0, una tasa de comisión distinta de 0, o una entrada preseleccionada.</translation>
</message>
<message>
<source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
@@ -3903,10 +3896,6 @@ Intenta ejecutar la última versión del software.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">La categoría especifica de nivel de registro no es compatible: -loglevel=%s. Se espera -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Categorías válidas: %s. Niveles de registro válidos: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -3951,6 +3940,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El archivo de volcado %s no existe.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al confirmar db txn para eliminar transacciones de billetera</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Error al crear %s</translation>
</message>
@@ -3995,16 +3988,12 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error al leer el siguiente registro de la base de datos de la billetera</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Error: No se pudo agregar la transacción solo de observación a la billetera respectiva</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Error al iniciar db txn para eliminar transacciones de billetera</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Error: No se pudo eliminar las transacciones solo de observación</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Error: no se puede extraer el destino del scriptpubkey generado</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4043,10 +4032,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No hay direcciones %s disponibles.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Error: No se pudo eliminar todas las transacciones solo de observación</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Error: Esta billetera ya usa SQLite</translation>
</message>
@@ -4071,6 +4056,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se pueden leer todos los registros en la base de datos</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de leer el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Error: No se pueden eliminar los datos de la libreta de direcciones solo de observación</translation>
</message>
@@ -4079,6 +4068,23 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Error: No se puede escribir el registro en la nueva billetera</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor registro del localizador del bloque del monedero</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Error: no es capaz de escribir el mejor monedero vigilado del bloque del registro localizador</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Error: falló copia de la libreta de direcciones para la billetera 1%s
+ </translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Error: la transacción de la base de datos no se puede ejecutar para la billetera %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Ha fallado la escucha en todos los puertos. Use -listen=0 si desea esto.</translation>
</message>
@@ -4087,10 +4093,18 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Fallo al rescanear la billetera durante la inicialización</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Es erróneo al iniciar indizados, se apaga...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Fallo al verificar la base de datos</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Error al eliminar la transacción: 1%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">La tasa de comisión (%s) es menor que el valor mínimo (%s)</translation>
</message>
@@ -4275,10 +4289,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">El monto de la transacción es demasiado pequeño para pagar la comisión</translation>
</message>
<message>
- <source>This is experimental software.</source>
- <translation type="unfinished">Este es un software experimental.</translation>
- </message>
- <message>
<source>This is the minimum transaction fee you pay on every transaction.</source>
<translation type="unfinished">Esta es la tarifa mínima a pagar en cada transacción.</translation>
</message>
@@ -4287,6 +4297,10 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Esta es la tarifa a pagar si realizas una transacción.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transacción %s no pertenece a esta billetera</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Monto de la transacción muy pequeño</translation>
</message>
@@ -4299,10 +4313,6 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Índice de salidas de cambio de transacciones fuera de alcance</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transacción tiene largo tiempo en una cadena mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transacción debe tener al menos un destinatario</translation>
</message>
@@ -4375,14 +4385,30 @@ No se puede restaurar la copia de seguridad de la billetera.</translation>
<translation type="unfinished">Se desconocen las nuevas reglas activadas (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">El nivel de registro de depuración global -loglevel=%s no es compatible. Valores válidos: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Nivel de acceso global %s = %s no mantenido. Los valores válidos son: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creación errónea del fichero monedero: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates no está mantenido en el encadenamiento %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">La categoría de registro no es compatible %s=%s. </translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Error: no pudo agregar tx de solo vigía %s para monedero de solo vigía</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Error: no se pudieron eliminar las transacciones de watchonly.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">El comentario del agente de usuario (%s) contiene caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_et.ts b/src/qt/locale/bitcoin_et.ts
index e9c32815a9..8ffd068e5c 100644
--- a/src/qt/locale/bitcoin_et.ts
+++ b/src/qt/locale/bitcoin_et.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">V&amp;ali</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Saatvad aadressid</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Vastuvõtvad aadressid</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Need on sinu Bitcoin aadressid maksete saatmiseks. Ennem müntide saatmist kontrolli alati summat ja makse saaja aadressi.</translation>
</message>
@@ -583,10 +575,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Tasu:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Puru:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Peale tehingutasu:</translation>
</message>
@@ -643,10 +631,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopeeri baidid</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopeeri puru</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopeeri vahetusraha</translation>
</message>
@@ -655,14 +639,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 lukustatud)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">jah</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ei</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(silt puudub)</translation>
</message>
@@ -951,6 +927,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>PSBTOperationsDialog</name>
<message>
+ <source>own address</source>
+ <translation type="unfinished">oma aadress</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">või</translation>
</message>
@@ -1295,10 +1275,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Puhasta kõik vormi väljad.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Puru:</translation>
- </message>
- <message>
<source>Clear &amp;All</source>
<translation type="unfinished">Puhasta &amp;Kõik</translation>
</message>
@@ -1331,10 +1307,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopeeri baidid</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopeeri puru</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopeeri vahetusraha</translation>
</message>
@@ -1698,10 +1670,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Saadetud</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Makse iseendale</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Mine'itud</translation>
</message>
@@ -1761,10 +1729,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Saadetud</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Iseendale</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Mine'itud</translation>
</message>
diff --git a/src/qt/locale/bitcoin_eu.ts b/src/qt/locale/bitcoin_eu.ts
index 3dd82387d9..78cac641f0 100644
--- a/src/qt/locale/bitcoin_eu.ts
+++ b/src/qt/locale/bitcoin_eu.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Aukeratu</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Helbideak bidaltzen</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Helbideak jasotzen</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Hauek dira zuk dirua jaso dezaketen Bitcoin helbideak. Egiaztatu beti diru-kopurua eta dirua jasoko duen helbidea zuzen egon daitezen, txanponak bidali baino lehen.</translation>
</message>
@@ -739,10 +731,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">Ordainketa:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Hautsa:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Ordaindu ondoren:</translation>
</message>
@@ -807,10 +795,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">Kopiatu byte-ak</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiatu hautsa</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiatu aldaketa</translation>
</message>
@@ -819,14 +803,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">(%1 blokeatuta)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">bai</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ez</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(izendapenik ez)</translation>
</message>
@@ -944,10 +920,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">Egin diruzorro hutsa...</translation>
</message>
<message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Deskriptorearen zorroa</translation>
- </message>
- <message>
<source>External signer</source>
<translation type="unfinished">Kanpo sinatzailea</translation>
</message>
@@ -1331,6 +1303,10 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">PSBT diskoan gorde da.</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">zure helbidea</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">Kopuru osoa</translation>
</message>
@@ -1712,10 +1688,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">Garbitu formularioko eremu guztiak.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Hautsa:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Aukeratu...</translation>
</message>
@@ -1752,10 +1724,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">Kopiatu byte-ak</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiatu hautsa</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiatu aldaketa</translation>
</message>
@@ -2052,10 +2020,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">Hona bidalia</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Zure buruarentzat ordainketa</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Meatua</translation>
</message>
@@ -2119,10 +2083,6 @@ Sinatzea 'legacy' motako helbideekin soilik da posible</translation>
<translation type="unfinished">Hona bidalia</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Zeure buruari</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Meatua</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fa.ts b/src/qt/locale/bitcoin_fa.ts
index 455921250a..5da96344e5 100644
--- a/src/qt/locale/bitcoin_fa.ts
+++ b/src/qt/locale/bitcoin_fa.ts
@@ -2,190 +2,17 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>&amp;New</source>
- <translation type="unfinished">&amp;جدید</translation>
+ <source>Create a new address</source>
+ <translation type="unfinished">یک آدرس جدید ایجاد کنید</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">گپی آدرسی که اکنون انتخاب کردید در کلیپ بورد سیستم</translation>
+ <translation type="unfinished">کپی آدرسی که اکنون انتخاب کردید در کلیپ بورد سیستم</translation>
</message>
- <message>
- <source>&amp;Copy</source>
- <translation type="unfinished">و کپی</translation>
- </message>
- <message>
- <source>C&amp;lose</source>
- <translation type="unfinished">و بستن</translation>
- </message>
- <message>
- <source>Delete the currently selected address from the list</source>
- <translation type="unfinished">حذف آدرس ‌انتخاب شده کنونی از فهرست</translation>
- </message>
- <message>
- <source>Enter address or label to search</source>
- <translation type="unfinished">برای جستجو یک آدرس یا برچسب را وارد کنید</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">خروجی گرفتن داده‌ها از صفحه کنونی در یک فایل</translation>
- </message>
- <message>
- <source>&amp;Export</source>
- <translation type="unfinished">و صدور</translation>
- </message>
- <message>
- <source>&amp;Delete</source>
- <translation type="unfinished">و حذف</translation>
- </message>
- <message>
- <source>Choose the address to send coins to</source>
- <translation type="unfinished">آدرسی که ارزها به آن ارسال میشود را انتخاب کنید</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished">آدرسی که ارزها را دریافت میکند را انتخاب کنید</translation>
- </message>
- <message>
- <source>C&amp;hoose</source>
- <translation type="unfinished">و انتخاب</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation type="unfinished">آدرس‌های فرستنده</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">آدرس‌های گیرنده</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">اینها آدرسهای ارسال پرداخت های بیتکوین شماست. همیشه قبل از انجام تراکنش مقدار بیتکوینی که قصد دارید ارسال کنید و آدرسی که برای آن بیتکوین ارسال میکنید را دوباره بررسی کنید</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
-Signing is only possible with addresses of the type 'legacy'.</source>
- <translation type="unfinished">اینها آدرس های بیت کوین شما هستند که برای دریافت بیتکوین از آنها استفاده می کنید. اگر میخواهید یک آدرس دریافت بیتکوین جدید برای خود بسازید، میتوانید در صفحه "دریافت ها" از گزینه "ساخت یک آدرس جدید برای دریافت بیتکوین" استفاده کنید
-امکان ساخت امضای تراکنش ها تنها با آدرس هایی که از نوع «legacy» هستند امکان‌پذیر است.</translation>
- </message>
- <message>
- <source>&amp;Copy Address</source>
- <translation type="unfinished">و کپی آدرس</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation type="unfinished">و کپی برچسب</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation type="unfinished">و ویرایش</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation type="unfinished">خروجی گرفتن از لیست آدرس ها</translation>
- </message>
- <message>
- <source>Comma separated file</source>
- <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">فایل جدا شده با ویرگول</translation>
- </message>
- <message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
- <translation type="unfinished">هنگام ذخیره کردن فهرست آدرس ها در فایل %1 خطایی پیش آمد. لطفاً دوباره تلاش کنید.</translation>
- </message>
- <message>
- <source>Exporting Failed</source>
- <translation type="unfinished">اجرای خروجی ناموفق بود</translation>
- </message>
-</context>
-<context>
- <name>AddressTableModel</name>
- <message>
- <source>Label</source>
- <translation type="unfinished">لیبل</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">آدرس</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(بدون لیبل)</translation>
- </message>
-</context>
+ </context>
<context>
<name>AskPassphraseDialog</name>
<message>
- <source>Passphrase Dialog</source>
- <translation type="unfinished">دیالوگ رمزعبور</translation>
- </message>
- <message>
- <source>Enter passphrase</source>
- <translation type="unfinished">جملۀ عبور را وارد کنید</translation>
- </message>
- <message>
- <source>New passphrase</source>
- <translation type="unfinished">جمله عبور تازه را وارد کنید</translation>
- </message>
- <message>
- <source>Repeat new passphrase</source>
- <translation type="unfinished">جملۀ عبور تازه را دوباره وارد کنید</translation>
- </message>
- <message>
- <source>Show passphrase</source>
- <translation type="unfinished">نمایش جملۀ عبور</translation>
- </message>
- <message>
- <source>Encrypt wallet</source>
- <translation type="unfinished">رمزگذاری کیف پول</translation>
- </message>
- <message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">این عملیات برای باز کردن قفل کیف پول شما به رمزعبور کیف پول نیاز دارد.
- </translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation type="unfinished">قفل کیف پول را باز کنید
- </translation>
- </message>
- <message>
- <source>Change passphrase</source>
- <translation type="unfinished">تغییر رمزعبور</translation>
- </message>
- <message>
- <source>Confirm wallet encryption</source>
- <translation type="unfinished">تایید رمزگذاری کیف پول</translation>
- </message>
- <message>
- <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">هشدار: اگر کیف پول خود را رمزگذاری کرده و رمز خود را گم کنید ، &lt;b&gt;تمام بیتکوین های خود را از دست خواهید داد&lt;/b&gt;!</translation>
- </message>
- <message>
- <source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">مطمئن هستید که می خواهید کیف پول خود را رمزگذاری کنید؟</translation>
- </message>
- <message>
- <source>Wallet encrypted</source>
- <translation type="unfinished">کیف پول رمزگذاری شد</translation>
- </message>
- <message>
- <source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">رمز جدید را برای کیف پول خود وارد کنید. &lt;br/&gt;لطفاً از رمزی استفاده کنید که&lt;b&gt;ده یا بیشتر از ده حرف که بصورت تصادفی انتخاب شده اند&lt;/b&gt;، یا &lt;b&gt; حداقل هشت کلمه باشند&lt;/b&gt;</translation>
- </message>
- <message>
- <source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">رمز عبور قدیمی و رمز عبور جدید کیف پول خود را وارد کنید.</translation>
- </message>
- <message>
- <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation type="unfinished">به یاد داشته باشید که رمزگذاری کیف پول شما نمی تواند به طور کامل از سرقت بیت کوین شما در اثر آلوده شدن رایانه به بدافزار محافظت کند.</translation>
- </message>
- <message>
- <source>Wallet to be encrypted</source>
- <translation type="unfinished">کیف پول رمز نگاری شده است</translation>
- </message>
- <message>
<source>Your wallet is about to be encrypted. </source>
<translation type="unfinished">کیف پول شما در حال رمزگذاری ست.</translation>
</message>
@@ -227,19 +54,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">عبارت عبور وارد شده برای رمزگشایی کیف پول نادرست است. این شامل یک کاراکتر تهی (به معنی صفر بایت) است. اگر عبارت عبور را در نسخه ای از این نرم افزار که قدیمی تر نسخه 25.0 است تنظیم کرده اید ، لطفا عبارت را تا آنجایی که اولین کاراکتر تهی قرار دارد امتحان کنید ( خود کاراکتر تهی را درج نکنید ) و دوباره امتحان کنید. اگر این کار موفقیت آمیز بود ، لطفا یک عبارت عبور جدید تنظیم کنید تا دوباره به این مشکل بر نخورید.</translation>
</message>
<message>
- <source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">عبارت عبور کیف پول با موفقیت تغییر کرد.
- </translation>
- </message>
- <message>
- <source>Passphrase change failed</source>
- <translation type="unfinished">تغییر عبارت عبور ناموفق بود.</translation>
- </message>
- <message>
- <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">عبارت عبور قدیمی وارد شده برای رمزگشایی کیف پول نادرست است. این عبارت عبور شامل یک کاراکتر تهی (به عنوان مثال - کاراکتری با حجم صفر بایت) است . اگر عبارت عبور خود را در نسخه ای از این نرم افزار تا قبل از نسخه 25.0 تنظیم کرده اید ،لطفا دوباره عبارت عبور را تا قبل از کاراکتر تهی یا NULL امتحان کنید ( خود کاراکتر تهی را درج نکنید ).</translation>
- </message>
- <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">هشدار: کلید کلاه قفل روشن است!
 </translation>
@@ -300,10 +114,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ناشناس</translation>
</message>
<message>
- <source>Amount</source>
- <translation type="unfinished">میزان وجه:</translation>
- </message>
- <message>
<source>Enter a Bitcoin address (e.g. %1)</source>
<translation type="unfinished">آدرس بیت کوین را وارد کنید (به طور مثال %1)</translation>
</message>
@@ -761,7 +571,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n اتصال(های) فعال به شبکه بیت کوین.</numerusform>
+ <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
</translation>
</message>
<message>
@@ -891,10 +701,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">هزینه</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">گرد و غبار یا داست:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">بعد از احتساب کارمزد</translation>
</message>
@@ -903,46 +709,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">تغییر</translation>
</message>
<message>
- <source>(un)select all</source>
- <translation type="unfinished">(عدم)انتخاب همه</translation>
- </message>
- <message>
- <source>Tree mode</source>
- <translation type="unfinished">حالت درختی</translation>
- </message>
- <message>
<source>List mode</source>
<translation type="unfinished">حالت لیستی</translation>
</message>
<message>
- <source>Amount</source>
- <translation type="unfinished">میزان وجه:</translation>
- </message>
- <message>
- <source>Received with label</source>
- <translation type="unfinished">دریافت شده با برچسب</translation>
- </message>
- <message>
- <source>Received with address</source>
- <translation type="unfinished">دریافت شده با آدرس</translation>
- </message>
- <message>
- <source>Date</source>
- <translation type="unfinished">تاریخ</translation>
- </message>
- <message>
- <source>Confirmations</source>
- <translation type="unfinished">تاییدیه</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">تایید شده</translation>
- </message>
- <message>
- <source>Copy amount</source>
- <translation type="unfinished">کپی مقدار</translation>
- </message>
- <message>
<source>&amp;Copy address</source>
<translation type="unfinished">تکثیر نشانی</translation>
</message>
@@ -983,10 +753,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">کپی کردن بایت ها</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">کپی کردن داست:</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">کپی کردن تغییر</translation>
</message>
@@ -995,22 +761,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(قفل شده است %1)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">بله</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">خیر</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">اگر هر گیرنده مقداری کمتر آستانه فعلی دریافت کند از این لیبل قرمز می‌شود.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(بدون لیبل)</translation>
- </message>
- <message>
<source>change from %1 (%2)</source>
<translation type="unfinished">تغییر از %1 (%2)</translation>
</message>
@@ -1674,18 +1424,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
 </translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">فونت تک فضا(منو اسپیس) در برگه مرور کلی </translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">تعبیه شده%1</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">%1نزدیک ترین تطابق</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">تایید</translation>
</message>
@@ -1875,6 +1613,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">تراکنش نسبتا امضا شده (باینری)</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">آدرس خود</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">میزان کل</translation>
</message>
@@ -1968,11 +1710,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">دریافت شد</translation>
</message>
<message>
- <source>Address</source>
- <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
- <translation type="unfinished">آدرس</translation>
- </message>
- <message>
<source>Type</source>
<extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
<translation type="unfinished">نوع</translation>
@@ -2517,10 +2254,19 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">آدرس سازگار با کیف‌پول‌های قدیمی‌تر تولید می‌کند</translation>
</message>
<message>
+ <source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
+ <translation type="unfinished">یک آدرس سگویت بومی (BIP-173) ایجاد کنید.
+برخی از کیف پول های قدیمی از آن پشتیبانی نمی کنند.</translation>
+ </message>
+ <message>
<source>Bech32m (Taproot)</source>
<translation type="unfinished">Bech32m (تپ‌روت)</translation>
</message>
<message>
+ <source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
+ <translation type="unfinished">Bech32m(BIP-350) یک آپدیت برای Bech32 است، پشتیبانی کیف پول هنوز محدود شده است.</translation>
+ </message>
+ <message>
<source>Could not unlock wallet.</source>
<translation type="unfinished">نمیتوان کیف پول را باز کرد.</translation>
</message>
@@ -2579,22 +2325,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<context>
<name>RecentRequestsTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">تاریخ</translation>
- </message>
- <message>
- <source>Label</source>
- <translation type="unfinished">لیبل</translation>
- </message>
- <message>
<source>Message</source>
<translation type="unfinished">پیام</translation>
</message>
<message>
- <source>(no label)</source>
- <translation type="unfinished">(بدون لیبل)</translation>
- </message>
- <message>
<source>(no message)</source>
<translation type="unfinished">(بدون پیام)</translation>
</message>
@@ -2699,10 +2433,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ورودی ها</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">گرد و غبار یا داست:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">انتخاب کنید...</translation>
</message>
@@ -2756,10 +2486,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">کپی مقدار</translation>
</message>
<message>
- <source>Copy amount</source>
- <translation type="unfinished">کپی مقدار</translation>
- </message>
- <message>
<source>Copy fee</source>
<translation type="unfinished">کپی هزینه</translation>
</message>
@@ -2772,10 +2498,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">کپی کردن بایت ها</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">کپی کردن داست:</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">کپی کردن تغییر</translation>
</message>
@@ -2870,6 +2592,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">تراکنش امضا نشده</translation>
</message>
<message>
+ <source>The PSBT has been copied to the clipboard. You can also save it.</source>
+ <translation type="unfinished">تراکنش بیت کوین با امضای جزئی (PSBT) در کلیپ بورد کپی شده است. همچنین شما می‌توانید آن را ذخیره کنید.</translation>
+ </message>
+ <message>
<source>PSBT saved to disk</source>
<translation type="unfinished">فایل PSBT در دیسک ذخیره شد</translation>
</message>
@@ -2906,6 +2632,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">کارمزد بیشتر از %1 است,این یعنی کارمزد خیلی زیادی در نظر گرفته شده است.</translation>
</message>
+ <message>
+ <source>%1/kvB</source>
+ <translation type="unfinished">%1 kvB</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -2928,11 +2658,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
<translation type="unfinished">این آدرس که شما انتخاب کرده اید بخشی از کیف پول شما نیست.هر یا همه دارایی های شما در این کیف پول به این آدرس ارسال خواهد شد.آیا مطمئن هستید؟</translation>
</message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(بدون لیبل)</translation>
- </message>
-</context>
+ </context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -3156,10 +2882,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">وضعیت</translation>
</message>
<message>
- <source>Date</source>
- <translation type="unfinished">تاریخ</translation>
- </message>
- <message>
<source>Source</source>
<translation type="unfinished">منبع</translation>
</message>
@@ -3259,10 +2981,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ورودی ها</translation>
</message>
<message>
- <source>Amount</source>
- <translation type="unfinished">میزان وجه:</translation>
- </message>
- <message>
<source>true</source>
<translation type="unfinished">درست</translation>
</message>
@@ -3285,18 +3003,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<context>
<name>TransactionTableModel</name>
<message>
- <source>Date</source>
- <translation type="unfinished">تاریخ</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">نوع</translation>
</message>
<message>
- <source>Label</source>
- <translation type="unfinished">لیبل</translation>
- </message>
- <message>
<source>Unconfirmed</source>
<translation type="unfinished">تایید نشده</translation>
</message>
@@ -3325,10 +3035,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ارسال شده به</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">پرداخت به خود</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">استخراج شده</translation>
</message>
@@ -3341,10 +3047,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">(موجود نیست)</translation>
</message>
<message>
- <source>(no label)</source>
- <translation type="unfinished">(بدون لیبل)</translation>
- </message>
- <message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
<translation type="unfinished">وضعیت تراکنش. نشانگر را روی این فیلد نگه دارید تا تعداد تأییدیه‌ها نشان داده شود.</translation>
</message>
@@ -3396,10 +3098,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ارسال شده به</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">به خودت</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">استخراج شده</translation>
</message>
@@ -3465,43 +3163,18 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">خارج کردن یا بالا بردن سابقه تراکنش ها</translation>
</message>
<message>
- <source>Comma separated file</source>
- <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">فایل جدا شده با ویرگول</translation>
- </message>
- <message>
- <source>Confirmed</source>
- <translation type="unfinished">تایید شده</translation>
- </message>
- <message>
<source>Watch-only</source>
<translation type="unfinished">فقط برای تماشا</translation>
</message>
<message>
- <source>Date</source>
- <translation type="unfinished">تاریخ</translation>
- </message>
- <message>
<source>Type</source>
<translation type="unfinished">نوع</translation>
</message>
<message>
- <source>Label</source>
- <translation type="unfinished">لیبل</translation>
- </message>
- <message>
- <source>Address</source>
- <translation type="unfinished">آدرس</translation>
- </message>
- <message>
<source>ID</source>
<translation type="unfinished">شناسه</translation>
</message>
<message>
- <source>Exporting Failed</source>
- <translation type="unfinished">اجرای خروجی ناموفق بود</translation>
- </message>
- <message>
<source>Exporting Successful</source>
<translation type="unfinished">خارج کردن موفقیت آمیز بود Exporting</translation>
</message>
@@ -3583,14 +3256,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<context>
<name>WalletView</name>
<message>
- <source>&amp;Export</source>
- <translation type="unfinished">و صدور</translation>
- </message>
- <message>
- <source>Export the data in the current tab to a file</source>
- <translation type="unfinished">خروجی گرفتن داده‌ها از صفحه کنونی در یک فایل</translation>
- </message>
- <message>
<source>Backup Wallet</source>
<translation type="unfinished">کیف پول پشتیبان
 </translation>
@@ -3691,10 +3356,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
 </translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">نمایه بلوک db حاوی یک «txindex» است. برای پاک کردن فضای اشغال شده دیسک، یک -reindex کامل را اجرا کنید، در غیر این صورت این خطا را نادیده بگیرید. این پیغام خطا دیگر نمایش داده نخواهد شد.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">مبلغ معامله برای ارسال پس از کسر هزینه بسیار ناچیز است
 </translation>
@@ -3999,11 +3660,6 @@ The wallet might have been tampered with or created with malicious intent.
<translation type="unfinished">مقدار تراکنش نمی‌تواند منفی باشد.</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">معاملات بسیار طولانی از یک زنجیره ممپول است
- </translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">تراکنش باید حداقل یک دریافت کننده داشته باشد</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fi.ts b/src/qt/locale/bitcoin_fi.ts
index 02f073d6c3..cbf81afdb2 100644
--- a/src/qt/locale/bitcoin_fi.ts
+++ b/src/qt/locale/bitcoin_fi.ts
@@ -2,10 +2,6 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">Valitse hiiren oikealla painikkeella muokataksesi osoitetta tai nimikettä</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation type="unfinished">Luo uusi osoite</translation>
</message>
@@ -58,14 +54,6 @@
<translation type="unfinished">V&amp;alitse</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Lähetysosoitteet</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Vastaanotto-osoitteet</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Nämä ovat Bitcoin-osoitteesi maksujen lähettämistä varten. Tarkista aina määrä ja vastaanotto-osoite ennen kolikoiden lähettämistä.</translation>
</message>
@@ -262,6 +250,10 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Asetustiedosto %1 saattaa olla vioittunut tai virheellinen.</translation>
</message>
<message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Runaway poikkeus</translation>
+ </message>
+ <message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
<translation type="unfinished">Peruuttamaton virhe on tapahtunut. %1 ei voi enää jatkaa turvallisesti ja sammutetaan.</translation>
</message>
@@ -282,6 +274,11 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Haluatko palauttaa asetukset oletusarvoihin vai keskeyttää tekemättä muutoksia?</translation>
</message>
<message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">Tapahtui kohtalokas virhe. Tarkista, että asetustiedosto on kirjoitettavissa, tai yritä suorittaa ohjelma -nosettings -asetuksilla.</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Virhe: %1</translation>
</message>
@@ -863,10 +860,6 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Palkkio:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Tomu:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Palkkion jälkeen:</translation>
</message>
@@ -947,10 +940,6 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Kopioi tavut</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopioi tomu</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopioi vaihtorahat</translation>
</message>
@@ -959,18 +948,6 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">(%1 lukittu)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">kyllä</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ei</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Tämä nimike muuttuu punaiseksi, jos jokin vastaanottajista on saamassa tämänhetkistä tomun rajaa pienemmän summan.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Saattaa vaihdella +/- %1 satoshia per syöte.</translation>
</message>
@@ -1134,14 +1111,6 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Luo tyhjä lompakko</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Käytä kuvaajia sciptPubKeyn hallinnointiin</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Kuvaajalompakko</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Käytä ulkoista allekirjoituslaitetta, kuten laitteistolompakkoa. Määritä ulkoisen allekirjoittajan skripti ensin lompakon asetuksissa.</translation>
</message>
@@ -1154,10 +1123,6 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Luo</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Koostettu ilman sqlite-tukea (vaaditaan descriptor-lompakoille)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Käännetään ilman ulkoista allekirjoitustukea (tarvitaan ulkoista allekirjoitusta varten)</translation>
@@ -1265,6 +1230,10 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
</translation>
</message>
<message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">Valitse data-kansio</translation>
+ </message>
+ <message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">Ainakin %1 GB tietoa varastoidaan tähän hakemistoon ja tarve kasvaa ajan myötä.</translation>
</message>
@@ -1665,18 +1634,6 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">Käytä erillistä SOCKS&amp;5-välityspalvelinta tavoittaaksesi vertaisia Torin onion-palvelujen kautta:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Monospaced-fontti Overview-välilehdellä:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">upotettu "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">lähin vastaavuus "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Peruuta</translation>
</message>
@@ -1898,8 +1855,8 @@ Allekirjoitus on mahdollista vain 'legacy'-tyyppisillä osoitteilla.</translatio
<translation type="unfinished">PSBT (osittain tallennettu bitcoin-siirto) tallennettiin levylle.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">*Lähettää %1'n kohteeseen %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">oma osoite</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2198,6 +2155,11 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Kartoitettu AS</translation>
</message>
<message>
+ <source>Addresses Processed</source>
+ <extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
+ <translation type="unfinished">Käsitellyt osoitteet</translation>
+ </message>
+ <message>
<source>User Agent</source>
<translation type="unfinished">Käyttöliittymä</translation>
</message>
@@ -2690,10 +2652,6 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Syötteet...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Tomu:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Valitse...</translation>
</message>
@@ -2758,10 +2716,6 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Kopioi tavut</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopioi tomu</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopioi vaihtorahat</translation>
</message>
@@ -2792,10 +2746,6 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Luo osittain allekirjoitetun bitcoin-siirtotapahtuman (PSBT) käytettäväksi mm. offline %1 lompakko tai PSBT-yhteensopiva hardware-lompakko.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> lompakosta '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 - '%2'</translation>
</message>
@@ -3275,10 +3225,6 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Ulostulon indeksi</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (Sertifikaattia ei vahvistettu)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Kauppias</translation>
</message>
@@ -3377,10 +3323,6 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Lähetetty vastaanottajalle</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Maksu itsellesi</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Louhittu</translation>
</message>
@@ -3456,10 +3398,6 @@ Jos saat tämän virheen, pyydä kauppiasta antamaan BIP21-yhteensopiva URI.</tr
<translation type="unfinished">Lähetetty vastaanottajalle</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Itsellesi</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Louhittu</translation>
</message>
@@ -3715,10 +3653,6 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Jaettu MIT -ohjelmistolisenssin alaisuudessa, katso mukana tuleva %s tiedosto tai %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Virhe luettaessa %s! Avaimet luetttiin oikein, mutta rahansiirtotiedot tai osoitekirjan sisältö saattavat olla puutteellisia tai vääriä.</translation>
- </message>
- <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">Virhe: Dump-tiedoston versio ei ole tuettu. Tämä bitcoin-lompakon versio tukee vain version 1 dump-tiedostoja. Annetun dump-tiedoston versio %s</translation>
</message>
@@ -3995,6 +3929,10 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Ladataan lompakko...</translation>
</message>
<message>
+ <source>Missing amount</source>
+ <translation type="unfinished">Puuttuva summa</translation>
+ </message>
+ <message>
<source>Need to specify a port with -whitebind: '%s'</source>
<translation type="unfinished">Pitää määritellä portti argumentilla -whitebind: '%s'</translation>
</message>
@@ -4107,10 +4045,6 @@ Siirry osioon Tiedosto &gt; Avaa lompakko ladataksesi lompakon.
<translation type="unfinished">Lähetyksen siirtosumman tulee olla positiivinen</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Maksutapahtumalla on liian pitkä muistialtaan ketju</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Lähetyksessä tulee olla ainakin yksi vastaanottaja</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fil.ts b/src/qt/locale/bitcoin_fil.ts
index 02f1ebb390..a8d32b00c0 100644
--- a/src/qt/locale/bitcoin_fil.ts
+++ b/src/qt/locale/bitcoin_fil.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Mag-right click para ibahin ang address o label</translation>
+ <translation type="unfinished">Right-click para ma-edit ang address o label</translation>
</message>
<message>
<source>Create a new address</source>
@@ -58,14 +58,6 @@
<translation type="unfinished">Pumili</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Mga address na padadalahan</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Mga address na tatanggap</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ito ang iyong mga Bitcoin address para sa pagpapadala ng bayad. Laging suriin ang halaga at ang address na tatanggap bago magpadala ng coins.</translation>
</message>
@@ -210,6 +202,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ang passphrase na inilagay para sa pag-dedekripto ng pitaka ay hindi tama</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">Ang passphrase na isinumite para sa pag-decrypt ng pitaka ay mali. Naglalaman ito ng null character (halimbawa - isang zero byte). Kung ang passphrase ay itinakda gamit ang isang bersyon ng software na ito bago ang 25.0, subukan muli lamang ang mga karakter mula sa simula hanggang sa una nilalang null character. Kung magtagumpay ito, mangyaring magtakda ng bagong passphrase upang maiwasan ang isyung ito sa hinaharap.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Matagumpay na nabago ang passphrase ng walet.</translation>
</message>
@@ -698,28 +694,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopyahin ang bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopyahin ang dust</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopyahin ang sukli</translation>
</message>
<message>
<source>(%1 locked)</source>
- <translation type="unfinished">(%1 Naka-lock)</translation>
- </message>
- <message>
- <source>yes</source>
- <translation type="unfinished">oo</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">hindi</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ang label na ito ay magiging pula kung ang sinumang tatanggap ay tumanggap ng halagang mas mababa sa kasalukuyang dust threshold.</translation>
+ <translation type="unfinished">(%1 ay naka-lock)</translation>
</message>
<message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
@@ -1393,6 +1373,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">sariling address</translation>
+ </message>
+ <message>
<source>Pays transaction fee: </source>
<translation type="unfinished">babayaran ang transaction fee:</translation>
</message>
@@ -2030,10 +2014,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopyahin ang bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopyahin ang dust</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopyahin ang sukli</translation>
</message>
@@ -2535,10 +2515,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ipinadala sa</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pagbabayad sa iyong sarili</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Namina</translation>
</message>
@@ -2606,10 +2582,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ipinadala sa</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Sa iyong sarili</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Namina</translation>
</message>
@@ -2795,10 +2767,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Naipamahagi sa ilalim ng lisensya ng MIT software, tingnan ang kasamang file %s o %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Error sa pagbabasa %s! Nabasa nang tama ang lahat ng mga key, ngunit ang data ng transaksyon o mga entry sa address book ay maaaring nawawala o hindi tama.</translation>
- </message>
- <message>
<source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
<translation type="unfinished">Mangyaring suriin na ang petsa at oras ng iyong computer ay tama! Kung mali ang iyong orasan, ang %s ay hindi gagana nang maayos.</translation>
</message>
@@ -3039,10 +3007,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Ang mga halaga ng transaksyon ay hindi dapat negative</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Ang transaksyon ay may masyadong mahabang chain ng mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Ang transaksyon ay dapat mayroong kahit isang tatanggap</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fo.ts b/src/qt/locale/bitcoin_fo.ts
new file mode 100644
index 0000000000..2d6a543454
--- /dev/null
+++ b/src/qt/locale/bitcoin_fo.ts
@@ -0,0 +1,1360 @@
+<TS version="2.1" language="fo">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">Høgraklikk fyri at broyta adressu ella spjaldur</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation type="unfinished">Stovna adressu</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation type="unfinished">Strika valdu adressuna av listanum</translation>
+ </message>
+ <message>
+ <source>Enter address or label to search</source>
+ <translation type="unfinished">Leita eftir adressu ella spjaldri</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Address</source>
+ <translation type="unfinished">&amp;Avrita addressu</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Label</source>
+ <translation type="unfinished">Avrita &amp;Spjaldur</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished">&amp;Broyt</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
+ <translation type="unfinished">Villa við goyming av adressuskrá til %1. Vinaliga royn aftur.</translation>
+ </message>
+ </context>
+<context>
+ <name>AddressTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Spjaldur</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Adressa</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(einki spjaldur)</translation>
+ </message>
+</context>
+<context>
+ <name>BitcoinApplication</name>
+ <message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">Uppsetanarfílan %1 kann vera avskeplað ella ógildig.</translation>
+ </message>
+ <message>
+ <source>Internal error</source>
+ <translation type="unfinished">Innanhýsis villa</translation>
+ </message>
+ </context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Do you want to reset settings to default values, or to abort without making changes?</source>
+ <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
+ <translation type="unfinished">Ynskir tú at endurstilla stillingar til upprunaligar stillingar, ella at avlýsa broytingar?</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Villa: %1</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">Upphædd</translation>
+ </message>
+ <message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">Inntøppa eina Bitcoin adressu (t.d. %1)</translation>
+ </message>
+ <message>
+ <source>Ctrl+W</source>
+ <translation type="unfinished">CTRL+W</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
+ <translation type="unfinished">Inngangandi</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">Útgangandi</translation>
+ </message>
+ <message>
+ <source>%1 h</source>
+ <translation type="unfinished">%1 t</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n second(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n sekund</numerusform>
+ <numerusform>%n sekund</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n minute(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n minuttur</numerusform>
+ <numerusform>%n minuttir</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n tími</numerusform>
+ <numerusform>%n tímar</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n dagur</numerusform>
+ <numerusform>%n dagar</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n vika</numerusform>
+ <numerusform>%n vikur</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>%1 and %2</source>
+ <translation type="unfinished">%1 og %2</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation type="unfinished">
+ <numerusform>%n ár</numerusform>
+ <numerusform>%n ár</numerusform>
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>&amp;Overview</source>
+ <translation type="unfinished">&amp;Yvirlit</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation type="unfinished">Sløkk forrit</translation>
+ </message>
+ <message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">&amp;Um %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Vís upplýsingar um %1</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished">Um &amp;Qt</translation>
+ </message>
+ <message>
+ <source>Show information about Qt</source>
+ <translation type="unfinished">Vís upplýsingar um Qt</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Broyt uppsetanarstillingar fyri %1</translation>
+ </message>
+ <message>
+ <source>Network activity disabled.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">Net-virksemi óvirkijað.</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">&amp;Undirrita boð</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">Undirrita boðini við tíni Bitcoin-adressu fyri at prógva at tey eru tíni</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Fíla</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;Stillingar</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;Hjálp</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>%1 behind</source>
+ <translation type="unfinished">%1 aftanfyri</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Villa</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="unfinished">Ávaring</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation type="unfinished">Javnsettur</translation>
+ </message>
+ <message>
+ <source>Ctrl+Q</source>
+ <translation type="unfinished">CTRL+Q</translation>
+ </message>
+ <message>
+ <source>Ctrl+M</source>
+ <translation type="unfinished">CTRL+M</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation type="unfinished">%1 viðskiftari</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">
+ <numerusform>%n virkið samband til Bitcoin netið.</numerusform>
+ <numerusform>%n virkin sambond til Bitcoin netið.</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">Óvirkja net-virksemið.</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">Virkja net-virksemið.</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Villa: %1</translation>
+ </message>
+ <message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">Ávaring: %1</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation type="unfinished">Spjaldur: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation type="unfinished">Adressa: %1
+</translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">Mongd:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">Byte:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Upphædd:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">Vekslipeningur:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">(frá)vel alt</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">Upphædd</translation>
+ </message>
+ <message>
+ <source>Copy amount</source>
+ <translation type="unfinished">Avrita mongd</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Avrita adressu</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Avrita &amp;spjaldur</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">Avrita &amp;upphædd</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">Avrita mongd</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation type="unfinished">Avrita být</translation>
+ </message>
+ <message>
+ <source>Copy change</source>
+ <translation type="unfinished">Avrita vekslipening</translation>
+ </message>
+ <message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation type="unfinished">Kann vera ymiskt +/- %1 satoshi fyri hvørt ískoyti.</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(einki spjaldur)</translation>
+ </message>
+ <message>
+ <source>change from %1 (%2)</source>
+ <translation type="unfinished">vekslipeningur frá %1 (%2)</translation>
+ </message>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(vekslipeningur)</translation>
+ </message>
+</context>
+<context>
+ <name>CreateWalletDialog</name>
+ <message>
+ <source>Advanced Options</source>
+ <translation type="unfinished">Víðkaðar stillingar</translation>
+ </message>
+ </context>
+<context>
+ <name>EditAddressDialog</name>
+ <message>
+ <source>Edit Address</source>
+ <translation type="unfinished">Broyt adressu</translation>
+ </message>
+ <message>
+ <source>&amp;Label</source>
+ <translation type="unfinished">&amp;Spjaldur</translation>
+ </message>
+ <message>
+ <source>The label associated with this address list entry</source>
+ <translation type="unfinished">Spjaldrið knýtt at hesi adressuni í adressuskránni</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">&amp;Adressa</translation>
+ </message>
+ </context>
+<context>
+ <name>FreespaceChecker</name>
+ <message>
+ <source>name</source>
+ <translation type="unfinished">navn</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message numerus="yes">
+ <source>%n GB of space available</source>
+ <translation type="unfinished">
+ <numerusform>%n GB av goymsluplássi tøkt</numerusform>
+ <numerusform>%n GB av goymsluplássi tøkt</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation type="unfinished">
+ <numerusform>(av %n GB ið tørvur er á)</numerusform>
+ <numerusform>(av %n GB ið tørvur er á)</numerusform>
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(%n GB needed for full chain)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>Approximately %1 GB of data will be stored in this directory.</source>
+ <translation type="unfinished">Á leið %1 GB av dátum verða goymd í hesi fíluskránni.</translation>
+ </message>
+ <message numerus="yes">
+ <source>(sufficient to restore backups %n day(s) old)</source>
+ <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Villa</translation>
+ </message>
+ <message>
+ <source>Welcome</source>
+ <translation type="unfinished">Vælkomin</translation>
+ </message>
+ <message>
+ <source>Welcome to %1.</source>
+ <translation type="unfinished">Vælkomin til %1.</translation>
+ </message>
+ <message>
+ <source> GB</source>
+ <translation type="unfinished">GB</translation>
+ </message>
+ <message>
+ <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
+ <translation type="unfinished">Hendan innleiðandi stevjavningin er sera krevjandi, og kann avdúka trupulleikar, við tólbúnaðinum í teldu tíni, ið tú annars ikki hevur varnast. %1 heldur á fram at takað niður, hvørja ferð %1 verður koyrt.</translation>
+ </message>
+ </context>
+<context>
+ <name>HelpMessageDialog</name>
+ <message>
+ <source>About %1</source>
+ <translation type="unfinished">Um %1</translation>
+ </message>
+ </context>
+<context>
+ <name>ShutdownWindow</name>
+ <message>
+ <source>%1 is shutting down…</source>
+ <translation type="unfinished">%1 letur aftur...</translation>
+ </message>
+ </context>
+<context>
+ <name>ModalOverlay</name>
+ <message>
+ <source>Progress</source>
+ <translation type="unfinished">Gongd</translation>
+ </message>
+ <message>
+ <source>Progress increase per hour</source>
+ <translation type="unfinished">Framgongd um tíman</translation>
+ </message>
+ <message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">Mett tíð eftir til fulla stevjavnan</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">Loka</translation>
+ </message>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished">Stillingar</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">Koyr %1 sjálvvirkandi eftir innritan á stýrikervið</translation>
+ </message>
+ <message>
+ <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
+ <translation type="unfinished">Fullfíggja leið til eitt %1 sambæriligt skeljarrit (t.d. C:\Downloads\hwi.exe ella /Users/you/Downloads/hwi.py). Gev gætur: Illbúnaður kann stjala tín pening!</translation>
+ </message>
+ <message>
+ <source>Open Configuration File</source>
+ <translation type="unfinished">Lat upp uppsetanarfíl</translation>
+ </message>
+ <message>
+ <source>Reset all client options to default.</source>
+ <translation type="unfinished">Endurstilla allar viðskiftarastillingar til sjálvsettar.</translation>
+ </message>
+ <message>
+ <source>&amp;Reset Options</source>
+ <translation type="unfinished">&amp;Endurstilla stillingar</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">Sjálvvirkandi upplating av Bicoin viðskiftara porturinum á beinaranum. Hetta virkar bert um UPnP er virkja í beinaranum, á netinum tú brúkar.</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">Sjálvvirkandi upplating av Bicoin viðskiftara porturinum á beinaranum. Hetta virkar bert um NAT-PMP er virkja í beinaranum, á netinum tú brúkar. Ytra porturnummari kann vera tilvildarligt.</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">&amp;Portur:</translation>
+ </message>
+ <message>
+ <source>User Interface &amp;language:</source>
+ <translation type="unfinished">Mál á nýtaramóti:</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation type="unfinished">Her kann mál á nýtaramóti ásetast. Stillingin hevur virknað eftir at %1 er endurbyrja.</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Avlýs</translation>
+ </message>
+ <message>
+ <source>default</source>
+ <translation type="unfinished">sjálvsett</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">Vátta endurstilling av stillingum</translation>
+ </message>
+ <message>
+ <source>Client restart required to activate changes.</source>
+ <extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
+ <translation type="unfinished">Endurbyrjan av viðskiftara kravd fyri at virkja broyting(ar).</translation>
+ </message>
+ <message>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
+ <translation type="unfinished">Viðskiftari verður slóktur. Ynskir tú at halda áfram?</translation>
+ </message>
+ <message>
+ <source>Configuration options</source>
+ <extracomment>Window title text of pop-up box that allows opening up of configuration file.</extracomment>
+ <translation type="unfinished">Uppsetanarstillingar</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Avlýs</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Villa</translation>
+ </message>
+ <message>
+ <source>The configuration file could not be opened.</source>
+ <translation type="unfinished">Innlesan av uppsetanarfílu miseydnaðist.</translation>
+ </message>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">Broytingin krevur endurbyrjan av viðskiftaranum.</translation>
+ </message>
+ </context>
+<context>
+ <name>OverviewPage</name>
+ <message>
+ <source>Available:</source>
+ <translation type="unfinished">Tókt:</translation>
+ </message>
+ <message>
+ <source>Pending:</source>
+ <translation type="unfinished">Óváttað:</translation>
+ </message>
+ </context>
+<context>
+ <name>PSBTOperationsDialog</name>
+ <message>
+ <source>Save…</source>
+ <translation type="unfinished">Goym...</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">egin adressa</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">Samlað upphædd</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">ella</translation>
+ </message>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ <message>
+ <source>Age</source>
+ <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
+ <translation type="unfinished">Aldur</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
+ <translation type="unfinished">Móttikið</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
+ <translation type="unfinished">Adressa</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
+ <translation type="unfinished">Slag</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
+ <translation type="unfinished">Net</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An Inbound Connection from a Peer.</extracomment>
+ <translation type="unfinished">Inngangandi</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">Útgangandi</translation>
+ </message>
+</context>
+<context>
+ <name>QRImageWidget</name>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Goym mynd...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">&amp;Avrita mynd</translation>
+ </message>
+ <message>
+ <source>Save QR Code</source>
+ <translation type="unfinished">Goym QR kotu</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
+ <translation type="unfinished">PNG mynd</translation>
+ </message>
+</context>
+<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>Client version</source>
+ <translation type="unfinished">Viðskiftaraútgáva</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">Net</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">Navn</translation>
+ </message>
+ <message>
+ <source>Number of connections</source>
+ <translation type="unfinished">Tal av sambondum</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished">Minnisnýtsla</translation>
+ </message>
+ <message>
+ <source>&amp;Reset</source>
+ <translation type="unfinished">Tómstilla</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <translation type="unfinished">Móttikið</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation type="unfinished">Útgáva</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping tíð</translation>
+ </message>
+ <message>
+ <source>Debug log file</source>
+ <translation type="unfinished">Gerðalistafíla til villukemban</translation>
+ </message>
+ <message>
+ <source>In:</source>
+ <translation type="unfinished">Niður:</translation>
+ </message>
+ <message>
+ <source>Out:</source>
+ <translation type="unfinished">Upp:</translation>
+ </message>
+ <message>
+ <source>Ctrl++</source>
+ <extracomment>Main shortcut to increase the RPC console font size.</extracomment>
+ <translation type="unfinished">CTRL++</translation>
+ </message>
+ <message>
+ <source>Ctrl+=</source>
+ <extracomment>Secondary shortcut to increase the RPC console font size.</extracomment>
+ <translation type="unfinished">CTRL+=</translation>
+ </message>
+ <message>
+ <source>Ctrl+-</source>
+ <extracomment>Main shortcut to decrease the RPC console font size.</extracomment>
+ <translation type="unfinished">CTRL+-</translation>
+ </message>
+ <message>
+ <source>Ctrl+_</source>
+ <extracomment>Secondary shortcut to decrease the RPC console font size.</extracomment>
+ <translation type="unfinished">CTRL+_</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <extracomment>Context menu action to copy the address of a peer.</extracomment>
+ <translation type="unfinished">&amp;Avrita adressu</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation type="unfinished">1 &amp;tíma</translation>
+ </message>
+ <message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 &amp;dag</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 &amp;viku</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 &amp;ár</translation>
+ </message>
+ <message>
+ <source>Ctrl+I</source>
+ <translation type="unfinished">CTRL+I</translation>
+ </message>
+ <message>
+ <source>Ctrl+T</source>
+ <translation type="unfinished">CTRL+T</translation>
+ </message>
+ <message>
+ <source>Ctrl+N</source>
+ <translation type="unfinished">CTRL+N</translation>
+ </message>
+ <message>
+ <source>Ctrl+P</source>
+ <translation type="unfinished">CTRL+P</translation>
+ </message>
+ <message>
+ <source>Executing…</source>
+ <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
+ <translation type="unfinished">Innir...</translation>
+ </message>
+ <message>
+ <source>via %1</source>
+ <translation type="unfinished">umvegis %1</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation type="unfinished">Ja</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation type="unfinished">Nei</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">Til</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">Frá</translation>
+ </message>
+ </context>
+<context>
+ <name>ReceiveCoinsDialog</name>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">&amp;Spjaldur:</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">Tómstilla</translation>
+ </message>
+ <message>
+ <source>Show</source>
+ <translation type="unfinished">Vís</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Avrita adressu</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Avrita &amp;spjaldur</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">Avrita &amp;upphædd</translation>
+ </message>
+ </context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ <message>
+ <source>Address:</source>
+ <translation type="unfinished">Adressu:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Upphædd:</translation>
+ </message>
+ <message>
+ <source>Label:</source>
+ <translation type="unfinished">Spjaldur:</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">Boð:</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Address</source>
+ <translation type="unfinished">Avrita &amp;adressu</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Goym mynd...</translation>
+ </message>
+ </context>
+<context>
+ <name>RecentRequestsTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Spjaldur</translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished">Boð</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(einki spjaldur)</translation>
+ </message>
+ <message>
+ <source>(no message)</source>
+ <translation type="unfinished">(eingi boð)</translation>
+ </message>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">Mongd:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">Byte:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Upphædd:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">Vekslipeningur:</translation>
+ </message>
+ <message>
+ <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
+ <translation type="unfinished">Um hetta er virkja, men teigurin til adressu fyri vekslipening er tómur ella ógildigur, so verður vekslipeningurin sendur til eina ný-myndaða adressu.</translation>
+ </message>
+ <message>
+ <source>Custom change address</source>
+ <translation type="unfinished">Adressa til vekslipening</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">Loka</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation type="unfinished">Viðmælt:</translation>
+ </message>
+ <message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">Send til fleiri móttakarar í einum</translation>
+ </message>
+ <message>
+ <source>Choose…</source>
+ <translation type="unfinished">Vel...</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">Tómstilla &amp;alt</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">Avrita mongd</translation>
+ </message>
+ <message>
+ <source>Copy amount</source>
+ <translation type="unfinished">Avrita mongd</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation type="unfinished">Avrita být</translation>
+ </message>
+ <message>
+ <source>Copy change</source>
+ <translation type="unfinished">Avrita vekslipening</translation>
+ </message>
+ <message>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">Undirrita á eind</translation>
+ </message>
+ <message>
+ <source>%1 to '%2'</source>
+ <translation type="unfinished">%1 til '%2'</translation>
+ </message>
+ <message>
+ <source>%1 to %2</source>
+ <translation type="unfinished">%1 til %2</translation>
+ </message>
+ <message>
+ <source>Sign failed</source>
+ <translation type="unfinished">Undirritan miseydnaðist</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">ella</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">Samlað upphædd</translation>
+ </message>
+ <message>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation type="unfinished">Móttakara adressan er ógildig. Vinaliga eftirkanna.</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>Warning: Invalid Bitcoin address</source>
+ <translation type="unfinished">Ávaring: Ógildig Bitcoin adressa</translation>
+ </message>
+ <message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">Ávaring: Ókend adressa til vekslipening</translation>
+ </message>
+ <message>
+ <source>Confirm custom change address</source>
+ <translation type="unfinished">Váttað adressu til vekslipening</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(einki spjaldur)</translation>
+ </message>
+</context>
+<context>
+ <name>SendCoinsEntry</name>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">&amp;Spjaldur:</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">Brúka adressuna ið frammanundan var brúkt</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished">ALT+A</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation type="unfinished">ALT+P</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">Boð:</translation>
+ </message>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>Signatures - Sign / Verify a Message</source>
+ <translation type="unfinished">Undirskriftir - Undirrita / Vátta eini boð</translation>
+ </message>
+ <message>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">&amp;Undirrita Boð</translation>
+ </message>
+ <message>
+ <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">Tú kann skriva undir boð/sáttmálar við tínum adressum, fyri at prógva at tú kanst móttaka bitcoin sendar til tær. Ver ansin so tú ikki skrivar undir nakað ógreitt ella tilvildarligt, tí fysking-álop kunnu royna at snýta teg til at latað tín samleika til tey. Undirrita einans nágreiniligar útsagnir ið tú tekur undir við.</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">Bitcoin adressan at undirskriva boðini við</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">Brúka adressuna ið frammanundan var brúkt</translation>
+ </message>
+ <message>
+ <source>Alt+A</source>
+ <translation type="unfinished">ALT+A</translation>
+ </message>
+ <message>
+ <source>Alt+P</source>
+ <translation type="unfinished">ALT+P</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">Inntøppa boðini, tú ynskir at undirrita, her</translation>
+ </message>
+ <message>
+ <source>Signature</source>
+ <translation type="unfinished">Undirskrift</translation>
+ </message>
+ <message>
+ <source>Sign the message to prove you own this Bitcoin address</source>
+ <translation type="unfinished">Undirskriva boðini fyri at prógva at Bitcoin-adressan er tín</translation>
+ </message>
+ <message>
+ <source>Sign &amp;Message</source>
+ <translation type="unfinished">&amp;Undirrita boð</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">Tómstilla &amp;alt</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address the message was signed with</source>
+ <translation type="unfinished">Bitcoin-adressan ið undirskrivaði boðini</translation>
+ </message>
+ <message>
+ <source>The signed message to verify</source>
+ <translation type="unfinished">Undirritað boð at vátta</translation>
+ </message>
+ <message>
+ <source>Click "Sign Message" to generate signature</source>
+ <translation type="unfinished">Trýst á "Undirrita boð" fyri at gera eina undirskrift</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation type="unfinished">Eingin villa</translation>
+ </message>
+ <message>
+ <source>Message signing failed.</source>
+ <translation type="unfinished">Undirritan av boðum miseydnaðist.</translation>
+ </message>
+ <message>
+ <source>Message signed.</source>
+ <translation type="unfinished">Boð undirritað</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">Undirskriftin er ógildig.</translation>
+ </message>
+ <message>
+ <source>Please check the signature and try again.</source>
+ <translation type="unfinished">Vinaliga kanna undirskriftina og royn aftur.</translation>
+ </message>
+ <message>
+ <source>The signature did not match the message digest.</source>
+ <translation type="unfinished">Undirskriftin samsvaraði ikki við innihaldi í boðnum.</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionDesc</name>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished">Kelda</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">Frá</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">Til</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">egin adressa</translation>
+ </message>
+ <message>
+ <source>label</source>
+ <translation type="unfinished">spjaldur</translation>
+ </message>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished">Boð</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">Viðmerking</translation>
+ </message>
+ <message>
+ <source>Inputs</source>
+ <translation type="unfinished">Ískoytir</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">Upphædd</translation>
+ </message>
+ <message>
+ <source>true</source>
+ <translation type="unfinished">satt</translation>
+ </message>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">ósatt</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionDescDialog</name>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">Nágreinilig lýsing um %1</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Slag</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Spjaldur</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">Sent til</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(einki spjaldur)</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionView</name>
+ <message>
+ <source>Today</source>
+ <translation type="unfinished">Í dag</translation>
+ </message>
+ <message>
+ <source>This week</source>
+ <translation type="unfinished">Hesa vikuna</translation>
+ </message>
+ <message>
+ <source>This month</source>
+ <translation type="unfinished">Hendan mánaðin</translation>
+ </message>
+ <message>
+ <source>Last month</source>
+ <translation type="unfinished">Síðsta mánað</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">Í ár</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">Sent til</translation>
+ </message>
+ <message>
+ <source>Min amount</source>
+ <translation type="unfinished">Minstaupphædd</translation>
+ </message>
+ <message>
+ <source>Range…</source>
+ <translation type="unfinished">Talstrekki...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;Avrita adressu</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">Avrita &amp;spjaldur</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">Avrita &amp;upphædd</translation>
+ </message>
+ <message>
+ <source>&amp;Edit address label</source>
+ <translation type="unfinished">&amp;Broyt adressuspjaldur</translation>
+ </message>
+ <message>
+ <source>Show in %1</source>
+ <extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
+ <translation type="unfinished">Vís í %1</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">Slag</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Spjaldur</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Adressa</translation>
+ </message>
+ <message>
+ <source>Range:</source>
+ <translation type="unfinished">Talstrekki:</translation>
+ </message>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">til</translation>
+ </message>
+</context>
+<context>
+ <name>WalletFrame</name>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Villa</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletModel</name>
+ <message>
+ <source>Increase:</source>
+ <translation type="unfinished">Øking:</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletView</name>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Avlýs</translation>
+ </message>
+</context>
+<context>
+ <name>bitcoin-core</name>
+ <message>
+ <source>The %s developers</source>
+ <translation type="unfinished">%smennararnir</translation>
+ </message>
+ <message>
+ <source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
+ <translation type="unfinished">%s umbøn at lurta á portur %u. Hetta portrið er tulkað "óhóskandi" og tí er ósannlíkt at nakar viðskiftari sambindur í tað. Sí lista yvir "óhóskandi" portur og nágreiniligari upplýsingar í doc/p2p-bad-ports.md.</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">Vinaliga tryggja at dagfesting og tíð, í teldu tíni, eru røtt! Er klokkan skeiv virkar %s ikki sum ætlað.</translation>
+ </message>
+ <message>
+ <source>%s is set very high!</source>
+ <translation type="unfinished">Ásetingin %s er sera høgt!</translation>
+ </message>
+ <message>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation type="unfinished">-maxmempool skal vera í minsta lagi %d MB</translation>
+ </message>
+ <message>
+ <source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
+ <translation type="unfinished">Útgangandi sambond eru avmarkaði til CJDNS (-onlynet=cjdns) men -cjdnsreachable er ikki ásett.</translation>
+ </message>
+ <message>
+ <source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
+ <translation type="unfinished">Útgangandi sambond avmarkaði til i2p (-onlynet=i2p) men -i2psam er ikki ásett.</translation>
+ </message>
+ <message>
+ <source>Error loading %s</source>
+ <translation type="unfinished">Villa við innlesan %s</translation>
+ </message>
+ <message>
+ <source>Error reading configuration file: %s</source>
+ <translation type="unfinished">Villa við innlesing av uppsetanarfílu: %s</translation>
+ </message>
+ <message>
+ <source>Error reading from database, shutting down.</source>
+ <translation type="unfinished">Villa við innlesan av dátugrunni. Letur aftur.</translation>
+ </message>
+ <message>
+ <source>Error: Disk space is low for %s</source>
+ <translation type="unfinished">Villa: Tøkt disk goymslupláss og lítið til %s</translation>
+ </message>
+ <message>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">Villa: Fekk lykil ið ikki er sekstandatal: %s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">Villa: Fekk virði ið ikki er sekstandatal: %s</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">Villa: Ongar %s adressur tøkar.</translation>
+ </message>
+ <message>
+ <source>Error: Unable to begin reading all records in the database</source>
+ <translation type="unfinished">Villa: Bar ikki til at byrja at innlesa skrásetingar í dátugrunninum</translation>
+ </message>
+ <message>
+ <source>Error: Unable to parse version %u as a uint32_t</source>
+ <translation type="unfinished">Villa: Bar ikki til at tulkað útgávu %u sum uint32_t</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read all records in the database</source>
+ <translation type="unfinished">Villa: Bar ikki til at innlesa allar skrásetingar í dátugrunninum</translation>
+ </message>
+ <message>
+ <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
+ <translation type="unfinished">Miseydnaðist at lurta á nøkrum portri. Brúka -listen=0 um tú ikki ynskir at lurta á nøkrum portri.</translation>
+ </message>
+ <message>
+ <source>Listening for incoming connections failed (listen returned error %s)</source>
+ <translation type="unfinished">Lurtingin eftir inngangandi sambondum miseydnaðist (lurtingin gav villuna %s)</translation>
+ </message>
+ <message>
+ <source>No addresses available</source>
+ <translation type="unfinished">Ongar adressur tøkar</translation>
+ </message>
+ <message>
+ <source>The source code is available from %s.</source>
+ <translation type="unfinished">Keldukotan er tøk á %s.</translation>
+ </message>
+ <message>
+ <source>The specified config file %s does not exist</source>
+ <translation type="unfinished">Ásetta uppsetanarfílan %s finst ikki</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation type="unfinished">Hetta er royndar-ritbúnaður.</translation>
+ </message>
+ <message>
+ <source>Settings file could not be read</source>
+ <translation type="unfinished">Lesing av uppsetanarfílu miseydnaðist</translation>
+ </message>
+ <message>
+ <source>Settings file could not be written</source>
+ <translation type="unfinished">Skriving av uppsetanarfílu miseydnaðist</translation>
+ </message>
+</context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_fr.ts b/src/qt/locale/bitcoin_fr.ts
index ed11aecf53..796e1affe6 100644
--- a/src/qt/locale/bitcoin_fr.ts
+++ b/src/qt/locale/bitcoin_fr.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Clic droit pour modifier l'adresse ou l'étiquette</translation>
+ <translation type="unfinished">Cliquer à droite pour modifier l’adresse ou l’étiquette</translation>
</message>
<message>
<source>Create a new address</source>
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copier l’adresse sélectionnée actuellement dans le presse-papiers</translation>
+ <translation type="unfinished">Copier dans le presse-papiers l’adresse sélectionnée actuellement</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -27,15 +27,15 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Supprimer l’adresse sélectionnée actuellement de la liste</translation>
+ <translation type="unfinished">Supprimer de la liste l’adresse sélectionnée actuellement</translation>
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">Saisir une adresse ou une étiquette à rechercher</translation>
+ <translation type="unfinished">Saisir une adresse ou une étiquette à chercher</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exporter les données de l’onglet actuel vers un fichier</translation>
+ <translation type="unfinished">Exporter les données de l'onglet actuel vers un fichier</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -47,7 +47,7 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Choisir l’adresse à laquelle envoyer des pièces</translation>
+ <translation type="unfinished">Choisir l'adresse à laquelle envoyer des pièces</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
@@ -58,22 +58,14 @@
<translation type="unfinished">C&amp;hoisir</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Adresses d’envoi</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adresses de réception</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ce sont vos adresses Bitcoin pour envoyer des paiements. Vérifiez toujours le montant et l’adresse du destinataire avant d’envoyer des pièces.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
Signing is only possible with addresses of the type 'legacy'.</source>
- <translation type="unfinished">Il s'agit de vos adresses Bitcoin pour la réception des paiements. Utilisez le bouton "Créer une nouvelle adresse de réception" dans l'onglet "Recevoir" pour créer de nouvelles adresses.
-La signature n'est possible qu'avec les adresses de type "patrimoine".</translation>
+ <translation type="unfinished">Ce sont vos adresses Bitcoin pour recevoir des paiements. Utilisez le bouton « Créer une nouvelle adresse de réception » dans l’onglet Recevoir afin de créer de nouvelles adresses.
+Il n’est possible de signer qu’avec les adresses de type « legacy ».</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -89,7 +81,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">Exporter la liste d’adresses</translation>
+ <translation type="unfinished">Exporter la liste d'adresses</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -99,11 +91,19 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<message>
<source>There was an error trying to save the address list to %1. Please try again.</source>
<extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
- <translation type="unfinished">Une erreur est survenue lors de l'enregistrement de la liste d'adresses vers %1. Veuillez réessayer plus tard.</translation>
+ <translation type="unfinished">Une erreur est survenue lors de l’enregistrement de la liste d’adresses vers %1. Veuillez réessayer plus tard.</translation>
+ </message>
+ <message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Adresses d’envois – %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Adresses de réception – %1</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Échec d’exportation</translation>
+ <translation type="unfinished">Échec d'exportation</translation>
</message>
</context>
<context>
@@ -225,19 +225,19 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">La phrase secrète saisie pour le décryptage du portefeuille est incorrecte. Elle contient un caractère nul (c'est-à-dire un octet de zéro). Si la phrase secrète a été définie avec une version de ce logiciel antérieure à la version 25.0, veuillez réessayer en ne saisissant que les caractères jusqu'au premier caractère nul (non compris). Si vous y parvenez, définissez une nouvelle phrase secrète afin d'éviter ce problème à l'avenir.</translation>
+ <translation type="unfinished">La phrase de passe saisie pour le déchiffrement du porte-monnaie est erronée. Elle comporte un caractère nul (c.-à.-d. un octet de zéro). Si la phrase de passe a été définie avec une version de ce logiciel antérieure à 25.0, réessayez en ne saisissant que les caractères jusqu’au premier caractère nul, sans saisir ce dernier. En cas de réussite, définissez une nouvelle phrase de passe afin d’éviter ce problème à l’avenir.</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">La phrase de passe du porte-monnaie a été modifiée avec succès.</translation>
+ <translation type="unfinished">La phrase de passe du porte-monnaie a été modifiée.</translation>
</message>
<message>
<source>Passphrase change failed</source>
- <translation type="unfinished">Le changement de phrase secrète a échoué</translation>
+ <translation type="unfinished">Échec de changement de la phrase de passe</translation>
</message>
<message>
<source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">L'ancienne phrase secrète introduite pour le décryptage du portefeuille est incorrecte. Elle contient un caractère nul (c'est-à-dire un octet de zéro). Si la phrase secrète a été définie avec une version de ce logiciel antérieure à la version 25.0, veuillez réessayer en ne saisissant que les caractères jusqu'au premier caractère nul (non compris).</translation>
+ <translation type="unfinished">L’ancienne phrase de passe saisie pour le déchiffrement du porte-monnaie est erronée. Elle comporte un caractère nul (c.-à.-d. un octet de zéro). Si la phrase de passe a été définie avec une version de ce logiciel antérieure à 25.0, réessayez en ne saisissant que les caractères jusqu’au premier caractère nul, sans saisir ce dernier..</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
@@ -259,7 +259,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<name>BitcoinApplication</name>
<message>
<source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">Le fichier de paramètres %1 est peut-être corrompu ou non valide.</translation>
+ <translation type="unfinished">Le fichier de paramètres %1 est peut-être corrompu ou invalide.</translation>
</message>
<message>
<source>Runaway exception</source>
@@ -271,7 +271,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Internal error</source>
- <translation type="unfinished">Eurrer interne</translation>
+ <translation type="unfinished">Erreur interne</translation>
</message>
<message>
<source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
@@ -303,6 +303,18 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">inconnue</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Intégrée « %1 »</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Police système par défaut « %1 »</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personnalisée…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Montant</translation>
</message>
@@ -628,7 +640,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">Rattrapage en cours…</translation>
+ <translation type="unfinished">Rattrapage…</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -648,7 +660,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Information</source>
- <translation type="unfinished">Informations</translation>
+ <translation type="unfinished">Renseignements</translation>
</message>
<message>
<source>Up to date</source>
@@ -701,20 +713,28 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<message>
<source>Restore Wallet…</source>
<extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
- <translation type="unfinished">Restaurer le Portefeuille...</translation>
+ <translation type="unfinished">Restaurer le porte-monnaie…</translation>
</message>
<message>
<source>Restore a wallet from a backup file</source>
<extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">Restaurer le Portefeuille depuis un fichier de sauvegarde</translation>
+ <translation type="unfinished">Restaurer le porte-monnaie d’un fichier de sauvegarde</translation>
</message>
<message>
<source>Close all wallets</source>
<translation type="unfinished">Fermer tous les porte-monnaie</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrer le porte-monnaie</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrer un porte-monnaie</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Afficher le message d’aide de %1 pour obtenir la liste des options possibles de ligne de commande Bitcoin</translation>
+ <translation type="unfinished">Afficher le message d’aide de %1 pour obtenir la liste des options possibles en ligne de commande Bitcoin</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -730,7 +750,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>No wallets available</source>
- <translation type="unfinished">Aucun porte-monnaie n’est disponible</translation>
+ <translation type="unfinished">Aucun porte-monnaie n’est proposé</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -740,12 +760,12 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">Lancer un Portefeuille de sauvegarde</translation>
+ <translation type="unfinished">Charger la sauvegarde d’un porte-monnaie</translation>
</message>
<message>
<source>Restore Wallet</source>
<extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">Restaurer le portefeuille</translation>
+ <translation type="unfinished">Restaurer le porte-monnaie</translation>
</message>
<message>
<source>Wallet Name</source>
@@ -780,8 +800,8 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n connexion active avec le réseau Bitcoin.</numerusform>
- <numerusform>%n connexions actives avec le réseau Bitcoin.</numerusform>
+ <numerusform>%n connexion active vers le réseau Bitcoin.</numerusform>
+ <numerusform>%n de connexions actives vers le réseau Bitcoin.</numerusform>
</translation>
</message>
<message>
@@ -806,7 +826,15 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">En-têtes de pré-synchronisation (%1%)...</translation>
+ <translation type="unfinished">Présynchronisation des en-têtes (%1 %)…</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Erreur de création du porte-monnaie</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Impossible de créer un nouveau porte-monnaie. Le logiciel a été compilé sans prise en charge de sqlite (nécessaire pour les porte-monnaie de descripteurs) </translation>
</message>
<message>
<source>Error: %1</source>
@@ -915,10 +943,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Frais :</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Poussière :</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Après les frais :</translation>
</message>
@@ -964,11 +988,11 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Copier l’&amp;étiquette</translation>
+ <translation type="unfinished">Copier l’é&amp;tiquette</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">Copier le &amp;montant</translation>
+ <translation type="unfinished">Copier le mont&amp;ant</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
@@ -999,10 +1023,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Copier les octets</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copier la poussière</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copier la monnaie</translation>
</message>
@@ -1011,18 +1031,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">(%1 verrouillée)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">oui</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">non</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Cette étiquette devient rouge si un destinataire reçoit un montant inférieur au seuil actuel de poussière.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Peut varier +/- %1 satoshi(s) par entrée.</translation>
</message>
@@ -1065,7 +1073,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Too many external signers found</source>
- <translation type="unfinished">Trop de signataires externes trouvés</translation>
+ <translation type="unfinished">Trop de signataires externes ont été trouvés</translation>
</message>
</context>
<context>
@@ -1082,6 +1090,57 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrer le porte-monnaie</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Voulez-vous vraiment migrer le porte-monnaie &lt;i&gt;%1&lt;/i&gt; ?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">La migration du porte-monnaie le convertira en un ou plusieurs porte-monnaie de descripteurs. Une nouvelle sauvegarde du porte-monnaie devra être effectuée.
+Si ce porte-monnaie contient des scripts juste-regarder, un nouveau porte-monnaie sera créé qui comprendra ces scripts juste-regarder.
+Si ce porte-monnaie comprend des scripts solubles, mais non surveillés, un nouveau porte-monnaie différent sera créé comportant ces scripts.
+
+Le processus de migration créera une sauvegarde du porte-monnaie avant migration. Ce fichier de sauvegarde sera nommé &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak et se trouvera dans le dossier de ce porte-monnaie. En cas de migration erronée, la sauvegarde peut être restaurée avec la fonction « Restaurer le porte-monnaie ».</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrer le porte-monnaie</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migration du porte-monnaie&lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Le porte-monnaie « %1 » a été migré.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts juste-regarder ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts solubles, mais non surveillés ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">La migration a échoué</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migration réussie</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1111,27 +1170,22 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<message>
<source>Restore Wallet</source>
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">Restaurer le portefeuille</translation>
- </message>
- <message>
- <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">Restauration du Portefeuille&lt;b&gt;%1&lt;/b&gt;...</translation>
+ <translation type="unfinished">Restaurer le porte-monnaie</translation>
</message>
<message>
<source>Restore wallet failed</source>
<extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">Échec de la restauration du portefeuille</translation>
+ <translation type="unfinished">Échec de restauration du porte-monnaie</translation>
</message>
<message>
<source>Restore wallet warning</source>
<extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
- <translation type="unfinished">Avertissement du Portefeuille restauré</translation>
+ <translation type="unfinished">Avertissement de restauration du porte-monnaie</translation>
</message>
<message>
<source>Restore wallet message</source>
<extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">Message du Portefeuille restauré</translation>
+ <translation type="unfinished">Message de restauration du porte-monnaie</translation>
</message>
</context>
<context>
@@ -1164,6 +1218,14 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Créer un porte-monnaie</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Vous n’êtes qu’à un pas de créer votre nouveau porte-monnaie</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Veuillez fournir un nom et, si désiré, activer toutes les options avancées.</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Nom du porte-monnaie</translation>
</message>
@@ -1200,14 +1262,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Créer un porte-monnaie vide</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Utiliser des descripteurs pour la gestion des scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Porte-monnaie de descripteurs</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Utiliser un appareil externe de signature tel qu’un porte-monnaie matériel. Configurer d’abord le script signataire externe dans les préférences du porte-monnaie.</translation>
</message>
@@ -1220,10 +1274,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Créer</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilé sans prise en charge de sqlite (requis pour les porte-monnaie de descripteurs)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Compilé sans prise en charge des signatures externes (requis pour la signature externe)</translation>
@@ -1312,22 +1362,22 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n Go d’espace libre</numerusform>
+ <numerusform>%n Go d’espace libre</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
- <numerusform>(of %n GB needed)</numerusform>
- <numerusform>(of %n GB needed)</numerusform>
+ <numerusform>(sur %n Go nécessaire)</numerusform>
+ <numerusform>(sur %n Go nécessaires)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
- <numerusform>(%n GB needed for full chain)</numerusform>
- <numerusform>(%n GB needed for full chain)</numerusform>
+ <numerusform>(sur %n Go nécessaire pour la chaîne entière)</numerusform>
+ <numerusform>(sur %n Go nécessaires pour la chaîne entière)</numerusform>
</translation>
</message>
<message>
@@ -1555,6 +1605,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Quand la fenêtre est fermée, la réduire au lieu de quitter l’application. Si cette option est activée, l’application ne sera fermée qu’en sélectionnant Quitter dans le menu.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Police de l’onglet Vue d’ensemble :</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Les options définies dans cette boîte de dialogue sont remplacées par la ligne de commande :</translation>
</message>
@@ -1602,7 +1656,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<message>
<source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
<extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
- <translation type="unfinished">Définissez le nombre de fils de vérification de script. Les valeurs négatives correspondent au nombre de cœurs que vous voulez laisser disponibles pour le système.</translation>
+ <translation type="unfinished">Définissez le nombre de fils de vérification de script. Les valeurs négatives correspondent au nombre de cœurs que vous voulez laisser à la disposition du système.</translation>
</message>
<message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
@@ -1775,18 +1829,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Utiliser un mandataire SOCKS&amp;5 séparé pour atteindre les pairs par les services oignon de Tor :</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Police à espacement constant dans l’onglet Vue d’ensemble :</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">intégré « %1 »</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">correspondance la plus proche « %1 »</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Valider</translation>
</message>
@@ -1889,7 +1931,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Your current spendable balance</source>
- <translation type="unfinished">Votre solde actuel disponible</translation>
+ <translation type="unfinished">Votre solde utilisable actuel</translation>
</message>
<message>
<source>Pending:</source>
@@ -1897,7 +1939,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
- <translation type="unfinished">Total des transactions qui doivent encore être confirmées et qui ne sont pas prises en compte dans le solde disponible</translation>
+ <translation type="unfinished">Total des transactions qui doivent encore être confirmées et qui ne sont pas prises en compte dans le solde utilisable</translation>
</message>
<message>
<source>Immature:</source>
@@ -1925,7 +1967,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Spendable:</source>
- <translation type="unfinished">Disponible :</translation>
+ <translation type="unfinished">Utilisable :</translation>
</message>
<message>
<source>Recent transactions</source>
@@ -1996,7 +2038,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Signed transaction successfully. Transaction is ready to broadcast.</source>
- <translation type="unfinished">La transaction a été signée avec succès et est prête à être diffusée.</translation>
+ <translation type="unfinished">La transaction a été signée et est prête à être diffusée.</translation>
</message>
<message>
<source>Unknown error processing transaction.</source>
@@ -2004,7 +2046,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>Transaction broadcast successfully! Transaction ID: %1</source>
- <translation type="unfinished">La transaction a été diffusée avec succès. ID de la transaction : %1</translation>
+ <translation type="unfinished">La transaction a été diffusée. ID de la transaction : %1</translation>
</message>
<message>
<source>Transaction broadcast failed: %1</source>
@@ -2028,8 +2070,12 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">La TBSP a été enregistrée sur le disque.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Envoie %1 à %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished"> Envoie %1 à %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">votre adresse</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2287,6 +2333,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Sélectionnez un pair pour afficher des renseignements détaillés.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">La version de la couche de transport : %1</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">La chaîne d'ID de session BIP324 en hexadécimal, le cas échéant.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">ID de session</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Si nous relayons des transactions à ce pair.</translation>
</message>
@@ -2500,6 +2558,21 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Récupération d’adresse sortante : de courte durée, pour solliciter des adresses</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">détection : paires pourrait être v1 ou v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocole de transport non chiffré en texte clair</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: Protocole de transport chiffré BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">nous avons sélectionné le pair comme relais à large bande passante</translation>
</message>
@@ -2554,6 +2627,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Fenêtre des nœuds – [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Exécution de la commande en utilisant le porte-monnaie « %1 »</translation>
</message>
@@ -2695,7 +2772,7 @@ Pour plus de précisions sur cette console, tapez %6.
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Copier l’&amp;étiquette</translation>
+ <translation type="unfinished">Copier l’é&amp;tiquette</translation>
</message>
<message>
<source>Copy &amp;message</source>
@@ -2703,7 +2780,7 @@ Pour plus de précisions sur cette console, tapez %6.
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">Copier le &amp;montant</translation>
+ <translation type="unfinished">Copier le mont&amp;ant</translation>
</message>
<message>
<source>Not recommended due to higher fees and less protection against typos.</source>
@@ -2711,15 +2788,15 @@ Pour plus de précisions sur cette console, tapez %6.
</message>
<message>
<source>Generates an address compatible with older wallets.</source>
- <translation type="unfinished">Génère une adresse compatible avec les anciens portefeuilles.</translation>
+ <translation type="unfinished">Génère une adresse compatible avec les anciens porte-monnaie.</translation>
</message>
<message>
<source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
- <translation type="unfinished">Génère une adresse segwit native (BIP-173). Certains anciens portefeuilles ne le supportent pas.</translation>
+ <translation type="unfinished">Génère une adresse segwit native (BIP-173). Certains anciens porte-monnaie ne la prennent pas en charge.</translation>
</message>
<message>
<source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
- <translation type="unfinished">Bech32m (BIP-350) est une mise à jour de Bech32, la prise en charge du portefeuille est encore limitée.</translation>
+ <translation type="unfinished">Bech32m (BIP-350) est une évolution de Bech32. La prise en charge par les porte-monnaie est encore limitée.</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
@@ -2899,10 +2976,6 @@ Pour plus de précisions sur cette console, tapez %6.
<translation type="unfinished">Effacer tous les champs du formulaire.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Poussière :</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Choisir…</translation>
</message>
@@ -2979,10 +3052,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Copier les octets</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copier la poussière</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copier la monnaie</translation>
</message>
@@ -3013,12 +3082,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Crée une transaction Bitcoin signée partiellement (TBSP) à utiliser, par exemple, avec un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">du porte-monnaie '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
- <translation type="unfinished">%1 à '%2'</translation>
+ <translation type="unfinished">%1 à « %2 ».</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -3074,6 +3139,10 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez réviser votre proposition de transaction. Une transaction Bitcoin partiellement signée (TBSP) sera produite, que vous pourrez enregistrer ou copier puis signer avec, par exemple, un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 du porte-monnaie « %2 ».</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Voulez-vous créer cette transaction ?</translation>
@@ -3349,7 +3418,7 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>Private key for the entered address is not available.</source>
- <translation type="unfinished">La clé privée pour l’adresse saisie n’est pas disponible.</translation>
+ <translation type="unfinished">La clé privée pour l’adresse saisie n’est pas proposée.</translation>
</message>
<message>
<source>Message signing failed.</source>
@@ -3513,8 +3582,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Index des sorties</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Le certificat n’a pas été vérifié)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (le certificat n’a pas été vérifié)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3584,7 +3653,7 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>Immature (%1 confirmations, will be available after %2)</source>
- <translation type="unfinished">Immature (%1 confirmations, sera disponible après %2)</translation>
+ <translation type="unfinished">Immature (%1 confirmations, sera accessible après %2)</translation>
</message>
<message>
<source>Generated but not accepted</source>
@@ -3603,10 +3672,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Envoyée à</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Paiement à vous-même</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Miné </translation>
</message>
@@ -3682,10 +3747,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Envoyée à</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">À vous-même</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Miné </translation>
</message>
@@ -3711,11 +3772,11 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Copier l’&amp;étiquette</translation>
+ <translation type="unfinished">Copier l’é&amp;tiquette</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">Copier le &amp;montant</translation>
+ <translation type="unfinished">Copier le mont&amp;ant</translation>
</message>
<message>
<source>Copy transaction &amp;ID</source>
@@ -3781,7 +3842,7 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Échec d’exportation</translation>
+ <translation type="unfinished">Échec d'exportation</translation>
</message>
<message>
<source>There was an error trying to save the transaction history to %1.</source>
@@ -3793,7 +3854,7 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
</message>
<message>
<source>The transaction history was successfully saved to %1.</source>
- <translation type="unfinished">L’historique transactionnel a été enregistré avec succès vers %1.</translation>
+ <translation type="unfinished">L’historique transactionnel a été enregistré vers %1.</translation>
</message>
<message>
<source>Range:</source>
@@ -3920,7 +3981,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Exporter les données de l’onglet actuel vers un fichier</translation>
+ <translation type="unfinished">Exporter les données de l'onglet actuel vers un fichier</translation>
</message>
<message>
<source>Backup Wallet</source>
@@ -3945,7 +4006,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>The wallet data was successfully saved to %1.</source>
- <translation type="unfinished">Les données du porte-monnaie ont été enregistrées avec succès vers %1.</translation>
+ <translation type="unfinished">Les données du porte-monnaie ont été enregistrées vers %1.</translation>
</message>
<message>
<source>Cancel</source>
@@ -3960,7 +4021,11 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
- <translation type="unfinished">%s est corrompu. Essayez l’outil bitcoin-wallet pour le sauver ou restaurez une sauvegarde.</translation>
+ <translation type="unfinished">%s est corrompu. Essayez l’outil de porte-monnaie bitcoin-wallet pour le sauver ou le restaurer d’une sauvegarde.</translation>
+ </message>
+ <message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s a échoué à valider l'état instantané -assumeutxo. Cela indique un problème matériel, ou un bug dans le logiciel, ou une mauvaise modification du logiciel qui a permis de charger un instantané invalide. En conséquence, le nœud s'arrêtera et cessera d'utiliser tout état qui a été construit sur l'instantané, réinitialisant la hauteur de la chaîne de %d à %d. Au prochain redémarrage, le nœud reprendra la synchronisation à partir de %d sans utiliser de données d'instantané. Veuillez signaler cet incident à %s, en précisant comment vous avez obtenu l'instantané. L'état de chaîne d'instantané invalide sera conservé sur le disque au cas où il serait utile pour diagnostiquer le problème qui a causé cette erreur.</translation>
</message>
<message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
@@ -3988,11 +4053,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
- <translation type="unfinished">Erreur de chargement du portefeuille. Le portefeuille nécessite le téléchargement de blocs, et le logiciel ne prend pas actuellement en charge le chargement de portefeuilles lorsque les blocs sont téléchargés dans le désordre lors de l'utilisation de snapshots assumeutxo. Le portefeuille devrait pouvoir être chargé avec succès une fois que la synchronisation des nœuds aura atteint la hauteur %s</translation>
- </message>
- <message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Erreur de lecture de %s. Toutes les clés ont été lues correctement, mais les données de la transaction ou les entrées du carnet d’adresses sont peut-être manquantes ou incorrectes.</translation>
+ <translation type="unfinished">Erreur de chargement du porte-monnaie. Le porte-monnaie exige le téléchargement de blocs, toutefois le logiciel ne prend pas actuellement en charge le chargement de porte-monnaie pendant que des blocs sont téléchargés dans le désordre lors de l’utilisation d’instantanés assumeutxo. Le porte-monnaie devrait pouvoir se charger une fois que la synchronisation des nœuds aura atteint la hauteur %s</translation>
</message>
<message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
@@ -4016,7 +4077,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">Erreur : Impossible de produire des descripteurs pour ce portefeuille existant. Veillez à fournir la phrase secrète du portefeuille s'il est crypté.</translation>
+ <translation type="unfinished">Erreur : Impossible de produire des descripteurs pour cet ancien porte-monnaie. Veillez à fournir la phrase de passe du porte-monnaie s’il est chiffré.</translation>
</message>
<message>
<source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
@@ -4063,6 +4124,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Élagage : la dernière synchronisation de porte-monnaie va par-delà les données élaguées. Vous devez -reindex (réindexer, télécharger de nouveau toute la chaîne de blocs en cas de nœud élagué)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">La modification de '%s' -&gt; '%s' a échoué. Vous devriez résoudre cela en déplaçant ou en supprimant manuellement le répertoire de snapshot invalide %s, sinon vous rencontrerez la même erreur à nouveau au prochain démarrage.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase : la version %d du schéma de porte-monnaie sqlite est inconnue. Seule la version %d est prise en charge</translation>
</message>
@@ -4071,10 +4136,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">La base de données des blocs comprend un bloc qui semble provenir du futur. Cela pourrait être causé par la date et l’heure erronées de votre ordinateur. Ne reconstruisez la base de données des blocs que si vous êtes certain que la date et l’heure de votre ordinateur sont justes.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">La base de données d’indexation des blocs comprend un « txindex » hérité. Pour libérer l’espace disque occupé, exécutez un -reindex complet ou ignorez cette erreur. Ce message d’erreur ne sera pas affiché de nouveau.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Le montant de la transaction est trop bas pour être envoyé une fois que les frais ont été déduits</translation>
</message>
@@ -4111,12 +4172,20 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Le format de fichier porte-monnaie « %s » indiqué est inconnu. Veuillez soit indiquer « bdb » soit « sqlite ».</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Niveau de journalisation spécifique à la catégorie non pris en charge %1$s=%2$s. Attendu %1$s=&lt;catégorie&gt;:&lt;niveaudejournal&gt;. Catégories valides : %3$s. Niveaux de journalisation valides : %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Le format de la base de données chainstate n'est pas supporté. Veuillez redémarrer avec -reindex-chainstate. Cela reconstruira la base de données chainstate.</translation>
</message>
<message>
<source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
- <translation type="unfinished">Portefeuille créé avec succès. Le type de portefeuille ancien est en cours de suppression et la prise en charge de la création et de l'ouverture des portefeuilles anciens sera supprimée à l'avenir.</translation>
+ <translation type="unfinished">Le porte-monnaie a été créé. Le type de porte-monnaie ancien devient obsolète et la prise en charge de la création et de l’ouverture des porte-monnaie anciens sera supprimée à l’avenir.</translation>
+ </message>
+ <message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Le porte-monnaie a été créé. Le type de porte-monnaie ancien devient obsolète et la prise en charge de la création et de l’ouverture des porte-monnaie anciens sera supprimée à l’avenir. Les anciens porte-monnaie peuvent être migrés vers un porte-monnaie de descripteurs avec migratewallet.</translation>
</message>
<message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
@@ -4167,30 +4236,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Impossible d’écrire dans le répertoire de données « %s » ; veuillez vérifier les droits.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">La mise à niveau -txindex lancée par une version précédente ne peut pas être achevée. Redémarrez la version précédente ou exécutez un -reindex complet.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%sn'a pas réussi à valider l'état de l'instantané -assumeutxo. Cela indique un problème matériel, un bug dans le logiciel ou une mauvaise modification du logiciel qui a permis le chargement d'une snapshot invalide. En conséquence, le nœud s'arrêtera et cessera d'utiliser tout état construit sur la snapshot, ce qui réinitialisera la taille de la chaîne de %d à %d. Au prochain redémarrage, le nœud reprendra la synchronisation à partir de %d sans utiliser les données de la snapshot. Veuillez signaler cet incident à %s, en indiquant comment vous avez obtenu la snapshot. L'état de chaîne de la snapshot non valide a été laissé sur le disque au cas où il serait utile pour diagnostiquer le problème à l'origine de cette erreur.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s est très élevé ! Des frais aussi importants pourraient être payés sur une seule transaction.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'option -reindex-chainstate n'est pas compatible avec -blockfilterindex. Veuillez désactiver temporairement blockfilterindex lorsque vous utilisez -reindex-chainstate, ou remplacez -reindex-chainstate par -reindex pour reconstruire complètement tous les index.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'option -reindex-chainstate n'est pas compatible avec -coinstatsindex. Veuillez désactiver temporairement coinstatsindex lorsque vous utilisez -reindex-chainstate, ou remplacez -reindex-chainstate par -reindex pour reconstruire complètement tous les index.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'option -reindex-chainstate n'est pas compatible avec -txindex. Veuillez désactiver temporairement txindex lorsque vous utilisez -reindex-chainstate, ou remplacez -reindex-chainstate par -reindex pour reconstruire entièrement tous les index.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Il est impossible d’indiquer des connexions précises et en même temps de demander à addrman de trouver les connexions sortantes.</translation>
</message>
@@ -4199,16 +4248,24 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Erreur de chargement de %s : le porte-monnaie signataire externe est chargé sans que la prise en charge de signataires externes soit compilée</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Erreur de lecture de %s! Toutes les clés ont été lues correctement, mais les données de transaction ou les métadonnées d'adresse peuvent être manquantes ou incorrectes.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Erreur : Les données du carnet d'adresses du portefeuille ne peuvent pas être identifiées comme appartenant à des portefeuilles migrés</translation>
+ <translation type="unfinished">Erreur : Les données du carnet d’adresses du porte-monnaie ne peuvent pas être identifiées comme appartenant à des porte-monnaie migrés</translation>
</message>
<message>
<source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
- <translation type="unfinished">Erreur : Descripteurs en double créés pendant la migration. Votre portefeuille est peut-être corrompu.</translation>
+ <translation type="unfinished">Erreur : Des descripteurs ont été créés en double lors de la migration. Votre porte-monnaie est peut-être corrompu.</translation>
</message>
<message>
<source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">Erreur : La transaction %s dans le portefeuille ne peut pas être identifiée comme appartenant aux portefeuilles migrés.</translation>
+ <translation type="unfinished">Erreur : La transaction %s dans le porte-monnaie ne peut pas être identifiée comme appartenant aux porte-monnaie migrés</translation>
+ </message>
+ <message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Échec du calcul des frais de majoration, car les UTXO non confirmés dépendent d'un énorme groupe de transactions non confirmées.</translation>
</message>
<message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
@@ -4244,7 +4301,7 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">La taille des entrées dépasse le poids maximum. Veuillez essayer d'envoyer un montant plus petit ou de consolider manuellement les UTXOs de votre portefeuille</translation>
+ <translation type="unfinished">La taille des entrées dépasse le poids maximum. Essayez d’envoyer un montant plus petit ou de consolider manuellement les UTXO de votre porte-monnaie</translation>
</message>
<message>
<source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
@@ -4260,16 +4317,16 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
</message>
<message>
<source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">Les UTXO non confirmés sont disponibles, mais les dépenser crée une chaîne de transactions qui sera rejetée par le mempool</translation>
+ <translation type="unfinished">Les UTXO non confirmés sont utilisables, mais les dépenser crée une chaîne de transactions qui sera rejetée par la réserve de mémoire</translation>
</message>
<message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
The wallet might have been tampered with or created with malicious intent.
</source>
- <translation type="unfinished">Une entrée héritée inattendue dans le portefeuille de descripteurs a été trouvée. Chargement du portefeuille %s
+ <translation type="unfinished">Une entrée héritée inattendue a été trouvée dans le porte-monnaie de descripteurs. Chargement du porte-monnaie %s
-Le portefeuille peut avoir été altéré ou créé avec des intentions malveillantes.
+Le porte-monnaie a peut-être avoir été altéré ou créé avec des intentions malveillantes.
</translation>
</message>
<message>
@@ -4278,25 +4335,23 @@ Le portefeuille peut avoir été altéré ou créé avec des intentions malveill
The wallet might had been created on a newer version.
Please try running the latest software version.
</source>
- <translation type="unfinished">Descripteur non reconnu trouvé. Chargement du portefeuille %s
+ <translation type="unfinished">Un descripteur non reconnu a été trouvé. Chargement du porte-monnaie %s
-Le portefeuille a peut-être été créé avec une version plus récente.
-Veuillez essayer d'utiliser la dernière version du logiciel.</translation>
- </message>
- <message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Niveau de consignation spécifique à une catégorie non pris en charge -loglevel=%s. Attendu -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Catégories valides : %s. Niveaux de consignation valides : %s.</translation>
+Le porte-monnaie a peut-être été créé avec une version plus récente.
+Essayez d’utiliser la version la plus récente du logiciel.
+</translation>
</message>
<message>
<source>
Unable to cleanup failed migration</source>
- <translation type="unfinished">Impossible de corriger l'échec de la migration</translation>
+ <translation type="unfinished">
+Impossible de corriger l'échec de la migration</translation>
</message>
<message>
<source>
Unable to restore backup of wallet.</source>
<translation type="unfinished">
-Impossible de restaurer la sauvegarde du portefeuille.</translation>
+Impossible de restaurer la sauvegarde du porte-monnaie</translation>
</message>
<message>
<source>Block verification was interrupted</source>
@@ -4339,6 +4394,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de validation de la transaction de base de données pour la suppression des transactions du porte-monnaie</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Erreur de création de %s</translation>
</message>
@@ -4387,16 +4446,12 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur de lecture de l’enregistrement suivant de la base de données du porte-monnaie</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Erreur : Impossible d'ajouter le tx watchonly au portefeuille watchonly</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de démarrage de la transaction de base de données pour la suppression des transactions du porte-monnaie</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Erreur : Impossible d'effacer les transactions de type "watchonly".</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4412,7 +4467,7 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Erreur : Echec de la création d'un nouveau porte-monnaie Watchonly</translation>
+ <translation type="unfinished">Erreur : Échec de création d’un nouveau porte-monnaie juste-regarder</translation>
</message>
<message>
<source>Error: Got key that was not hex: %s</source>
@@ -4432,27 +4487,23 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
<source>Error: No %s addresses available.</source>
- <translation type="unfinished">Erreur : Aucune adresse %s n’est disponible.</translation>
- </message>
- <message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Erreur : Toutes les transactions watchonly n'ont pas pu être supprimés.</translation>
+ <translation type="unfinished">Erreur : Aucune adresse %s n’est accessible.</translation>
</message>
<message>
<source>Error: This wallet already uses SQLite</source>
- <translation type="unfinished">Erreur : Ce portefeuille utilise déjà SQLite</translation>
+ <translation type="unfinished">Erreur : Ce porte-monnaie utilise déjà SQLite</translation>
</message>
<message>
<source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">Erreur : Ce portefeuille est déjà un portefeuille de descripteurs</translation>
+ <translation type="unfinished">Erreur : Ce porte-monnaie est déjà un porte-monnaie de descripteurs</translation>
</message>
<message>
<source>Error: Unable to begin reading all records in the database</source>
- <translation type="unfinished">Erreur : Impossible de commencer à lire tous les enregistrements de la base de données</translation>
+ <translation type="unfinished">Erreur : Impossible de commencer à lire tous les enregistrements de la base de données</translation>
</message>
<message>
<source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">Erreur : Impossible d'effectuer une sauvegarde de votre portefeuille</translation>
+ <translation type="unfinished">Erreur : Impossible d’effectuer une sauvegarde de votre porte-monnaie</translation>
</message>
<message>
<source>Error: Unable to parse version %u as a uint32_t</source>
@@ -4460,35 +4511,63 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
<source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">Erreur : Impossible de lire tous les enregistrements de la base de données</translation>
+ <translation type="unfinished">Erreur : Impossible de lire tous les enregistrements de la base de données</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible de lire l’enregistrement du meilleur bloc du porte-monnaie.</translation>
</message>
<message>
<source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Erreur : Impossible de supprimer les données du carnet d'adresses en mode veille</translation>
+ <translation type="unfinished">Erreur : Impossible de supprimer les données du carnet d’adresses juste-regarder</translation>
</message>
<message>
<source>Error: Unable to write record to new wallet</source>
<translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement dans le nouveau porte-monnaie</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc pour le porte-monnaie soluble</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc du porte-monnaie juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Erreur :Échec d’écriture du carnet d’adresses pour le porte-monnaie %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Erreur ; La transaction de la base de données ne peut pas être exécutée pour le porte-monnaie %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
- <translation type="unfinished">Échec d'écoute sur tous les ports. Si cela est voulu, utiliser -listen=0.</translation>
+ <translation type="unfinished">Échec d’écoute sur tous les ports. Si cela est voulu, utiliser -listen=0.</translation>
</message>
<message>
<source>Failed to rescan the wallet during initialization</source>
<translation type="unfinished">Échec de réanalyse du porte-monnaie lors de l’initialisation</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Échec du démarrage des index, arrêt.</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Échec de vérification de la base de données</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Échec de retrait de la transaction :%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Le taux de frais (%s) est inférieur au taux minimal de frais défini (%s)</translation>
</message>
<message>
<source>Ignoring duplicate -wallet %s.</source>
- <translation type="unfinished">Ignore -wallet %s en double.</translation>
+ <translation type="unfinished">Non prise en compte de -wallet %s en double.</translation>
</message>
<message>
<source>Importing…</source>
@@ -4588,11 +4667,11 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
<source>No addresses available</source>
- <translation type="unfinished">Aucune adresse n’est disponible</translation>
+ <translation type="unfinished">Aucune adresse n’est accessible</translation>
</message>
<message>
<source>Not enough file descriptors available.</source>
- <translation type="unfinished">Trop peu de descripteurs de fichiers sont disponibles.</translation>
+ <translation type="unfinished">Trop peu de descripteurs de fichiers sont proposés.</translation>
</message>
<message>
<source>Not found pre-selected input %s</source>
@@ -4600,7 +4679,7 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
<source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">Entrée présélectionnée non solvable %s</translation>
+ <translation type="unfinished">Entrée présélectionnée non soluble %s</translation>
</message>
<message>
<source>Prune cannot be configured with a negative value.</source>
@@ -4703,6 +4782,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Il s’agit des frais minimaux que vous payerez si vous envoyez une transaction.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transaction %s n’appartient pas à ce porte-monnaie</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Le montant de la transaction est trop bas</translation>
</message>
@@ -4715,10 +4798,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">L’index des sorties de monnaie des transactions est hors échelle</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La chaîne de la réserve de mémoire de la transaction est trop longue</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transaction doit comporter au moins un destinataire</translation>
</message>
@@ -4795,14 +4874,30 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Les nouvelles règles inconnues sont activées (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Niveau de consignation global non pris en charge -loglevel=%s. Valeurs valides : %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Niveau de journalisation global non pris en charge %s=%s. Valeurs valides : %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Échec de création du fichier du porte-monnaie : %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates n'est pas pris en charge sur la chaîne %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">La catégorie de journalisation %s=%s n’est pas prise en charge</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Erreur : Impossible d’ajouter la transaction juste-regarder %s au portefeuille juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Erreur : Impossible d’effacer les transactions juste-regarder.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Le commentaire de l’agent utilisateur (%s) comporte des caractères dangereux</translation>
</message>
@@ -4816,7 +4911,7 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
</message>
<message>
<source>Wallet needed to be rewritten: restart %s to complete</source>
- <translation type="unfinished">Le porte-monnaie devait être réécrit : redémarrer %s pour terminer l’opération.</translation>
+ <translation type="unfinished">Le portefeuille doit être réécrit : redémarrer %s pour terminer</translation>
</message>
<message>
<source>Settings file could not be read</source>
diff --git a/src/qt/locale/bitcoin_fr_CM.ts b/src/qt/locale/bitcoin_fr_CM.ts
index 0d05fe25ed..50d27a4f85 100644
--- a/src/qt/locale/bitcoin_fr_CM.ts
+++ b/src/qt/locale/bitcoin_fr_CM.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">C&amp;hoisir</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Adresses d’envoi</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adresses de réception</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ce sont vos adresses Bitcoin pour envoyer des paiements. Vérifiez toujours le montant et l’adresse du destinataire avant d’envoyer des pièces.</translation>
</message>
@@ -102,6 +94,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Une erreur est survenue lors de l'enregistrement de la liste d'adresses vers %1. Veuillez réessayer plus tard.</translation>
</message>
<message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Adresses de réceptions - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Échec d’exportation</translation>
</message>
@@ -303,6 +299,18 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">inconnue</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Intégré « %1 »</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Police système par défaut « %1 »</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Persnnalisé…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Montant</translation>
</message>
@@ -713,8 +721,16 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Fermer tous les porte-monnaie</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrer le portefeuille</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrer un portefeuilles </translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Afficher le message d’aide de %1 pour obtenir la liste des options possibles de ligne de commande Bitcoin</translation>
+ <translation type="unfinished">Afficher le message d’aide de %1 pour obtenir la liste des options possibles en ligne de commande Bitcoin</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -809,6 +825,14 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">En-têtes de pré-synchronisation (%1%)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Erreur lors de la création du portefeuille</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Impossible de créer un nouveau portefeuilles, le logiciel a été compilé sans support pour sqlite (nécessaire pour le portefeuille décris) </translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Erreur : %1</translation>
</message>
@@ -915,10 +939,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Frais :</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Poussière :</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Après les frais :</translation>
</message>
@@ -999,10 +1019,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Copier les octets</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copier la poussière</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copier la monnaie</translation>
</message>
@@ -1011,18 +1027,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">(%1 verrouillée)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">oui</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">non</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Cette étiquette devient rouge si un destinataire reçoit un montant inférieur au seuil actuel de poussière.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Peut varier +/- %1 satoshi(s) par entrée.</translation>
</message>
@@ -1082,6 +1086,53 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrer le portefeuille</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">La migration du porte-monnaie convertira ce porte-monnaie en un ou plusieurs porte-monnaie de descripteurs. Une nouvelle sauvegarde du porte-monnaie devra être effectuée.
+Si ce porte-monnaie contient des scripts en lecture seule, un nouveau porte-monnaie sera créé contenant ces scripts en lecture seule.
+Si ce porte-monnaie contient des scripts solvables mais non surveillés, un autre nouveau porte-monnaie sera créé contenant ces scripts.
+
+Le processus de migration créera une sauvegarde du porte-monnaie avant la migration. Ce fichier de sauvegarde sera nommé &lt;nom du porte-monnaie&gt;-&lt;horodatage&gt;.legacy.bak et pourra être trouvé dans le répertoire de ce porte-monnaie. En cas de migration incorrecte, la sauvegarde peut être restaurée avec la fonctionnalité "Restaurer le porte-monnaie".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrer le portefeuille</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migration du portefeuille &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Le porte-monnaie '%1' a été migré avec succès.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts juste-regarder ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts solubles, mais non surveillés ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">La migration a échoué</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migration réussie</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1164,6 +1215,14 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Créer un porte-monnaie</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Vous n'êtes qu'à un pas de la création de votre nouveau portefeuille !</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Veuillez fournir un nom et, si désiré, activer toutes les options avancées.</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Nom du porte-monnaie</translation>
</message>
@@ -1200,14 +1259,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Créer un porte-monnaie vide</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Utiliser des descripteurs pour la gestion des scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Porte-monnaie de descripteurs</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Utiliser un appareil externe de signature tel qu’un porte-monnaie matériel. Configurer d’abord le script signataire externe dans les préférences du porte-monnaie.</translation>
</message>
@@ -1220,10 +1271,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Créer</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilé sans prise en charge de sqlite (requis pour les porte-monnaie de descripteurs)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Compilé sans prise en charge des signatures externes (requis pour la signature externe)</translation>
@@ -1312,8 +1359,8 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n Go d’espace libre</numerusform>
+ <numerusform>%n Go d’espace libre</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1396,7 +1443,7 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
<message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
- <translation type="unfinished">Quand vous cliquerez sur Valider, %1 commencera à télécharger et à traiter l’intégralité de la chaîne de blocs %4 (%2 Go) en débutant avec les transactions les plus anciennes de %3, quand %4 a été lancé initialement.</translation>
+ <translation type="unfinished">Quand vous cliquerez sur Valider, %1 commencera à télécharger et à traiter l’intégralité de la chaîne de blocs %4 (%2 Go) en débutant avec les transactions les plus anciennes de %3, quand %4 a été lancé initialement.</translation>
</message>
<message>
<source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
@@ -1555,6 +1602,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Quand la fenêtre est fermée, la réduire au lieu de quitter l’application. Si cette option est activée, l’application ne sera fermée qu’en sélectionnant Quitter dans le menu.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Police de l’onglet Vue d’ensemble :</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Les options définies dans cette boîte de dialogue sont remplacées par la ligne de commande :</translation>
</message>
@@ -1775,18 +1826,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Utiliser un mandataire SOCKS&amp;5 séparé pour atteindre les pairs par les services oignon de Tor :</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Police à espacement constant dans l’onglet Vue d’ensemble :</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">intégré « %1 »</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">correspondance la plus proche « %1 »</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Valider</translation>
</message>
@@ -2028,8 +2067,12 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">La TBSP a été enregistrée sur le disque.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Envoie %1 à %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished"> Envoie %1 à %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">votre adresse</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2287,6 +2330,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Sélectionnez un pair pour afficher des renseignements détaillés.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">La version de la couche de transport : %1</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">La chaîne d'ID de session BIP324 en hexadécimal, le cas échéant.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">ID de session</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Si nous relayons des transactions à ce pair.</translation>
</message>
@@ -2500,6 +2555,21 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Récupération d’adresse sortante : de courte durée, pour solliciter des adresses</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">détection : paires pourrait être v1 ou v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocole de transport non chiffré en texte clair</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: Protocole de transport chiffré BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">nous avons sélectionné le pair comme relais à large bande passante</translation>
</message>
@@ -2554,6 +2624,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Fenêtre des nœuds – [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Exécution de la commande en utilisant le porte-monnaie « %1 »</translation>
</message>
@@ -2899,10 +2973,6 @@ Pour plus de précisions sur cette console, tapez %6.
<translation type="unfinished">Effacer tous les champs du formulaire.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Poussière :</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Choisir…</translation>
</message>
@@ -2979,10 +3049,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Copier les octets</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copier la poussière</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copier la monnaie</translation>
</message>
@@ -3013,10 +3079,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Crée une transaction Bitcoin signée partiellement (TBSP) à utiliser, par exemple, avec un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">du porte-monnaie '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 à '%2'</translation>
</message>
@@ -3074,6 +3136,10 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez réviser votre proposition de transaction. Une transaction Bitcoin partiellement signée (TBSP) sera produite, que vous pourrez enregistrer ou copier puis signer avec, par exemple, un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 du porte-monnaie « %2 ».</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Voulez-vous créer cette transaction ?</translation>
@@ -3513,8 +3579,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Index des sorties</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Le certificat n’a pas été vérifié)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (ce certificat n’a pas été vérifié)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3603,10 +3669,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Envoyée à</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Paiement à vous-même</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Miné </translation>
</message>
@@ -3682,10 +3744,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Envoyée à</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">À vous-même</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Miné </translation>
</message>
@@ -3963,6 +4021,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">%s est corrompu. Essayez l’outil bitcoin-wallet pour le sauver ou restaurez une sauvegarde.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s a échoué à valider l'état instantané -assumeutxo. Cela indique un problème matériel, ou un bug dans le logiciel, ou une mauvaise modification du logiciel qui a permis de charger un instantané invalide. En conséquence, le nœud s'arrêtera et cessera d'utiliser tout état qui a été construit sur l'instantané, réinitialisant la hauteur de la chaîne de %d à %d. Au prochain redémarrage, le nœud reprendra la synchronisation à partir de %d sans utiliser de données d'instantané. Veuillez signaler cet incident à %s, en précisant comment vous avez obtenu l'instantané. L'état de chaîne d'instantané invalide sera conservé sur le disque au cas où il serait utile pour diagnostiquer le problème qui a causé cette erreur.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s demande d'écouter sur le port %u. Ce port est considéré comme "mauvais" et il est donc peu probable qu'un pair s'y connecte. Voir doc/p2p-bad-ports.md pour plus de détails et une liste complète.</translation>
</message>
@@ -3991,10 +4053,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Erreur de chargement du portefeuille. Le portefeuille nécessite le téléchargement de blocs, et le logiciel ne prend pas actuellement en charge le chargement de portefeuilles lorsque les blocs sont téléchargés dans le désordre lors de l'utilisation de snapshots assumeutxo. Le portefeuille devrait pouvoir être chargé avec succès une fois que la synchronisation des nœuds aura atteint la hauteur %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Erreur de lecture de %s. Toutes les clés ont été lues correctement, mais les données de la transaction ou les entrées du carnet d’adresses sont peut-être manquantes ou incorrectes.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Erreur de lecture de %s : soit les données de la transaction manquent soit elles sont incorrectes. Réanalyse du porte-monnaie.</translation>
</message>
@@ -4063,6 +4121,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Élagage : la dernière synchronisation de porte-monnaie va par-delà les données élaguées. Vous devez -reindex (réindexer, télécharger de nouveau toute la chaîne de blocs en cas de nœud élagué)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">La modification de '%s' -&gt; '%s' a échoué. Vous devriez résoudre cela en déplaçant ou en supprimant manuellement le répertoire de snapshot invalide %s, sinon vous rencontrerez la même erreur à nouveau au prochain démarrage.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase : la version %d du schéma de porte-monnaie sqlite est inconnue. Seule la version %d est prise en charge</translation>
</message>
@@ -4071,10 +4133,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">La base de données des blocs comprend un bloc qui semble provenir du futur. Cela pourrait être causé par la date et l’heure erronées de votre ordinateur. Ne reconstruisez la base de données des blocs que si vous êtes certain que la date et l’heure de votre ordinateur sont justes.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">La base de données d’indexation des blocs comprend un « txindex » hérité. Pour libérer l’espace disque occupé, exécutez un -reindex complet ou ignorez cette erreur. Ce message d’erreur ne sera pas affiché de nouveau.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Le montant de la transaction est trop bas pour être envoyé une fois que les frais ont été déduits</translation>
</message>
@@ -4111,6 +4169,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Le format de fichier porte-monnaie « %s » indiqué est inconnu. Veuillez soit indiquer « bdb » soit « sqlite ».</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Niveau de journalisation spécifique à la catégorie non pris en charge %1$s=%2$s. Attendu %1$s=&lt;catégorie&gt;:&lt;niveaudejournal&gt;. Catégories valides : %3$s. Niveaux de journalisation valides : %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Le format de la base de données chainstate n'est pas supporté. Veuillez redémarrer avec -reindex-chainstate. Cela reconstruira la base de données chainstate.</translation>
</message>
@@ -4119,6 +4181,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Portefeuille créé avec succès. Le type de portefeuille ancien est en cours de suppression et la prise en charge de la création et de l'ouverture des portefeuilles anciens sera supprimée à l'avenir.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Portefeuille chargé avec succès. Le type de portefeuille existant est obsolète et la prise en charge de la création et de l'ouverture de portefeuilles existants sera supprimée à l'avenir. Les anciens portefeuilles peuvent être migrés vers un portefeuille descripteur avec migratewallet.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Avertissement : Le format du fichier de vidage de porte-monnaie « %s » ne correspond pas au format « %s » indiqué dans la ligne de commande.</translation>
</message>
@@ -4167,30 +4233,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Impossible d’écrire dans le répertoire de données « %s » ; veuillez vérifier les droits.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">La mise à niveau -txindex lancée par une version précédente ne peut pas être achevée. Redémarrez la version précédente ou exécutez un -reindex complet.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%sn'a pas réussi à valider l'état de l'instantané -assumeutxo. Cela indique un problème matériel, un bug dans le logiciel ou une mauvaise modification du logiciel qui a permis le chargement d'une snapshot invalide. En conséquence, le nœud s'arrêtera et cessera d'utiliser tout état construit sur la snapshot, ce qui réinitialisera la taille de la chaîne de %d à %d. Au prochain redémarrage, le nœud reprendra la synchronisation à partir de %d sans utiliser les données de la snapshot. Veuillez signaler cet incident à %s, en indiquant comment vous avez obtenu la snapshot. L'état de chaîne de la snapshot non valide a été laissé sur le disque au cas où il serait utile pour diagnostiquer le problème à l'origine de cette erreur.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s est très élevé ! Des frais aussi importants pourraient être payés sur une seule transaction.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'option -reindex-chainstate n'est pas compatible avec -blockfilterindex. Veuillez désactiver temporairement blockfilterindex lorsque vous utilisez -reindex-chainstate, ou remplacez -reindex-chainstate par -reindex pour reconstruire complètement tous les index.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'option -reindex-chainstate n'est pas compatible avec -coinstatsindex. Veuillez désactiver temporairement coinstatsindex lorsque vous utilisez -reindex-chainstate, ou remplacez -reindex-chainstate par -reindex pour reconstruire complètement tous les index.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'option -reindex-chainstate n'est pas compatible avec -txindex. Veuillez désactiver temporairement txindex lorsque vous utilisez -reindex-chainstate, ou remplacez -reindex-chainstate par -reindex pour reconstruire entièrement tous les index.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Il est impossible d’indiquer des connexions précises et en même temps de demander à addrman de trouver les connexions sortantes.</translation>
</message>
@@ -4199,6 +4245,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Erreur de chargement de %s : le porte-monnaie signataire externe est chargé sans que la prise en charge de signataires externes soit compilée</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Erreur de lecture de %s! Toutes les clés ont été lues correctement, mais les données de transaction ou les métadonnées d'adresse peuvent être manquantes ou incorrectes.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Erreur : Les données du carnet d'adresses du portefeuille ne peuvent pas être identifiées comme appartenant à des portefeuilles migrés</translation>
</message>
@@ -4211,6 +4261,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Erreur : La transaction %s dans le portefeuille ne peut pas être identifiée comme appartenant aux portefeuilles migrés.</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Échec du calcul des frais de majoration, car les UTXO non confirmés dépendent d'un énorme groupe de transactions non confirmées.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Échec de renommage du fichier peers.dat invalide. Veuillez le déplacer ou le supprimer, puis réessayer.</translation>
</message>
@@ -4284,10 +4338,6 @@ Le portefeuille a peut-être été créé avec une version plus récente.
Veuillez essayer d'utiliser la dernière version du logiciel.</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Niveau de consignation spécifique à une catégorie non pris en charge -loglevel=%s. Attendu -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Catégories valides : %s. Niveaux de consignation valides : %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">Impossible de corriger l'échec de la migration</translation>
@@ -4339,6 +4389,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de validation des transactions de la base de données pour la suppression des transactions du porte-monnaie</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Erreur de création de %s</translation>
</message>
@@ -4387,16 +4441,12 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur de lecture de l’enregistrement suivant de la base de données du porte-monnaie</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Erreur : Impossible d'ajouter le tx watchonly au portefeuille watchonly</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de démarrage des transactions de la base de données pour la suppression des transactions du porte-monnaie</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Erreur : Impossible d'effacer les transactions de type "watchonly".</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4435,10 +4485,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Aucune adresse %s n’est disponible.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Erreur : Toutes les transactions watchonly n'ont pas pu être supprimés.</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Erreur : Ce portefeuille utilise déjà SQLite</translation>
</message>
@@ -4463,6 +4509,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Impossible de lire tous les enregistrements de la base de données</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible de lire l’enregistrement du meilleur bloc du porte-monnaie.</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Erreur : Impossible de supprimer les données du carnet d'adresses en mode veille</translation>
</message>
@@ -4471,6 +4521,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement dans le nouveau porte-monnaie</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc soluble du porte-monnaie</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc du porte-monnaie juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Erreur :Échec d’écriture du carnet d’adresses pour le porte-monnaie %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Erreur ; La transaction de la base de données ne peut pas être exécutée pour le porte-monnaie %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Échec d'écoute sur tous les ports. Si cela est voulu, utiliser -listen=0.</translation>
</message>
@@ -4479,10 +4545,18 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Échec de réanalyse du porte-monnaie lors de l’initialisation</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Échec du démarrage des index, arrêt.</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Échec de vérification de la base de données</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Échec de suppression de la transaction :%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Le taux de frais (%s) est inférieur au taux minimal de frais défini (%s)</translation>
</message>
@@ -4703,6 +4777,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Il s’agit des frais minimaux que vous payerez si vous envoyez une transaction.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transaction %s n’appartient pas à ce porte-monnaie</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Le montant de la transaction est trop bas</translation>
</message>
@@ -4715,10 +4793,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">L’index des sorties de monnaie des transactions est hors échelle</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La chaîne de la réserve de mémoire de la transaction est trop longue</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transaction doit comporter au moins un destinataire</translation>
</message>
@@ -4795,14 +4869,30 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Les nouvelles règles inconnues sont activées (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Niveau de consignation global non pris en charge -loglevel=%s. Valeurs valides : %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Niveau de journalisation global non pris en charge %s=%s. Valeurs valides : %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Échec de création du fichier du porte-monnaie : %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates n'est pas pris en charge sur la chaîne %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">La catégorie de journalisation %s=%s n’est pas prise en charge</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Erreur : Impossible d’ajouter la transaction juste-regarder %s au portefeuille juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Erreur : Impossible d’effacer les transactions juste-regarder.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Le commentaire de l’agent utilisateur (%s) comporte des caractères dangereux</translation>
</message>
diff --git a/src/qt/locale/bitcoin_fr_LU.ts b/src/qt/locale/bitcoin_fr_LU.ts
index c83e810e95..1c0fd095c4 100644
--- a/src/qt/locale/bitcoin_fr_LU.ts
+++ b/src/qt/locale/bitcoin_fr_LU.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">C&amp;hoisir</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Adresses d’envoi</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adresses de réception</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ce sont vos adresses Bitcoin pour envoyer des paiements. Vérifiez toujours le montant et l’adresse du destinataire avant d’envoyer des pièces.</translation>
</message>
@@ -102,6 +94,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Une erreur est survenue lors de l'enregistrement de la liste d'adresses vers %1. Veuillez réessayer plus tard.</translation>
</message>
<message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Adresses de réceptions - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Échec d’exportation</translation>
</message>
@@ -303,6 +299,18 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">inconnue</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Intégré « %1 »</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Police système par défaut « %1 »</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Persnnalisé…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Montant</translation>
</message>
@@ -713,8 +721,16 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Fermer tous les porte-monnaie</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrer le portefeuille</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrer un portefeuilles </translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Afficher le message d’aide de %1 pour obtenir la liste des options possibles de ligne de commande Bitcoin</translation>
+ <translation type="unfinished">Afficher le message d’aide de %1 pour obtenir la liste des options possibles en ligne de commande Bitcoin</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -809,6 +825,14 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">En-têtes de pré-synchronisation (%1%)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Erreur lors de la création du portefeuille</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Impossible de créer un nouveau portefeuilles, le logiciel a été compilé sans support pour sqlite (nécessaire pour le portefeuille décris) </translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Erreur : %1</translation>
</message>
@@ -915,10 +939,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Frais :</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Poussière :</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Après les frais :</translation>
</message>
@@ -999,10 +1019,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Copier les octets</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copier la poussière</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copier la monnaie</translation>
</message>
@@ -1011,18 +1027,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">(%1 verrouillée)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">oui</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">non</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Cette étiquette devient rouge si un destinataire reçoit un montant inférieur au seuil actuel de poussière.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Peut varier +/- %1 satoshi(s) par entrée.</translation>
</message>
@@ -1082,6 +1086,53 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrer le portefeuille</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">La migration du porte-monnaie convertira ce porte-monnaie en un ou plusieurs porte-monnaie de descripteurs. Une nouvelle sauvegarde du porte-monnaie devra être effectuée.
+Si ce porte-monnaie contient des scripts en lecture seule, un nouveau porte-monnaie sera créé contenant ces scripts en lecture seule.
+Si ce porte-monnaie contient des scripts solvables mais non surveillés, un autre nouveau porte-monnaie sera créé contenant ces scripts.
+
+Le processus de migration créera une sauvegarde du porte-monnaie avant la migration. Ce fichier de sauvegarde sera nommé &lt;nom du porte-monnaie&gt;-&lt;horodatage&gt;.legacy.bak et pourra être trouvé dans le répertoire de ce porte-monnaie. En cas de migration incorrecte, la sauvegarde peut être restaurée avec la fonctionnalité "Restaurer le porte-monnaie".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrer le portefeuille</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migration du portefeuille &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Le porte-monnaie '%1' a été migré avec succès.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts juste-regarder ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Les scripts solubles, mais non surveillés ont été migrés vers un nouveau porte-monnaie nommé « %1 ».</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">La migration a échoué</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migration réussie</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1164,6 +1215,14 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Créer un porte-monnaie</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Vous n'êtes qu'à un pas de la création de votre nouveau portefeuille !</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Veuillez fournir un nom et, si désiré, activer toutes les options avancées.</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Nom du porte-monnaie</translation>
</message>
@@ -1200,14 +1259,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Créer un porte-monnaie vide</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Utiliser des descripteurs pour la gestion des scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Porte-monnaie de descripteurs</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Utiliser un appareil externe de signature tel qu’un porte-monnaie matériel. Configurer d’abord le script signataire externe dans les préférences du porte-monnaie.</translation>
</message>
@@ -1220,10 +1271,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Créer</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilé sans prise en charge de sqlite (requis pour les porte-monnaie de descripteurs)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Compilé sans prise en charge des signatures externes (requis pour la signature externe)</translation>
@@ -1312,8 +1359,8 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n Go d’espace libre</numerusform>
+ <numerusform>%n Go d’espace libre</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1555,6 +1602,10 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Quand la fenêtre est fermée, la réduire au lieu de quitter l’application. Si cette option est activée, l’application ne sera fermée qu’en sélectionnant Quitter dans le menu.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Police de l’onglet Vue d’ensemble :</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Les options définies dans cette boîte de dialogue sont remplacées par la ligne de commande :</translation>
</message>
@@ -1775,18 +1826,6 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">Utiliser un mandataire SOCKS&amp;5 séparé pour atteindre les pairs par les services oignon de Tor :</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Police à espacement constant dans l’onglet Vue d’ensemble :</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">intégré « %1 »</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">correspondance la plus proche « %1 »</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Valider</translation>
</message>
@@ -2028,8 +2067,12 @@ La signature n'est possible qu'avec les adresses de type "patrimoine".</translat
<translation type="unfinished">La TBSP a été enregistrée sur le disque.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Envoie %1 à %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished"> Envoie %1 à %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">votre adresse</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2287,6 +2330,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Sélectionnez un pair pour afficher des renseignements détaillés.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">La version de la couche de transport : %1</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">La chaîne d'ID de session BIP324 en hexadécimal, le cas échéant.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">ID de session</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Si nous relayons des transactions à ce pair.</translation>
</message>
@@ -2500,6 +2555,21 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Récupération d’adresse sortante : de courte durée, pour solliciter des adresses</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">détection : paires pourrait être v1 ou v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocole de transport non chiffré en texte clair</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: Protocole de transport chiffré BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">nous avons sélectionné le pair comme relais à large bande passante</translation>
</message>
@@ -2554,6 +2624,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Exécution de la commande sans aucun porte-monnaie</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Fenêtre des nœuds – [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Exécution de la commande en utilisant le porte-monnaie « %1 »</translation>
</message>
@@ -2899,10 +2973,6 @@ Pour plus de précisions sur cette console, tapez %6.
<translation type="unfinished">Effacer tous les champs du formulaire.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Poussière :</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Choisir…</translation>
</message>
@@ -2979,10 +3049,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Copier les octets</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copier la poussière</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copier la monnaie</translation>
</message>
@@ -3013,10 +3079,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Crée une transaction Bitcoin signée partiellement (TBSP) à utiliser, par exemple, avec un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">du porte-monnaie '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 à '%2'</translation>
</message>
@@ -3074,6 +3136,10 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Veuillez réviser votre proposition de transaction. Une transaction Bitcoin partiellement signée (TBSP) sera produite, que vous pourrez enregistrer ou copier puis signer avec, par exemple, un porte-monnaie %1 hors ligne ou avec un porte-monnaie matériel compatible TBSP.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 du porte-monnaie « %2 ».</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Voulez-vous créer cette transaction ?</translation>
@@ -3513,8 +3579,8 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Index des sorties</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Le certificat n’a pas été vérifié)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (ce certificat n’a pas été vérifié)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3603,10 +3669,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Envoyée à</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Paiement à vous-même</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Miné </translation>
</message>
@@ -3682,10 +3744,6 @@ Note : Les frais étant calculés par octet, un taux de frais de « 100 satoshi
<translation type="unfinished">Envoyée à</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">À vous-même</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Miné </translation>
</message>
@@ -3963,6 +4021,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">%s est corrompu. Essayez l’outil bitcoin-wallet pour le sauver ou restaurez une sauvegarde.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s a échoué à valider l'état instantané -assumeutxo. Cela indique un problème matériel, ou un bug dans le logiciel, ou une mauvaise modification du logiciel qui a permis de charger un instantané invalide. En conséquence, le nœud s'arrêtera et cessera d'utiliser tout état qui a été construit sur l'instantané, réinitialisant la hauteur de la chaîne de %d à %d. Au prochain redémarrage, le nœud reprendra la synchronisation à partir de %d sans utiliser de données d'instantané. Veuillez signaler cet incident à %s, en précisant comment vous avez obtenu l'instantané. L'état de chaîne d'instantané invalide sera conservé sur le disque au cas où il serait utile pour diagnostiquer le problème qui a causé cette erreur.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s demande d'écouter sur le port %u. Ce port est considéré comme "mauvais" et il est donc peu probable qu'un pair s'y connecte. Voir doc/p2p-bad-ports.md pour plus de détails et une liste complète.</translation>
</message>
@@ -3991,10 +4053,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Erreur de chargement du portefeuille. Le portefeuille nécessite le téléchargement de blocs, et le logiciel ne prend pas actuellement en charge le chargement de portefeuilles lorsque les blocs sont téléchargés dans le désordre lors de l'utilisation de snapshots assumeutxo. Le portefeuille devrait pouvoir être chargé avec succès une fois que la synchronisation des nœuds aura atteint la hauteur %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Erreur de lecture de %s. Toutes les clés ont été lues correctement, mais les données de la transaction ou les entrées du carnet d’adresses sont peut-être manquantes ou incorrectes.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Erreur de lecture de %s : soit les données de la transaction manquent soit elles sont incorrectes. Réanalyse du porte-monnaie.</translation>
</message>
@@ -4063,6 +4121,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Élagage : la dernière synchronisation de porte-monnaie va par-delà les données élaguées. Vous devez -reindex (réindexer, télécharger de nouveau toute la chaîne de blocs en cas de nœud élagué)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">La modification de '%s' -&gt; '%s' a échoué. Vous devriez résoudre cela en déplaçant ou en supprimant manuellement le répertoire de snapshot invalide %s, sinon vous rencontrerez la même erreur à nouveau au prochain démarrage.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase : la version %d du schéma de porte-monnaie sqlite est inconnue. Seule la version %d est prise en charge</translation>
</message>
@@ -4071,10 +4133,6 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">La base de données des blocs comprend un bloc qui semble provenir du futur. Cela pourrait être causé par la date et l’heure erronées de votre ordinateur. Ne reconstruisez la base de données des blocs que si vous êtes certain que la date et l’heure de votre ordinateur sont justes.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">La base de données d’indexation des blocs comprend un « txindex » hérité. Pour libérer l’espace disque occupé, exécutez un -reindex complet ou ignorez cette erreur. Ce message d’erreur ne sera pas affiché de nouveau.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Le montant de la transaction est trop bas pour être envoyé une fois que les frais ont été déduits</translation>
</message>
@@ -4111,6 +4169,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Le format de fichier porte-monnaie « %s » indiqué est inconnu. Veuillez soit indiquer « bdb » soit « sqlite ».</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Niveau de journalisation spécifique à la catégorie non pris en charge %1$s=%2$s. Attendu %1$s=&lt;catégorie&gt;:&lt;niveaudejournal&gt;. Catégories valides : %3$s. Niveaux de journalisation valides : %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Le format de la base de données chainstate n'est pas supporté. Veuillez redémarrer avec -reindex-chainstate. Cela reconstruira la base de données chainstate.</translation>
</message>
@@ -4119,6 +4181,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Portefeuille créé avec succès. Le type de portefeuille ancien est en cours de suppression et la prise en charge de la création et de l'ouverture des portefeuilles anciens sera supprimée à l'avenir.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Portefeuille chargé avec succès. Le type de portefeuille existant est obsolète et la prise en charge de la création et de l'ouverture de portefeuilles existants sera supprimée à l'avenir. Les anciens portefeuilles peuvent être migrés vers un portefeuille descripteur avec migratewallet.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Avertissement : Le format du fichier de vidage de porte-monnaie « %s » ne correspond pas au format « %s » indiqué dans la ligne de commande.</translation>
</message>
@@ -4167,30 +4233,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Impossible d’écrire dans le répertoire de données « %s » ; veuillez vérifier les droits.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">La mise à niveau -txindex lancée par une version précédente ne peut pas être achevée. Redémarrez la version précédente ou exécutez un -reindex complet.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%sn'a pas réussi à valider l'état de l'instantané -assumeutxo. Cela indique un problème matériel, un bug dans le logiciel ou une mauvaise modification du logiciel qui a permis le chargement d'une snapshot invalide. En conséquence, le nœud s'arrêtera et cessera d'utiliser tout état construit sur la snapshot, ce qui réinitialisera la taille de la chaîne de %d à %d. Au prochain redémarrage, le nœud reprendra la synchronisation à partir de %d sans utiliser les données de la snapshot. Veuillez signaler cet incident à %s, en indiquant comment vous avez obtenu la snapshot. L'état de chaîne de la snapshot non valide a été laissé sur le disque au cas où il serait utile pour diagnostiquer le problème à l'origine de cette erreur.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s est très élevé ! Des frais aussi importants pourraient être payés sur une seule transaction.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'option -reindex-chainstate n'est pas compatible avec -blockfilterindex. Veuillez désactiver temporairement blockfilterindex lorsque vous utilisez -reindex-chainstate, ou remplacez -reindex-chainstate par -reindex pour reconstruire complètement tous les index.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'option -reindex-chainstate n'est pas compatible avec -coinstatsindex. Veuillez désactiver temporairement coinstatsindex lorsque vous utilisez -reindex-chainstate, ou remplacez -reindex-chainstate par -reindex pour reconstruire complètement tous les index.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'option -reindex-chainstate n'est pas compatible avec -txindex. Veuillez désactiver temporairement txindex lorsque vous utilisez -reindex-chainstate, ou remplacez -reindex-chainstate par -reindex pour reconstruire entièrement tous les index.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Il est impossible d’indiquer des connexions précises et en même temps de demander à addrman de trouver les connexions sortantes.</translation>
</message>
@@ -4199,6 +4245,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Erreur de chargement de %s : le porte-monnaie signataire externe est chargé sans que la prise en charge de signataires externes soit compilée</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Erreur de lecture de %s! Toutes les clés ont été lues correctement, mais les données de transaction ou les métadonnées d'adresse peuvent être manquantes ou incorrectes.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Erreur : Les données du carnet d'adresses du portefeuille ne peuvent pas être identifiées comme appartenant à des portefeuilles migrés</translation>
</message>
@@ -4211,6 +4261,10 @@ Accédez à Fichier &gt; Ouvrir un porte-monnaie pour en charger un.
<translation type="unfinished">Erreur : La transaction %s dans le portefeuille ne peut pas être identifiée comme appartenant aux portefeuilles migrés.</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Échec du calcul des frais de majoration, car les UTXO non confirmés dépendent d'un énorme groupe de transactions non confirmées.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Échec de renommage du fichier peers.dat invalide. Veuillez le déplacer ou le supprimer, puis réessayer.</translation>
</message>
@@ -4284,10 +4338,6 @@ Le portefeuille a peut-être été créé avec une version plus récente.
Veuillez essayer d'utiliser la dernière version du logiciel.</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Niveau de consignation spécifique à une catégorie non pris en charge -loglevel=%s. Attendu -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Catégories valides : %s. Niveaux de consignation valides : %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">Impossible de corriger l'échec de la migration</translation>
@@ -4339,6 +4389,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Le fichier de vidage %s n’existe pas.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de validation des transactions de la base de données pour la suppression des transactions du porte-monnaie</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Erreur de création de %s</translation>
</message>
@@ -4387,16 +4441,12 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur de lecture de l’enregistrement suivant de la base de données du porte-monnaie</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Erreur : Impossible d'ajouter le tx watchonly au portefeuille watchonly</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erreur de démarrage des transactions de la base de données pour la suppression des transactions du porte-monnaie</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Erreur : Impossible d'effacer les transactions de type "watchonly".</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Erreur : Impossible d'extraire la destination du scriptpubkey généré</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4435,10 +4485,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Aucune adresse %s n’est disponible.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Erreur : Toutes les transactions watchonly n'ont pas pu être supprimés.</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Erreur : Ce portefeuille utilise déjà SQLite</translation>
</message>
@@ -4463,6 +4509,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Impossible de lire tous les enregistrements de la base de données</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible de lire l’enregistrement du meilleur bloc du porte-monnaie.</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Erreur : Impossible de supprimer les données du carnet d'adresses en mode veille</translation>
</message>
@@ -4471,6 +4521,22 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement dans le nouveau porte-monnaie</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc soluble du porte-monnaie</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Erreur : Impossible d’écrire l’enregistrement du localisateur du meilleur bloc du porte-monnaie juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Erreur :Échec d’écriture du carnet d’adresses pour le porte-monnaie %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Erreur ; La transaction de la base de données ne peut pas être exécutée pour le porte-monnaie %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Échec d'écoute sur tous les ports. Si cela est voulu, utiliser -listen=0.</translation>
</message>
@@ -4479,10 +4545,18 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Échec de réanalyse du porte-monnaie lors de l’initialisation</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Échec du démarrage des index, arrêt.</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Échec de vérification de la base de données</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Échec de suppression de la transaction :%s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Le taux de frais (%s) est inférieur au taux minimal de frais défini (%s)</translation>
</message>
@@ -4703,6 +4777,10 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Il s’agit des frais minimaux que vous payerez si vous envoyez une transaction.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transaction %s n’appartient pas à ce porte-monnaie</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Le montant de la transaction est trop bas</translation>
</message>
@@ -4715,10 +4793,6 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">L’index des sorties de monnaie des transactions est hors échelle</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La chaîne de la réserve de mémoire de la transaction est trop longue</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transaction doit comporter au moins un destinataire</translation>
</message>
@@ -4795,14 +4869,30 @@ Impossible de restaurer la sauvegarde du portefeuille.</translation>
<translation type="unfinished">Les nouvelles règles inconnues sont activées (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Niveau de consignation global non pris en charge -loglevel=%s. Valeurs valides : %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Niveau de journalisation global non pris en charge %s=%s. Valeurs valides : %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Échec de création du fichier du porte-monnaie : %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates n'est pas pris en charge sur la chaîne %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">La catégorie de journalisation %s=%s n’est pas prise en charge</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Erreur : Impossible d’ajouter la transaction juste-regarder %s au portefeuille juste-regarder</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Erreur : Impossible d’effacer les transactions juste-regarder.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Le commentaire de l’agent utilisateur (%s) comporte des caractères dangereux</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ga.ts b/src/qt/locale/bitcoin_ga.ts
index 580ba278bb..901748a146 100644
--- a/src/qt/locale/bitcoin_ga.ts
+++ b/src/qt/locale/bitcoin_ga.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Roghnaigh</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Seoltaí seoladh</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Seoltaí glacadh</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Seo iad do sheoltaí Bitcoin chun íocaíochtaí a sheoladh. Seiceáil i gcónaí an méid agus an seoladh glactha sula seoltar boinn.</translation>
</message>
@@ -702,10 +694,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Táille:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Dusta:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Iar-tháille:</translation>
</message>
@@ -770,10 +758,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáíl bearta</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Cóipeáíl dusta</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Cóipeáíl sóinseáil</translation>
</message>
@@ -782,18 +766,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">(%1 glasáilte)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">tá</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">níl</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Casann an lipéad seo dearg má fhaigheann aon fhaighteoir méid níos lú ná an tairseach reatha dusta.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Athraitheach +/- %1 satosh(í) in aghaidh an ionchuir.</translation>
</message>
@@ -917,21 +889,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Déan Sparán Glan</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Úsáid tuairisceoirí le haghaidh bainistíochta scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Sparán Tuairisceoir</translation>
- </message>
- <message>
<source>Create</source>
<translation type="unfinished">Cruthaigh</translation>
</message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Tiomsaithe gan tacíocht sqlite (riachtanach do sparán tuairisceora)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1554,8 +1514,8 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">IBSP sábháilte ar dhiosca.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Seolann %1 chuig %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">seoladh féin</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2227,10 +2187,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Glan gach réimse den fhoirm.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Dusta:</translation>
- </message>
- <message>
<source>Hide transaction fee settings</source>
<translation type="unfinished">Folaigh socruithe táillí idirbhirt</translation>
</message>
@@ -2291,10 +2247,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáíl bearta</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Cóipeáíl dusta</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Cóipeáíl sóinseáil</translation>
</message>
@@ -2311,10 +2263,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cruthaíonn Idirbheart Bitcoin Sínithe go Páirteach (IBSP) le húsáid le e.g. sparán as líne %1, nó sparán crua-earraí atá comhoiriúnach le IBSP.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">ó sparán '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 go '%2'</translation>
</message>
@@ -2762,10 +2710,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Innéacs aschuir</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Níor fíoraíodh teastas)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Ceannaí</translation>
</message>
@@ -2864,10 +2808,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Seolta chuig</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Íocaíocht chugat féin</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Mianáilte</translation>
</message>
@@ -2943,10 +2883,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Seolta chuig</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Chugat fhéin</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Mianáilte</translation>
</message>
@@ -3165,10 +3101,6 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Dáilte faoin gceadúnas bogearraí MIT, féach na comhad atá in éindí %s nó %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Earráid ag léamh %s! Léigh gach eochair i gceart, ach d’fhéadfadh sonraí idirbhirt nó iontrálacha leabhar seoltaí a bheidh in easnamh nó mícheart.</translation>
- </message>
- <message>
<source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
<translation type="unfinished">Tá níos mó ná seoladh ceangail oinniún amháin curtha ar fáil. Ag baint úsáide as %s don tseirbhís Tor oinniún a cruthaíodh go huathoibríoch.</translation>
</message>
@@ -3485,10 +3417,6 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níor cheart go mbeadh suimeanna idirbhirt diúltach</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Tá slabhra mempool ró-fhada ag an idirbheart</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Caithfidh ar a laghad faighteoir amháin a bheith ag idirbheart</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ga_IE.ts b/src/qt/locale/bitcoin_ga_IE.ts
index 8d44a216f9..df252f82d5 100644
--- a/src/qt/locale/bitcoin_ga_IE.ts
+++ b/src/qt/locale/bitcoin_ga_IE.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Roghnaigh</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Seoltaí seoladh</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Seoltaí glacadh</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Seo iad do sheoltaí Bitcoin chun íocaíochtaí a sheoladh. Seiceáil i gcónaí an méid agus an seoladh glactha sula seoltar boinn.</translation>
</message>
@@ -702,10 +694,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Táille:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Dusta:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Iar-tháille:</translation>
</message>
@@ -770,10 +758,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáíl bearta</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Cóipeáíl dusta</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Cóipeáíl sóinseáil</translation>
</message>
@@ -782,18 +766,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">(%1 glasáilte)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">tá</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">níl</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Casann an lipéad seo dearg má fhaigheann aon fhaighteoir méid níos lú ná an tairseach reatha dusta.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Athraitheach +/- %1 satosh(í) in aghaidh an ionchuir.</translation>
</message>
@@ -917,21 +889,9 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Déan Sparán Glan</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Úsáid tuairisceoirí le haghaidh bainistíochta scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Sparán Tuairisceoir</translation>
- </message>
- <message>
<source>Create</source>
<translation type="unfinished">Cruthaigh</translation>
</message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Tiomsaithe gan tacíocht sqlite (riachtanach do sparán tuairisceora)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1554,8 +1514,8 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">IBSP sábháilte ar dhiosca.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Seolann %1 chuig %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">seoladh féin</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2227,10 +2187,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Glan gach réimse den fhoirm.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Dusta:</translation>
- </message>
- <message>
<source>Hide transaction fee settings</source>
<translation type="unfinished">Folaigh socruithe táillí idirbhirt</translation>
</message>
@@ -2291,10 +2247,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cóipeáíl bearta</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Cóipeáíl dusta</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Cóipeáíl sóinseáil</translation>
</message>
@@ -2311,10 +2263,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Cruthaíonn Idirbheart Bitcoin Sínithe go Páirteach (IBSP) le húsáid le e.g. sparán as líne %1, nó sparán crua-earraí atá comhoiriúnach le IBSP.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">ó sparán '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 go '%2'</translation>
</message>
@@ -2762,10 +2710,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Innéacs aschuir</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Níor fíoraíodh teastas)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Ceannaí</translation>
</message>
@@ -2864,10 +2808,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Seolta chuig</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Íocaíocht chugat féin</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Mianáilte</translation>
</message>
@@ -2943,10 +2883,6 @@ Ní féidir síniú ach le seoltaí 'oidhreachta'.</translation>
<translation type="unfinished">Seolta chuig</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Chugat fhéin</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Mianáilte</translation>
</message>
@@ -3165,10 +3101,6 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Dáilte faoin gceadúnas bogearraí MIT, féach na comhad atá in éindí %s nó %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Earráid ag léamh %s! Léigh gach eochair i gceart, ach d’fhéadfadh sonraí idirbhirt nó iontrálacha leabhar seoltaí a bheidh in easnamh nó mícheart.</translation>
- </message>
- <message>
<source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
<translation type="unfinished">Tá níos mó ná seoladh ceangail oinniún amháin curtha ar fáil. Ag baint úsáide as %s don tseirbhís Tor oinniún a cruthaíodh go huathoibríoch.</translation>
</message>
@@ -3485,10 +3417,6 @@ Téigh go Comhad &gt; Oscail Sparán chun sparán a lódáil.
<translation type="unfinished">Níor cheart go mbeadh suimeanna idirbhirt diúltach</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Tá slabhra mempool ró-fhada ag an idirbheart</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Caithfidh ar a laghad faighteoir amháin a bheith ag idirbheart</translation>
</message>
diff --git a/src/qt/locale/bitcoin_gd.ts b/src/qt/locale/bitcoin_gd.ts
index 63a59d6fe8..8ce79e1193 100644
--- a/src/qt/locale/bitcoin_gd.ts
+++ b/src/qt/locale/bitcoin_gd.ts
@@ -21,10 +21,6 @@
<source>Choose the address to send coins to</source>
<translation type="unfinished">Tagh an seòladh airson buinn a chuir thuige</translation>
</message>
- <message>
- <source>Sending addresses</source>
- <translation type="unfinished">A ’cur sheòlaidhean</translation>
- </message>
</context>
<context>
<name>AddressTableModel</name>
diff --git a/src/qt/locale/bitcoin_gl.ts b/src/qt/locale/bitcoin_gl.ts
index e207194fb6..df9362d664 100644
--- a/src/qt/locale/bitcoin_gl.ts
+++ b/src/qt/locale/bitcoin_gl.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Escoller</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Enviando enderezos</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Recibindo enderezos</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Estas son as túas direccións Bitcoin para enviar pagos. Revisa sempre a cantidade e a dirección receptora antes de enviar moedas.</translation>
</message>
@@ -633,10 +625,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Taxa:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">po:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Despois de taxas:</translation>
</message>
@@ -705,10 +693,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar po</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
@@ -717,18 +701,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">(%1 bloqueado)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">si</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">non</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Esta etiqueta tórnase vermella se algún receptor recibe unha cantidade máis pequena que o actual límite de po.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Pode variar +/- %1 satoshi(s) por entrada.</translation>
</message>
@@ -1157,6 +1129,10 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<source>Close</source>
<translation type="unfinished">Pechar</translation>
</message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">dirección propia</translation>
+ </message>
</context>
<context>
<name>PaymentServer</name>
@@ -1430,10 +1406,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Limpar tódolos campos do formulario</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">po:</translation>
- </message>
- <message>
<source>Clear &amp;All</source>
<translation type="unfinished">Limpar &amp;Todo</translation>
</message>
@@ -1466,10 +1438,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar po</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
@@ -1829,10 +1797,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Enviado a</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pago a ti mesmo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
@@ -1892,10 +1856,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Enviado a</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">A ti mesmo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minado</translation>
</message>
diff --git a/src/qt/locale/bitcoin_gl_ES.ts b/src/qt/locale/bitcoin_gl_ES.ts
index b36fa1b60d..854aebfc6f 100644
--- a/src/qt/locale/bitcoin_gl_ES.ts
+++ b/src/qt/locale/bitcoin_gl_ES.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">Selecciona</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Enderezos de envío</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Enderezos de recepción</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Estes son os teus enderezos de Bitcoin para enviar pagamentos. Asegurate sempre de comprobar a cantidade e maila dirección antes de enviar moedas.</translation>
</message>
@@ -131,10 +123,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Nova frase contrasinal</translation>
</message>
<message>
- <source>Repeat new passphrase</source>
- <translation type="unfinished">Repite a frase contrasinal</translation>
- </message>
- <message>
<source>Show passphrase</source>
<translation type="unfinished">Mostra frase contrasinal</translation>
</message>
@@ -625,10 +613,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">taxa:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">po:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Despois de taxas:</translation>
</message>
@@ -697,10 +681,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar po</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
@@ -709,14 +689,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">(%1 bloqueado)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">sí</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Esta etiqueta tórnase vermella se algún receptor recibe unha cantidade máis pequena que o actual límite de po.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Pode variar +/- %1 satoshi(s) por entrada.</translation>
</message>
@@ -1014,10 +986,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Cambio:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">po:</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">Copiar cantidade</translation>
</message>
@@ -1038,10 +1006,6 @@ Firmar é posible unicamente con enderezos de tipo 'legacy'.</translation>
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar po</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar cambio</translation>
</message>
diff --git a/src/qt/locale/bitcoin_gu.ts b/src/qt/locale/bitcoin_gu.ts
index afb4c59bc5..54f2cd1741 100644
--- a/src/qt/locale/bitcoin_gu.ts
+++ b/src/qt/locale/bitcoin_gu.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp; પસંદ કરો</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">મોકલવા માટે ના સરનામાં</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">મેળવવા માટે ના સરનામાં</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">આ તમારા ચુકવણી કરવા માટે ના સરનામાં છે, હંમેશા કિંમત અને મોકલવાના ના સરનામાં ચકાસી લેવા સિક્કા આપતા પહેલા.</translation>
</message>
@@ -97,6 +89,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">અલ્પવિરામથી વિભાજિત ફાઇલ</translation>
</message>
<message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
+ <translation type="unfinished">સરનામાં સૂચિને માં સાચવવાનો પ્રયાસ કરતી વખતે ભૂલ આવી હતી %1. મહેરબાની કરીને ફરીથી પ્રયતન કરો.</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">નિકાસ ની પ્ર્રાક્રિયા નિષ્ફળ ગયેલ છે</translation>
</message>
@@ -160,7 +157,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">ચેતવણી: જો તમે તમારું વletલેટ એન્ક્રિપ્ટ કરો છો અને તમારો પાસફ્રેઝ ખોવાઈ જાય છે, તો તમે તમારા બધા બિટકોઇન્સ ગુમાવશો!</translation>
+ <translation type="unfinished">ચેતવણી: જો તમે તમારા વૉલેટને એન્ક્રિપ્ટ કરો છો અને તમારો પાસફ્રેઝ ખોવાઈ જાય છે, &lt;b&gt; તો તમે તમારા બધા બિટકોઇન્સ ગુમાવશો&lt;/b&gt;!</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
diff --git a/src/qt/locale/bitcoin_ha.ts b/src/qt/locale/bitcoin_ha.ts
index 94bcbcb05b..e78d1a213e 100644
--- a/src/qt/locale/bitcoin_ha.ts
+++ b/src/qt/locale/bitcoin_ha.ts
@@ -7,7 +7,7 @@
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">&amp;Sabontawa</translation>
+ <translation type="unfinished">&amp;Sabonta</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
@@ -19,7 +19,7 @@
</message>
<message>
<source>C&amp;lose</source>
- <translation type="unfinished">C&amp;Rufe</translation>
+ <translation type="unfinished">C&amp;ɓatar</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
@@ -54,14 +54,6 @@
<translation type="unfinished">c&amp;zaɓi</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">adireshin aikawa</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adireshi da za a karba dashi</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Waɗannan adiresoshin Bitcoin ne don tura kuɗi bitcoin . ka tabbatar da cewa adreshin daidai ne kamin ka tura abua a ciki</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hak.ts b/src/qt/locale/bitcoin_hak.ts
index e95d92ce84..ca7723785c 100644
--- a/src/qt/locale/bitcoin_hak.ts
+++ b/src/qt/locale/bitcoin_hak.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">选择(&amp;H)</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">发送地址</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">收款地址</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">这些是你的比特币支付地址。在发送之前,一定要核对金额和接收地址。</translation>
</message>
@@ -101,6 +93,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">儲存地址列表到 %1 時發生錯誤。請再試一次。</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">付款地址 - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">收款地址 - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">导出失败</translation>
</message>
@@ -294,15 +294,45 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">请输入一个比特币地址 (例如 %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
<message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
<translation type="unfinished">区块转发</translation>
@@ -313,6 +343,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手册</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 天</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation type="unfinished">%1 小时</translation>
</message>
@@ -321,6 +365,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 分</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation type="unfinished">未知</translation>
</message>
@@ -673,8 +725,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">关闭所有钱包</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">迁移一个钱包</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示%1帮助消息以获得可能包含Bitcoin命令行选项的列表</translation>
+ <translation type="unfinished">显示 %1 帮助信息,获取可用命令行选项列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -768,6 +828,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">預先同步標頭(%1%)</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">创建钱包时出错</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">无法创建新钱包,软件编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">錯誤: %1</translation>
</message>
@@ -776,12 +844,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">警告: %1</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">日期: %1
+</translation>
+ </message>
+ <message>
<source>Amount: %1
</source>
<translation type="unfinished">金額: %1
</translation>
</message>
<message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">錢包: %1
+</translation>
+ </message>
+ <message>
<source>Type: %1
</source>
<translation type="unfinished">種類: %1
@@ -800,6 +880,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
<source>Incoming transaction</source>
<translation type="unfinished">收款交易</translation>
</message>
@@ -820,6 +904,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
<message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Original message:</source>
<translation type="unfinished">原消息:</translation>
</message>
@@ -838,14 +926,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手动选币</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
</message>
<message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
<source>Tree mode</source>
<translation type="unfinished">树状模式</translation>
</message>
@@ -858,10 +966,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
<source>Received with address</source>
<translation type="unfinished">收款地址</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
@@ -886,6 +1006,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">锁定未花费(&amp;O)</translation>
</message>
<message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -902,10 +1026,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -914,14 +1034,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1已锁定)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">是</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">當任何一個收款金額小於目前的灰塵金額上限時,文字會變紅色。</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">每个输入可能有 +/- %1 聪 (satoshi) 的误差。</translation>
</message>
@@ -933,7 +1045,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- </context>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -964,6 +1080,57 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您确定想要迁移钱包&lt;i&gt;%1&lt;/i&gt;吗?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">迁移钱包将会把这个钱包转换成一个或多个输出描述符钱包。将会需要创建一个新的钱包备份。
+如果这个钱包包含仅观察脚本,将会创建包含那些仅观察脚本的新钱包。
+如果这个钱包包含可解但又未被监视的脚本,将会创建一个不同的钱包以包含那些脚本。
+
+迁移过程开始前将会创建一个钱包备份。备份文件将会被命名为 &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak 然后被保存在该钱包所在目录下。如果迁移过程出错,可以使用“恢复钱包”功能恢复备份。</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">迁移钱包 &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">迁移失败</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">迁移成功</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -974,9 +1141,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">打開錢包警告</translation>
</message>
<message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+ <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">開啟錢包</translation>
+ <translation type="unfinished">打开钱包</translation>
</message>
</context>
<context>
@@ -1017,7 +1188,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
<translation type="unfinished">启用修剪时,如果一个钱包被卸载太久,就必须重新同步整条区块链才能再次加载它。</translation>
</message>
- </context>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">关闭所有钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">您确定想要关闭所有钱包吗?</translation>
+ </message>
+</context>
<context>
<name>CreateWalletDialog</name>
<message>
@@ -1025,8 +1204,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">新增錢包</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">距离创建您的新钱包只有一步之遥了!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">请指定一个名字,如果需要的话还可以启用高级选项</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
- <translation type="unfinished">錢包名稱</translation>
+ <translation type="unfinished">钱包名称</translation>
</message>
<message>
<source>Wallet</source>
@@ -1057,12 +1244,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">製作空白錢包</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">使用输出描述符进行scriptPubKey管理</translation>
- </message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ <source>Create</source>
+ <translation type="unfinished">创建</translation>
</message>
</context>
<context>
@@ -1084,6 +1267,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
</message>
<message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">地址(&amp;A)</translation>
+ </message>
+ <message>
<source>New sending address</source>
<translation type="unfinished">新建付款地址</translation>
</message>
@@ -1096,6 +1283,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">地址“%1”已经存在,它是一个收款地址,标签为“%2”,所以它不能作为一个付款地址被添加进来。</translation>
+ </message>
+ <message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">输入的地址“%1”已经存在于地址簿中,标签为“%2”。</translation>
</message>
@@ -1115,10 +1306,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">就要產生新的資料目錄。</translation>
</message>
<message>
+ <source>name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished">已經有這個目錄了。如果你要在裡面造出新的目錄的話,請加上 %1.</translation>
</message>
<message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">路径已存在,并且不是一个目录。</translation>
+ </message>
+ <message>
<source>Cannot create data directory here.</source>
<translation type="unfinished">无法在此创建数据目录。</translation>
</message>
@@ -1191,6 +1390,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
</message>
<message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">取消此设置需要重新下载整个区块链。先完整下载整条链再进行修剪会更快。这会禁用一些高级功能。</translation>
+ </message>
+ <message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
<translation type="unfinished">初始化同步过程是非常吃力的,同时可能会暴露您之前没有注意到的电脑硬件问题。你每次启动%1时,它都会从之前中断的地方继续下载。</translation>
</message>
@@ -1302,7 +1505,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Open bitcoin URI</source>
<translation type="unfinished">打开比特币URI</translation>
</message>
- </context>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -1310,6 +1518,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">選項</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
<translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
</message>
@@ -1318,6 +1534,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
</message>
<message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -1334,6 +1558,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1358,6 +1586,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -1386,6 +1618,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -1396,10 +1632,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -1410,10 +1658,30 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
<translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">使用 &amp;UPnP 映射端口</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1430,6 +1698,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
</message>
<message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
<source>Port of the proxy (e.g. 9050)</source>
<translation type="unfinished">代理伺服器的通訊埠(像是 9050)</translation>
</message>
@@ -1442,6 +1718,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口(&amp;W)</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1454,6 +1738,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
</message>
<message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
<source>User Interface &amp;language:</source>
<translation type="unfinished">使用界面語言(&amp;L):</translation>
</message>
@@ -1478,22 +1766,39 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
</message>
<message>
<source>default</source>
<translation type="unfinished">預設值</translation>
</message>
<message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished">需要重新開始客戶端軟體來讓改變生效。</translation>
@@ -1534,7 +1839,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>The configuration file could not be opened.</source>
<translation type="unfinished">无法打开配置文件。</translation>
</message>
- </context>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -1553,6 +1866,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">顯示的資訊可能是過期的。跟 Bitcoin 網路的連線建立後,你的錢包會自動和網路同步,但是這個步驟還沒完成。</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation type="unfinished">可用金額:</translation>
</message>
@@ -1581,10 +1898,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">餘額</translation>
</message>
<message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
<source>Your current total balance</source>
<translation type="unfinished">您当前的总余额</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation type="unfinished">最近的交易</translation>
</message>
@@ -1593,6 +1922,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">仅观察地址的未确认交易</translation>
</message>
<message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
<source>Current total balance in watch-only addresses</source>
<translation type="unfinished">仅观察地址中的当前总余额</translation>
</message>
@@ -1628,6 +1961,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">關閉</translation>
</message>
<message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
@@ -1640,6 +1981,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
</message>
<message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -1649,6 +2006,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
<source>Pays transaction fee: </source>
<translation type="unfinished">支付交易费用:</translation>
</message>
@@ -1677,6 +2046,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(但这个钱包不能签名交易)</translation>
</message>
<message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
<source>Transaction status is unknown.</source>
<translation type="unfinished">交易状态未知。</translation>
</message>
@@ -1688,6 +2065,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">支付请求出错</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
<source>URI handling</source>
<translation type="unfinished">URI 處理</translation>
</message>
@@ -1764,7 +2145,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<extracomment>An Inbound Connection from a Peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
- </context>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1772,10 +2158,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
<source>Error encoding URI into QR Code.</source>
<translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
</message>
<message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
<source>Save QR Code</source>
<translation type="unfinished">儲存 QR 碼</translation>
</message>
@@ -1800,6 +2198,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">資訊(&amp;I)</translation>
</message>
<message>
+ <source>General</source>
+ <translation type="unfinished">常规</translation>
+ </message>
+ <message>
<source>Datadir</source>
<translation type="unfinished">数据目录</translation>
</message>
@@ -1812,6 +2214,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">区块存储目录</translation>
</message>
<message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">啓動時間</translation>
</message>
@@ -1820,6 +2226,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络</translation>
</message>
<message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation type="unfinished">連線數</translation>
</message>
@@ -1828,10 +2238,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">區塊鏈</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
<source>Memory usage</source>
<translation type="unfinished">内存使用</translation>
</message>
<message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
<source>(none)</source>
<translation type="unfinished">(无)</translation>
</message>
@@ -1860,6 +2282,26 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">选择节点查看详细信息。</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">传输层版本: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">传输</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">十六进制格式的BIP324会话ID,如果有的话。</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">会话ID</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">是否要将交易转发给这个节点。</translation>
</message>
@@ -1868,10 +2310,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation type="unfinished">已同步前導資料</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
@@ -1926,6 +2376,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">当前区块高度</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
<source>Decrease font size</source>
<translation type="unfinished">缩小字体大小</translation>
</message>
@@ -1962,10 +2416,23 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">高带宽</translation>
</message>
<message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
<source>Last Block</source>
<translation type="unfinished">上一个区块</translation>
</message>
<message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">最近送出</translation>
</message>
@@ -1974,6 +2441,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">上次接收</translation>
</message>
<message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
<source>The duration of a currently outstanding ping.</source>
<translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
</message>
@@ -1982,6 +2453,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ping 等待</translation>
</message>
<message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>&amp;Open</source>
<translation type="unfinished">打开(&amp;O)</translation>
</message>
@@ -1998,6 +2481,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">總計</translation>
</message>
<message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
<source>Clear console</source>
<translation type="unfinished">清主控台</translation>
</message>
@@ -2035,6 +2522,26 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
</message>
<message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: 未加密,明文传输协议</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324加密传输协议</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">我们选择了用于高带宽转发的节点</translation>
</message>
@@ -2043,15 +2550,35 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">对端选择了我们用于高带宽转发</translation>
</message>
<message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">复制地址(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation type="unfinished">1 小时(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
@@ -2061,6 +2588,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">解封(&amp;U)</translation>
</message>
<message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2083,6 +2626,10 @@ For more information on using this console, type %6.
<translation type="unfinished">执行中……</translation>
</message>
<message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">經由 %1</translation>
</message>
@@ -2091,6 +2638,10 @@ For more information on using this console, type %6.
<translation type="unfinished">是</translation>
</message>
<message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">到</translation>
</message>
@@ -2118,6 +2669,10 @@ For more information on using this console, type %6.
<translation type="unfinished">金额(&amp;A):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
<source>&amp;Message:</source>
<translation type="unfinished">訊息(&amp;M):</translation>
</message>
@@ -2126,6 +2681,10 @@ For more information on using this console, type %6.
<translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
</message>
<message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
</message>
@@ -2138,10 +2697,18 @@ For more information on using this console, type %6.
<translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
</message>
<message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
<source>&amp;Create new receiving address</source>
<translation type="unfinished">&amp;產生新的接收地址</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
<source>Clear</source>
<translation type="unfinished">清空</translation>
</message>
@@ -2162,6 +2729,10 @@ For more information on using this console, type %6.
<translation type="unfinished">从列表中移除选中的条目</translation>
</message>
<message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">複製 &amp;URI</translation>
</message>
@@ -2217,6 +2788,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请求支付至...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
<source>Label:</source>
<translation type="unfinished">标签:</translation>
</message>
@@ -2237,10 +2816,22 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
<source>Request payment to %1</source>
<translation type="unfinished">付款給 %1 的要求</translation>
</message>
@@ -2248,14 +2839,26 @@ For more information on using this console, type %6.
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
<message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
<source>(no amount requested)</source>
<translation type="unfinished">(無要求金額)</translation>
</message>
@@ -2283,14 +2886,38 @@ For more information on using this console, type %6.
<translation type="unfinished">金额不足!</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished">如果這項有打開,但是找零地址是空的或無效,那麼找零會送到一個產生出來的地址去。</translation>
</message>
<message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
<source>Transaction Fee:</source>
<translation type="unfinished">交易手续费:</translation>
</message>
@@ -2303,6 +2930,10 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -2315,12 +2946,20 @@ For more information on using this console, type %6.
<translation type="unfinished">自訂:</translation>
</message>
<message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
<source>Add &amp;Recipient</source>
<translation type="unfinished">增加收款人(&amp;R)</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
</message>
<message>
<source>Choose…</source>
@@ -2331,18 +2970,54 @@ For more information on using this console, type %6.
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
<translation type="unfinished">手續費太低的話可能會造成永遠無法確認的交易(請參考提示)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation type="unfinished">餘額:</translation>
</message>
<message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -2363,10 +3038,6 @@ For more information on using this console, type %6.
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -2375,12 +3046,26 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 (%2个块)</translation>
</message>
<message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2396,6 +3081,10 @@ For more information on using this console, type %6.
<translation type="unfinished">外部签名器失败</translation>
</message>
<message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -2409,6 +3098,10 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -2424,6 +3117,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请检查您的交易。</translation>
</message>
<message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">總金額</translation>
</message>
@@ -2458,6 +3159,22 @@ For more information on using this console, type %6.
<translation type="unfinished">支付金额必须大于0。</translation>
</message>
<message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
</message>
@@ -2472,10 +3189,18 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 比特币地址无效</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
<source>Confirm custom change address</source>
<translation type="unfinished">确认自定义找零地址</translation>
</message>
<message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
@@ -2491,14 +3216,34 @@ For more information on using this console, type %6.
<translation type="unfinished">付給(&amp;T):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
<source>The Bitcoin address to send the payment to</source>
<translation type="unfinished">將支付發送到的比特幣地址給</translation>
</message>
<message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
<source>The amount to send in the selected unit</source>
<translation type="unfinished">用被选单位表示的待发送金额</translation>
</message>
<message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
<source>S&amp;ubtract fee from amount</source>
<translation type="unfinished">從付款金額減去手續費(&amp;U)</translation>
</message>
@@ -2545,6 +3290,22 @@ For more information on using this console, type %6.
<translation type="unfinished">您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。</translation>
</message>
<message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
<source>Signature</source>
<translation type="unfinished">簽章</translation>
</message>
@@ -2565,10 +3326,18 @@ For more information on using this console, type %6.
<translation type="unfinished">清空所有签名消息栏</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Verify Message</source>
<translation type="unfinished">消息验证(&amp;V)</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation type="unfinished">用来签名消息的地址</translation>
</message>
@@ -2585,6 +3354,14 @@ For more information on using this console, type %6.
<translation type="unfinished">驗證這個訊息來確定是用指定的比特幣地址簽名的</translation>
</message>
<message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
<source>Click "Sign Message" to generate signature</source>
<translation type="unfinished">請按一下「簽署訊息」來產生簽章</translation>
</message>
@@ -2601,6 +3378,10 @@ For more information on using this console, type %6.
<translation type="unfinished">找不到与输入地址相关的密钥。</translation>
</message>
<message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
<source>No error</source>
<translation type="unfinished">沒有錯誤</translation>
</message>
@@ -2613,6 +3394,14 @@ For more information on using this console, type %6.
<translation type="unfinished">消息签名失败。</translation>
</message>
<message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
<source>Please check the signature and try again.</source>
<translation type="unfinished">请检查签名后重试。</translation>
</message>
@@ -2621,6 +3410,10 @@ For more information on using this console, type %6.
<translation type="unfinished">這個簽章跟訊息的數位摘要不符。</translation>
</message>
<message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
<source>Message verified.</source>
<translation type="unfinished">消息验证成功。</translation>
</message>
@@ -2654,6 +3447,11 @@ For more information on using this console, type %6.
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
<message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>%1/unconfirmed</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
<translation type="unfinished">%1 次/未確認</translation>
@@ -2668,10 +3466,18 @@ For more information on using this console, type %6.
<translation type="unfinished">状态</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Source</source>
<translation type="unfinished">來源</translation>
</message>
<message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
<source>From</source>
<translation type="unfinished">來源</translation>
</message>
@@ -2684,6 +3490,10 @@ For more information on using this console, type %6.
<translation type="unfinished">到</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
<source>watch-only</source>
<translation type="unfinished">只能看</translation>
</message>
@@ -2691,6 +3501,10 @@ For more information on using this console, type %6.
<source>label</source>
<translation type="unfinished">标签</translation>
</message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2698,18 +3512,46 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
<source>Total debit</source>
<translation type="unfinished">总支出</translation>
</message>
<message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
<source>Net amount</source>
<translation type="unfinished">淨額</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
<source>Transaction ID</source>
<translation type="unfinished">交易 ID</translation>
</message>
<message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
<source>Transaction virtual size</source>
<translation type="unfinished">交易擬真大小</translation>
</message>
@@ -2718,14 +3560,26 @@ For more information on using this console, type %6.
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
<translation type="unfinished">商家</translation>
</message>
<message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
+ </message>
+ <message>
<source>Inputs</source>
<translation type="unfinished">輸入</translation>
</message>
@@ -2737,7 +3591,11 @@ For more information on using this console, type %6.
<source>true</source>
<translation type="unfinished">是</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
@@ -2752,6 +3610,10 @@ For more information on using this console, type %6.
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2760,6 +3622,14 @@ For more information on using this console, type %6.
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
<translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
</message>
@@ -2768,6 +3638,18 @@ For more information on using this console, type %6.
<translation type="unfinished">已確認(%1 次)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2780,10 +3662,6 @@ For more information on using this console, type %6.
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">付給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -2808,6 +3686,10 @@ For more information on using this console, type %6.
<translation type="unfinished">收到交易的日期和時間。</translation>
</message>
<message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
<translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
</message>
@@ -2823,6 +3705,10 @@ For more information on using this console, type %6.
<translation type="unfinished">全部</translation>
</message>
<message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
<source>This week</source>
<translation type="unfinished">這星期</translation>
</message>
@@ -2831,6 +3717,14 @@ For more information on using this console, type %6.
<translation type="unfinished">這個月</translation>
</message>
<message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2839,10 +3733,6 @@ For more information on using this console, type %6.
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -2855,6 +3745,10 @@ For more information on using this console, type %6.
<translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
</message>
<message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
<source>Range…</source>
<translation type="unfinished">范围...</translation>
</message>
@@ -2879,10 +3773,22 @@ For more information on using this console, type %6.
<translation type="unfinished">复制原始交易(&amp;R)</translation>
</message>
<message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
<source>Increase transaction &amp;fee</source>
<translation type="unfinished">增加矿工费(&amp;F)</translation>
</message>
<message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
<source>&amp;Edit address label</source>
<translation type="unfinished">编辑地址标签(&amp;E)</translation>
</message>
@@ -2892,15 +3798,27 @@ For more information on using this console, type %6.
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗號分隔文件</translation>
</message>
<message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Watch-only</source>
<translation type="unfinished">只能觀看的</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2936,7 +3854,11 @@ For more information on using this console, type %6.
<source>Range:</source>
<translation type="unfinished">範圍:</translation>
</message>
- </context>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2967,7 +3889,15 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Partially Signed Transaction (*.psbt)</source>
<translation type="unfinished">部分签名交易 (*.psbt)</translation>
</message>
- </context>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
@@ -2975,6 +3905,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">付款</translation>
</message>
<message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
<translation type="unfinished">想要提高手續費嗎?</translation>
@@ -2984,6 +3922,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">当前手续费:</translation>
</message>
<message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
<source>New fee:</source>
<translation type="unfinished">新的費用:</translation>
</message>
@@ -3000,6 +3942,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">無法草擬交易。</translation>
</message>
<message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
@@ -3012,12 +3958,20 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Could not commit transaction</source>
<translation type="unfinished">沒辦法提交交易</translation>
</message>
- </context>
+ <message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+</context>
<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;匯出</translation>
+ <translation type="unfinished">导出(E)</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -3060,6 +4014,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s请求监听端口%u。此端口被认为是“坏的”,所以不太可能有其他节点会连接过来。详情以及完整的端口列表请参见 doc/p2p-bad-ports.md 。</translation>
</message>
@@ -3068,6 +4026,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
<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">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
</message>
@@ -3092,26 +4054,58 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
</message>
<message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
</message>
<message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">错误: 旧式钱包只支持 "legacy", "p2sh-segwit", 和 "bech32" 这三种地址类型</translation>
+ </message>
+ <message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>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>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
<translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
</message>
<message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
<translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
</message>
<message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
@@ -3120,6 +4114,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">修剪:上次同步钱包的位置已经超出(落后于)现有修剪后数据的范围。你需要进行-reindex(对于已经启用修剪节点,就需要重新下载整个区块链)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">重命名 '%s' -&gt; '%s' 失败。您需要手动移走或删除无效的快照目录 %s来解决这个问题,不然的话您就会在下一次启动时遇到相同的错误。</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: SQLite钱包schema版本%d未知。只支持%d版本</translation>
</message>
@@ -3128,14 +4126,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">區塊資料庫中有來自未來的區塊。可能是你電腦的日期時間不對。如果確定電腦日期時間沒錯的話,就重建區塊資料庫看看。</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">区块索引数据库含有历史遗留的 'txindex' 。可以运行完整的 -reindex 来清理被占用的磁盘空间;也可以忽略这个错误。这个错误消息将不会再次显示。</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">扣除手續費後的交易金額太少而不能傳送</translation>
</message>
<message>
+ <source>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>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation type="unfinished">這是個還沒發表的測試版本 - 使用請自負風險 - 請不要用來開採或做商業應用</translation>
</message>
@@ -3164,6 +4162,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">提供了未知的钱包格式 "%s" 。请使用 "bdb" 或 "sqlite" 中的一种。</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">不支持的类别限定日志等级 %1$s=%2$s 。 预期参数 %1$s=&lt;category&gt;:&lt;loglevel&gt;。 有效的类别: %3$s 。有效的日志等级: %4$s 。</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">找到了不受支持的 chainstate 数据库格式。请使用 -reindex-chainstate 参数重启。这将会重建 chainstate 数据库。</translation>
</message>
@@ -3172,6 +4174,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">钱包创建成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">钱包加载成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。可以使用 migratewallet 命令将旧式钱包迁移至输出描述符钱包。</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">警告: 转储文件的钱包格式 "%s" 与命令行指定的格式 "%s" 不符。</translation>
</message>
@@ -3180,6 +4186,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
<translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
</message>
@@ -3196,6 +4206,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">參數 -maxmempool 至少要給 %d 百萬位元組(MB)</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">沒辦法解析 -%s 參數指定的地址: '%s'</translation>
</message>
@@ -3212,30 +4226,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">不能写入到数据目录'%s';请检查文件权限。</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">无法完成由之前版本启动的 -txindex 升级。请用之前的版本重新启动,或者进行一次完整的 -reindex 。</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -blockfilterindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 blockfilterindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -coinstatsindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 coinstatsindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -txindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 txindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">在使用地址管理器(addrman)寻找出站连接时,无法同时提供特定的连接。</translation>
</message>
@@ -3244,6 +4238,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">加载%s时出错: 编译时未启用外部签名器支持,却仍然试图加载外部签名器钱包</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">读取 %s 时出错! 所有密钥都被正确读取,但交易数据或地址元数据可能缺失或有误。</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">错误:钱包中的地址簿数据无法被识别为属于迁移后的钱包</translation>
</message>
@@ -3256,6 +4254,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误:钱包中的交易%s无法被识别为属于迁移后的钱包</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">计算追加手续费失败,因为未确认UTXO依赖了大量未确认交易的簇集。</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">无法重命名无效的 peers.dat 文件。 请移动或删除它,然后重试。</translation>
</message>
@@ -3330,10 +4332,6 @@ Please try running the latest software version.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">不支持的类别限定日志等级 -loglevel=%s。预期参数 -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s。有效的类别: %s。</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -3354,6 +4352,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
<source>Do you want to rebuild the block database now?</source>
<translation type="unfinished">你想现在就重建区块数据库吗?</translation>
</message>
@@ -3366,6 +4384,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -3374,6 +4396,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化区块数据库时出错</translation>
</message>
<message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
<source>Error loading %s</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤</translation>
</message>
@@ -3390,6 +4416,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤: 這個錢包需要新版的 %s</translation>
</message>
<message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
@@ -3398,16 +4432,16 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3426,10 +4460,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -3454,6 +4484,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -3462,10 +4496,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">无法启动索引,关闭中...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -3634,6 +4692,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">这是你每次交易付款时最少要付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amounts must not be negative</source>
<translation type="unfinished">交易金额不不可为负数</translation>
</message>
@@ -3702,14 +4764,30 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">在 -onlynet 指定了不明的網路別: '%s'</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">不支持的全局日志等级 -loglevel=%s 。有效的数值:%s 。</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_he.ts b/src/qt/locale/bitcoin_he.ts
index 9275ddfb34..e3979b07e4 100644
--- a/src/qt/locale/bitcoin_he.ts
+++ b/src/qt/locale/bitcoin_he.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;בחירה</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">כתובת לשליחה</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">כתובות לקבלה</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">אלה כתובות הביטקוין שלך לשליחת תשלומים. חשוב לבדוק את הסכום ואת הכתובת המקבלת לפני שליחת מטבעות.</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">אירעה שגיאה בעת הניסיון לשמור את רשימת הכתובת אל %1. נא לנסות שוב.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">כתובות שליחה - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">כתובות קבלה - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">הייצוא נכשל</translation>
</message>
@@ -228,6 +228,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">סיסמת הארנק שונתה בהצלחה.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">שינוי הסיסמה נכשל</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">אזהרה: מקש Caps Lock פעיל!</translation>
</message>
@@ -242,6 +246,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">קובץ ההגדרות %1 כנראה פגום או שגוי.</translation>
+ </message>
+ <message>
<source>Runaway exception</source>
<translation type="unfinished">חריגת בריחה</translation>
</message>
@@ -499,6 +507,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ה&amp;חלפת מילת צופן…</translation>
</message>
<message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">&amp;חתימה על הודעה…</translation>
+ </message>
+ <message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">חתום על הודעות עם כתובות הביטקוין שלך כדי להוכיח שהן בבעלותך</translation>
</message>
@@ -511,6 +523,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">אמת הודעות כדי להבטיח שהן נחתמו עם כתובת ביטקוין מסוימות</translation>
</message>
<message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;טעינת PBST מקובץ…</translation>
+ </message>
+ <message>
<source>Open &amp;URI…</source>
<translation type="unfinished">פתיחת הקישור</translation>
</message>
@@ -543,10 +559,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">סרגל כלים לשוניות</translation>
</message>
<message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">הכותרות מסונכרנות (%1%)…</translation>
+ </message>
+ <message>
<source>Synchronizing with network…</source>
<translation type="unfinished">בסנכרון עם הרשת</translation>
</message>
<message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">מעביר לאינדקס בלוקים בדיסק...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">מעבד בלוקים בדיסק...</translation>
+ </message>
+ <message>
<source>Connecting to peers…</source>
<translation type="unfinished">מתחבר לעמיתים</translation>
</message>
@@ -610,6 +638,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">העלה עיסקת ביטקוין חתומה חלקית</translation>
</message>
<message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">העלאת PSBT מהקליפבורד...</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
<translation type="unfinished">טעינת עסקת ביטקוין חתומה חלקית מלוח הגזירים</translation>
</message>
@@ -681,11 +713,21 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">אין ארנקים זמינים</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">נתוני ארנק</translation>
+ </message>
+ <message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
<translation type="unfinished">טעינת גיבוי הארנק</translation>
</message>
<message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">שחזור ארנק</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">שם הארנק</translation>
@@ -706,6 +748,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 client</source>
<translation type="unfinished">לקוח %1</translation>
</message>
+ <message>
+ <source>&amp;Hide</source>
+ <translation type="unfinished">ה&amp;סתרה</translation>
+ </message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">ה&amp;צגה</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -715,6 +765,30 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">נא ללחוץ כאן לפעולות נוספות.</translation>
+ </message>
+ <message>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">הצגת לשונית עמיתים</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">השבתת פעילות רשת</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">הפעלת פעילות רשת</translation>
+ </message>
+ <message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">הכותרות בקדם סנכרון (%1%)…</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">שגיאה: %1</translation>
</message>
@@ -817,10 +891,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">עמלה:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">אבק:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">לאחר עמלה:</translation>
</message>
@@ -869,6 +939,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">העתקת הסכום</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">ה&amp;עתקת כתובת</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">העתקת &amp;תווית</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">העתקת &amp;סכום</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">העתקת הכמות</translation>
</message>
@@ -885,10 +967,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">העתקת בתים</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">העתקת אבק</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">העתקת השינוי</translation>
</message>
@@ -897,18 +975,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 נעולים)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">כן</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">לא</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">תווית זו הופכת לאדומה אם מישהו מהנמענים מקבל סכום נמוך יותר מסף האבק הנוכחי.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">יכול להשתנות במגמה של +/- %1 סנטושי לקלט.</translation>
</message>
@@ -967,6 +1033,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">שחזור ארנק</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1032,21 +1106,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">יצירת ארנק ריק</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">השתמש ב descriptors לניהול scriptPubKey </translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">ארנק Descriptor </translation>
- </message>
- <message>
<source>Create</source>
<translation type="unfinished">יצירה</translation>
</message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">מהודר ללא תמיכת sqlite (נחוץ לארנקי דסקריפטור)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1701,8 +1763,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT נשמרה לדיסק.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * שליחת %1 אל %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">כתובת עצמית</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2067,6 +2129,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">יוצא:</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <extracomment>Context menu action to copy the address of a peer.</extracomment>
+ <translation type="unfinished">ה&amp;עתקת כתובת</translation>
+ </message>
+ <message>
<source>&amp;Disconnect</source>
<translation type="unfinished">&amp;ניתוק</translation>
</message>
@@ -2202,6 +2269,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">העתקת &amp;כתובת משאב</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">ה&amp;עתקת כתובת</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">העתקת &amp;תווית</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">העתקת &amp;סכום</translation>
+ </message>
+ <message>
<source>Could not unlock wallet.</source>
<translation type="unfinished">לא ניתן לשחרר את הארנק.</translation>
</message>
@@ -2371,10 +2450,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ניקוי של כל השדות בטופס.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">אבק:</translation>
- </message>
- <message>
<source>Hide transaction fee settings</source>
<translation type="unfinished">הסתרת הגדרות עמלת עסקה</translation>
</message>
@@ -2435,10 +2510,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">העתקת בתים</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">העתקת אבק</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">העתקת השינוי</translation>
</message>
@@ -2455,10 +2526,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">יוצר עסקת ביטקוין חתומה חלקית (PSBT) לשימוש עם ארנק %1 לא מחובר למשל, או עם PSBT ארנק חומרה תואם.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">מתוך ארנק "%1"</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 אל "%2"</translation>
</message>
@@ -2908,10 +2975,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">מפתח פלט</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(האישור לא אומת)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">סוחר</translation>
</message>
@@ -3010,10 +3073,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">נשלח אל</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">תשלום לעצמך</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">נכרו</translation>
</message>
@@ -3089,10 +3148,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">נשלח אל</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">לעצמך</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">נכרו</translation>
</message>
@@ -3109,6 +3164,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">סכום מזערי</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">ה&amp;עתקת כתובת</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">העתקת &amp;תווית</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">העתקת &amp;סכום</translation>
+ </message>
+ <message>
<source>Export Transaction History</source>
<translation type="unfinished">יצוא היסטוריית העברה</translation>
</message>
@@ -3280,6 +3347,11 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">גיבוי הארנק</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">נתוני ארנק</translation>
+ </message>
+ <message>
<source>Backup Failed</source>
<translation type="unfinished">הגיבוי נכשל</translation>
</message>
@@ -3315,10 +3387,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">מופץ תחת רשיון התוכנה של MIT, ראה קובץ מלווה %s או %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">שגיאה בנסיון לקרוא את %s! כל המפתחות נקראו נכונה, אך נתוני העסקה או הכתובות יתכן שחסרו או שגויים.</translation>
- </message>
- <message>
<source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
<translation type="unfinished">נא בדקו שהתאריך והשעה במחשב שלכם נכונים! אם השעון שלכם לא מסונכרן, %s לא יעבוד כהלכה.</translation>
</message>
@@ -3607,10 +3675,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">סכומי ההעברה לא יכולים להיות שליליים</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">לעסקה יש שרשרת ארוכה מדי של mempool </translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">להעברה חייב להיות לפחות נמען אחד</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hi.ts b/src/qt/locale/bitcoin_hi.ts
index 15d62418fb..414670e7a2 100644
--- a/src/qt/locale/bitcoin_hi.ts
+++ b/src/qt/locale/bitcoin_hi.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;चुज़</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">पते भेजे जा रहे हैं</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">पते प्राप्त किए जा रहे हैं</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">भुगतान भेजने के लिए ये आपके बिटकॉइन पते हैं। कॉइन्स भेजने से पहले हमेशा राशि और प्राप्त करने वाले पते की जांच करें।</translation>
</message>
@@ -524,6 +516,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Load PSBT from &amp;clipboard…</source>
<translation type="unfinished">पीएसबीटी को &amp;क्लिपबोर्ड से लोड करें…</translation>
</message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">वॉलेट माइग्रेट करें</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">कोई वॉलेट माइग्रेट करें</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -533,26 +533,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
- <source>Click for more actions.</source>
- <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">अधिक विकल्पों के लिए क्लिक करें</translation>
- </message>
- <message>
- <source>Show Peers tab</source>
- <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
- <translation type="unfinished">पीयर्स टैब दिखाएं</translation>
- </message>
- <message>
- <source>Disable network activity</source>
- <extracomment>A context menu item.</extracomment>
- <translation type="unfinished">नेटवर्क गतिविधि अक्षम करें</translation>
- </message>
- <message>
- <source>Enable network activity</source>
- <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">नेटवर्क गतिविधि सक्षम करें</translation>
- </message>
- <message>
<source>Error: %1</source>
<translation type="unfinished">त्रुटि: %1</translation>
</message>
@@ -595,10 +575,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">फी:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">डस्ट:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">आफ़्टर फी:</translation>
</message>
@@ -632,7 +608,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Date</source>
- <translation type="unfinished">डेट</translation>
+ <translation type="unfinished">तारीख़</translation>
</message>
<message>
<source>Confirmations</source>
@@ -675,38 +651,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">कॉपी बाइट्स</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">कॉपी डस्ट</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation type="unfinished">कॉपी चैंज</translation>
- </message>
- <message>
- <source>yes</source>
- <translation type="unfinished">हां</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ना</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">यदि किसी प्राप्तकर्ता को वर्तमान शेष सीमा से कम राशि प्राप्त होती है तो यह लेबल लाल हो जाता है।</translation>
- </message>
- <message>
<source>(no label)</source>
- <translation type="unfinished">(नो लेबल)</translation>
+ <translation type="unfinished">(कोई लेबल नहीं)</translation>
</message>
</context>
<context>
<name>CreateWalletActivity</name>
<message>
- <source>Create Wallet</source>
- <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
- <translation type="unfinished">वॉलेट बनाएं</translation>
- </message>
- <message>
<source>Create wallet failed</source>
<translation type="unfinished">वॉलेट बनाना विफल</translation>
</message>
@@ -729,6 +680,21 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">वॉलेट माइग्रेट करें</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">माइग्रेशन नहीं हो पाया</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">माइग्रेशन हो गया</translation>
+ </message>
+</context>
+<context>
<name>Intro</name>
<message numerus="yes">
<source>%n GB of space available</source>
@@ -792,6 +758,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">आंशिक रूप से हस्ताक्षरित लेनदेन (बाइनरी)</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">खुद का पता</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">कुल राशि</translation>
</message>
@@ -825,7 +795,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Type</source>
<extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
- <translation type="unfinished">टाइप</translation>
+ <translation type="unfinished">प्रकार</translation>
</message>
<message>
<source>Network</source>
@@ -1068,10 +1038,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">समय का निर्धारण</translation>
</message>
<message>
- <source>Last block time</source>
- <translation type="unfinished">अंतिम ब्लॉक समय</translation>
- </message>
- <message>
<source>&amp;Open</source>
<translation type="unfinished">खुला हुआ</translation>
</message>
@@ -1333,10 +1299,6 @@ For more information on using this console, type %6.
<translation type="unfinished">कॉपी &amp;अमाउंट</translation>
</message>
<message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">वॉलेट अनलॉक नहीं किया जा सकता |</translation>
- </message>
- <message>
<source>Could not generate new %1 address</source>
<translation type="unfinished">नया पता उत्पन्न नहीं कर सका %1 </translation>
</message>
@@ -1400,7 +1362,7 @@ For more information on using this console, type %6.
<name>RecentRequestsTableModel</name>
<message>
<source>Date</source>
- <translation type="unfinished">डेट</translation>
+ <translation type="unfinished">तारीख़</translation>
</message>
<message>
<source>Label</source>
@@ -1412,7 +1374,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(नो लेबल)</translation>
+ <translation type="unfinished">(कोई लेबल नहीं)</translation>
</message>
<message>
<source>(no message)</source>
@@ -1518,10 +1480,6 @@ For more information on using this console, type %6.
<translation type="unfinished">इनपुट्स…</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">डस्ट:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">चुज…</translation>
</message>
@@ -1598,14 +1556,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">कॉपी बाइट्स</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">कॉपी डस्ट</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation type="unfinished">कॉपी चैंज</translation>
- </message>
- <message>
<source>%1 (%2 blocks)</source>
<translation type="unfinished">%1 (%2 ब्लाकस)</translation>
</message>
@@ -1632,10 +1582,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">उदाहरण के लिए उपयोग के लिए आंशिक रूप से हस्ताक्षरित बिटकॉइन लेनदेन (PSBT) बनाता है। एक ऑफ़लाइन% 1 %1 वॉलेट, या एक PSBT-संगत हार्डवेयर वॉलेट।</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">वॉलिट से '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1टु '%2'</translation>
</message>
@@ -1788,7 +1734,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(नो लेबल)</translation>
+ <translation type="unfinished">(कोई लेबल नहीं)</translation>
</message>
</context>
<context>
@@ -2067,7 +2013,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Date</source>
- <translation type="unfinished">डेट</translation>
+ <translation type="unfinished">तारीख़</translation>
</message>
<message>
<source>Source</source>
@@ -2095,7 +2041,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">निगरानी-केवल</translation>
+ <translation type="unfinished">केवल निगरानी</translation>
</message>
<message>
<source>label</source>
@@ -2161,10 +2107,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">आउटपुट इंडेक्स</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(प्रमाणपत्र सत्यापित नहीं किया गया था)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">सौदागर</translation>
</message>
@@ -2212,11 +2154,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<name>TransactionTableModel</name>
<message>
<source>Date</source>
- <translation type="unfinished">डेट</translation>
+ <translation type="unfinished">तारीख़</translation>
</message>
<message>
<source>Type</source>
- <translation type="unfinished">टाइप</translation>
+ <translation type="unfinished">प्रकार</translation>
</message>
<message>
<source>Label</source>
@@ -2228,7 +2170,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Abandoned</source>
- <translation type="unfinished">अबॅन्डन्ड</translation>
+ <translation type="unfinished">छोड़ दिया </translation>
</message>
<message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
@@ -2240,7 +2182,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Conflicted</source>
- <translation type="unfinished">विरोध हुआ</translation>
+ <translation type="unfinished">एक दूसरे के विरोध में</translation>
</message>
<message>
<source>Immature (%1 confirmations, will be available after %2)</source>
@@ -2248,20 +2190,108 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Generated but not accepted</source>
- <translation type="unfinished">जनरेट किया गया लेकिन स्वीकार नहीं किया गया</translation>
+ <translation type="unfinished">निकाला गया पर स्वीकार नहीं </translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">के साथ प्राप्त हुए</translation>
+ </message>
+ <message>
+ <source>Received from</source>
+ <translation type="unfinished">से मिला</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">को भेजा</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">माइन किया</translation>
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">निगरानी-केवल</translation>
+ <translation type="unfinished">केवल निगरानी</translation>
+ </message>
+ <message>
+ <source>(n/a)</source>
+ <translation type="unfinished">(असंबंधित)</translation>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(नो लेबल)</translation>
+ <translation type="unfinished">(कोई लेबल नहीं)</translation>
</message>
- </context>
+ <message>
+ <source>Transaction status. Hover over this field to show number of confirmations.</source>
+ <translation type="unfinished">लेनदेन की जानकारी. इस फ़ील्ड पर कर्सर लाएं ताकि कन्फ़र्मेशन की संख्या पता चले.</translation>
+ </message>
+ <message>
+ <source>Date and time that the transaction was received.</source>
+ <translation type="unfinished">तारीख़ और समय जब आपको ट्रांज़ेक्शन मिला. </translation>
+ </message>
+ <message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">ट्रांज़ेक्शन का प्रकार</translation>
+ </message>
+ <message>
+ <source>Amount removed from or added to balance.</source>
+ <translation type="unfinished">पैसा बैलेंस से हटाया या जोड़ा गया.</translation>
+ </message>
+</context>
<context>
<name>TransactionView</name>
<message>
+ <source>All</source>
+ <translation type="unfinished">सभी</translation>
+ </message>
+ <message>
+ <source>Today</source>
+ <translation type="unfinished">आज</translation>
+ </message>
+ <message>
+ <source>This week</source>
+ <translation type="unfinished">इस हफ़्ते</translation>
+ </message>
+ <message>
+ <source>This month</source>
+ <translation type="unfinished">इस महीने</translation>
+ </message>
+ <message>
+ <source>Last month</source>
+ <translation type="unfinished">पिछले महीने</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">इस साल</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">के साथ प्राप्त हुए</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">को भेजा</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">माइन किया</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation type="unfinished">दूसरा</translation>
+ </message>
+ <message>
+ <source>Enter address, transaction id, or label to search</source>
+ <translation type="unfinished">सर्च करने के लिए अपना पता, ट्रांज़ेक्शन आईडी या लेबल डालें</translation>
+ </message>
+ <message>
+ <source>Min amount</source>
+ <translation type="unfinished">कम से कम राशि</translation>
+ </message>
+ <message>
+ <source>Range…</source>
+ <translation type="unfinished">सीमा...</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<translation type="unfinished">&amp;कॉपी पता</translation>
</message>
@@ -2284,11 +2314,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Date</source>
- <translation type="unfinished">डेट</translation>
+ <translation type="unfinished">तारीख़</translation>
</message>
<message>
<source>Type</source>
- <translation type="unfinished">टाइप</translation>
+ <translation type="unfinished">प्रकार</translation>
</message>
<message>
<source>Label</source>
@@ -2300,7 +2330,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">निर्यात विफल हो गया है</translation>
+ <translation type="unfinished">एक्सपोर्ट नहीं हो पाया</translation>
</message>
</context>
<context>
@@ -2326,11 +2356,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;एक्सपोर्ट</translation>
+ <translation type="unfinished">निर्यात</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">मौजूदा टैब में डेटा को फ़ाइल में निर्यात करें</translation>
+ <translation type="unfinished">मौजूदा टैब में डेटा को फ़ाइल में एक्सपोर्ट करें</translation>
</message>
</context>
<context>
diff --git a/src/qt/locale/bitcoin_hr.ts b/src/qt/locale/bitcoin_hr.ts
index fc86e84d7c..e843aed672 100644
--- a/src/qt/locale/bitcoin_hr.ts
+++ b/src/qt/locale/bitcoin_hr.ts
@@ -39,11 +39,11 @@
</message>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;Izvozi</translation>
+ <translation type="unfinished">&amp;Izvezite</translation>
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">Iz&amp;brišite</translation>
+ <translation type="unfinished">&amp;Izbrišite</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Odaberite</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Adrese pošiljatelja</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adrese primatelja</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ovo su vaše Bitcoin adrese za slanje novca. Uvijek provjerite iznos i adresu primatelja prije slanja novca.</translation>
</message>
@@ -875,10 +867,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Naknada:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Prah:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Nakon naknade:</translation>
</message>
@@ -967,10 +955,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Kopirajte količinu bajtova</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopirajte sićušne iznose ("prašinu")</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopirajte ostatak</translation>
</message>
@@ -979,18 +963,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">(%1 zaključen)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">da</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ne</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Oznaka postane crvene boje ako bilo koji primatelj dobije iznos manji od trenutnog praga "prašine" (sićušnog iznosa).</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Može varirati +/- %1 satoši(ja) po inputu.</translation>
</message>
@@ -1136,14 +1108,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Stvorite prazni novčanik</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Koristi deskriptore za upravljanje scriptPubKey-a</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Deskriptor novčanik</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Koristi vanjski potpisni uređaj kao što je hardverski novčanik. Prije korištenja konfiguriraj vanjski potpisni skript u postavkama novčanika.</translation>
</message>
@@ -1156,10 +1120,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Stvorite</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Kompajlirano bez sqlite mogućnosti (potrebno za deskriptor novčanike)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Kompajlirano bez mogućnosti vanjskog potpisivanje (potrebno za vanjsko potpisivanje)</translation>
@@ -1691,18 +1651,6 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">Koristite zaseban SOCKS&amp;5 proxy kako biste dohvatili klijente preko Tora:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Font fiksne širine u tabu Pregled:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">ugrađen "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">najbliže poklapanje "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;U redu</translation>
</message>
@@ -1928,8 +1876,8 @@ Potpisivanje je moguće samo sa 'legacy' adresama. </translation>
<translation type="unfinished">PBST spremljen na disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Šalje %1 %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">vlastita adresa</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2789,10 +2737,6 @@ Za više informacija o korištenju ove konzile, utipkajte %6.
<translation type="unfinished">Inputi...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Prah:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Odaberi...</translation>
</message>
@@ -2870,10 +2814,6 @@ Napomena: Budući da se naknada računa po bajtu, naknada od "100 satošija po k
<translation type="unfinished">Kopirajte količinu bajtova</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopirajte sićušne iznose ("prašinu")</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopirajte ostatak</translation>
</message>
@@ -2904,10 +2844,6 @@ Napomena: Budući da se naknada računa po bajtu, naknada od "100 satošija po k
<translation type="unfinished">Stvara djelomično potpisanu Bitcoin transakciju (Partially Signed Bitcoin Transaction - PSBT) za upotrebu sa npr. novčanikom %1 koji nije povezan s mrežom ili sa PSBT kompatibilnim hardverskim novčanikom.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">iz novčanika '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">od %1 do '%2'</translation>
</message>
@@ -3399,10 +3335,6 @@ Napomena: Budući da se naknada računa po bajtu, naknada od "100 satošija po k
<translation type="unfinished">Indeks outputa</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certifikat nije bio ovjeren)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Trgovac</translation>
</message>
@@ -3501,10 +3433,6 @@ Napomena: Budući da se naknada računa po bajtu, naknada od "100 satošija po k
<translation type="unfinished">Poslano za</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Plaćanje samom sebi</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Rudareno</translation>
</message>
@@ -3580,10 +3508,6 @@ Napomena: Budući da se naknada računa po bajtu, naknada od "100 satošija po k
<translation type="unfinished">Poslano za</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Samom sebi</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Rudareno</translation>
</message>
@@ -3876,10 +3800,6 @@ Idi na Datoteka &gt; Otvori novčanik za učitanje novčanika.
<translation type="unfinished">Distribuirano pod MIT licencom softvera. Vidite pripadajuću datoteku %s ili %s.</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Greška kod iščitanja %s! Svi ključevi su ispravno učitani, ali transakcijski podaci ili zapisi u adresaru mogu biti nepotpuni ili netočni.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Greška u čitanju %s! Transakcijski podaci nedostaju ili su netočni. Ponovno skeniranje novčanika.</translation>
</message>
@@ -3948,10 +3868,6 @@ Idi na Datoteka &gt; Otvori novčanik za učitanje novčanika.
<translation type="unfinished">Baza blokova sadrži blok koji je naizgled iz budućnosti. Može to biti posljedica krivo namještenog datuma i vremena na vašem računalu. Obnovite bazu blokova samo ako ste sigurni da su točni datum i vrijeme na vašem računalu.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">Index bloka db sadrži legacy 'txindex'. Kako biste očistili zauzeti prostor na disku, pokrenite puni -reindex ili ignorirajte ovu grešku. Ova greška neće biti ponovno prikazana.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Iznos transakcije je premalen za poslati nakon naknade</translation>
</message>
@@ -4036,10 +3952,6 @@ Idi na Datoteka &gt; Otvori novčanik za učitanje novčanika.
<translation type="unfinished">Nije moguće pisati u podatkovnu mapu '%s'; provjerite dozvole.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">Unaprijeđenje -txindex koje za započela prijašnja verzija nije moguće završiti. Ponovno pokrenite s prethodnom verzijom ili pokrenite potpuni -reindex.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Nije moguće ponuditi specifične veze i istovremeno dati addrman da traži izlazne veze.</translation>
</message>
@@ -4376,10 +4288,6 @@ Idi na Datoteka &gt; Otvori novčanik za učitanje novčanika.
<translation type="unfinished">Indeks change outputa transakcije je izvan dometa</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakcija ima prevelik lanac memorijskog bazena</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcija mora imati barem jednog primatelja</translation>
</message>
diff --git a/src/qt/locale/bitcoin_hu.ts b/src/qt/locale/bitcoin_hu.ts
index 533e6a25ef..a2f27b94a0 100644
--- a/src/qt/locale/bitcoin_hu.ts
+++ b/src/qt/locale/bitcoin_hu.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">K&amp;iválaszt</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Küldési címek</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Fogadási címek</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ezek az Ön Bitcoin címei kifizetések küldéséhez. Mindig ellenőrizze az összeget és a fogadó címet mielőtt érméket küldene.</translation>
</message>
@@ -102,6 +94,14 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Hiba történt a címlista %1 mentésekor. Kérem próbálja újra.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Küldési címek - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Fogadó címek - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Sikertelen exportálás</translation>
</message>
@@ -706,6 +706,14 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Összes tárca bezárása</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Tárca migrálása</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Egy tárca migrálása</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">A %1 súgó megjelenítése a Bitcoin lehetséges parancssori kapcsolóinak listájával</translation>
</message>
@@ -728,7 +736,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Tárca adatai</translation>
+ <translation type="unfinished">Tárca adat</translation>
</message>
<message>
<source>Load Wallet Backup</source>
@@ -801,6 +809,14 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Fejlécek szinkronizálása (%1%)…</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Hiba a tárca létrehozása közben</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Nem sikerült új tárcát létrehozni, a program sqlite támogatás nélkül lett fordítva (követelmény a leíró tárcákhoz)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Hiba: %1</translation>
</message>
@@ -907,10 +923,6 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Díj:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Porszem:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Díj levonása után:</translation>
</message>
@@ -964,11 +976,11 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Címke &amp;másolása</translation>
+ <translation type="unfinished">C&amp;ímke másolása</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">Ö&amp;sszeg másolása</translation>
+ <translation type="unfinished">&amp;Összeg másolása</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
@@ -999,10 +1011,6 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Byte-ok másolása</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Porszem tulajdonság másolása</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Visszajáró másolása</translation>
</message>
@@ -1011,18 +1019,6 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">(%1 zárolva)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">igen</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">nem</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ez a címke pirosra változik, ha bármely fogadóhoz, a porszem határértéknél kevesebb összeg érkezik.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Eltérhet +/- %1 satoshi-val bemenetenként.</translation>
</message>
@@ -1082,6 +1078,57 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Tárca migrálása</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Biztos benne, hogy migrálja ezt a tárcát &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">A tárca migrálása átalakítja ezt a tárcát egy vagy több leíró tárcává. Egy új tárca biztonsági mentés szükséges.
+Ha ez a tárca tartalmaz bármilyen figyelő szkripteket, akkor az új tárca is tartalmazni fogja ezeket a figyelő szkripteket.
+Ha ez a tárca tartalmaz bármilyen megoldható de nem megfigyelt szkripteket, akkor az új tárca is tartalmazni fogja ezeket a szkripteket.
+
+A migrációs folyamat készít biztonsági mentést a tárcáról migrálás előtt. Ennek a biztonsági mentésnek a neve &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak és a tárca könyvtárában lesz megtalálható. Hibás migrálás esetén ebből a biztonsági mentésből a tárca visszaállítható a "Tárca visszaállítása" funkcióval.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Tárca migrálása</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">A &lt;b&gt;%1&lt;/b&gt; tárca migrálása folyamatban...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">A '%1' tárca sikeresen migrálva lett.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Figyelő szkriptek az új '%1' nevű tárcába lettek migrálva.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Megoldható de nem megfigyelt szkriptek az új '%1' nevű tárcába lettek migrálva.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migrálás meghiúsult</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migrálás sikeres</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1121,7 +1168,7 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<message>
<source>Restore wallet failed</source>
<extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">Tárca helyreállítása sikertelen</translation>
+ <translation type="unfinished">Tárca visszaállítása sikertelen</translation>
</message>
<message>
<source>Restore wallet warning</source>
@@ -1164,6 +1211,14 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Tárca létrehozása</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Egy lépés választja el az új tárcája létrehozásától!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Kérjük adjon meg egy nevet, és ha szeretné, válasszon a haladó beállítások közül</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Tárca neve</translation>
</message>
@@ -1200,14 +1255,6 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Üres tárca készítése</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Leírók használata scriptPubKey kezeléséhez</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Leíró tárca</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Külső aláíró eszköz például hardver tárca használata. Előtte konfigurálja az aláíró szkriptet a tárca beállításaiban.</translation>
</message>
@@ -1220,10 +1267,6 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Létrehozás</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">SQLite támogatás nélkül fordítva (követelmény a leíró tárca használatához)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">A program külső aláíró támogatás nélkül lett fordítva (követelmény külső aláírók használatához)</translation>
@@ -1763,18 +1806,6 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">Külön SOCKS&amp;5 proxy használata a partnerek Tor hálózaton keresztüli eléréséhez:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fix szélességű betűtípus használata az áttekintés fülön:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">beágyazott "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">legjobb találat "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Mégse</translation>
</message>
@@ -2012,8 +2043,12 @@ Aláírni csak régi típusú, egyessel kezdődő címekkel lehet.</translation>
<translation type="unfinished">PSBT lemezre mentve.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Küldés %1 to %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Küldés innen: %1 ide: %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">saját cím</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2286,6 +2321,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Válasszon ki egy partnert a részletes információk megtekintéséhez.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Az átviteli réteg verziója: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Átvitel</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">A BIP324 munkamenet azonosító hex formátumú szöveglánca, ha van.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Munkamenet azonosító</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Verzió</translation>
</message>
@@ -2515,6 +2566,21 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Outbound Address Fetch: rövid életű, címek lekérdezéséhez.</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">észlelve: partrer lehet v1 vagy v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: titkosítatlan, egyszerű szöveges átviteli protokol</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 titkosított átviteli protokol</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">a partnert nagy sávszélességű elosztónak választottuk</translation>
</message>
@@ -2930,10 +2996,6 @@ Gépeljen %5 az elérhető parancsok áttekintéséhez. Több információért a
<translation type="unfinished">Bemenetek...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Porszem:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Válasszon...</translation>
</message>
@@ -3010,10 +3072,6 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Byte-ok másolása</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Porszem tulajdonság másolása</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Visszajáró másolása</translation>
</message>
@@ -3044,10 +3102,6 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Létrehoz egy Részlegesen Aláírt Bitcoin Tranzakciót (PSBT) melyet offline %1 tárcával vagy egy PSBT kompatibilis hardver tárcával használhat.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> '%1' tárcából</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1-től '%2-ig'</translation>
</message>
@@ -3105,6 +3159,10 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Kérjük nézze át a tranzakciós javaslatot. Ez létrehoz egy részlegesen aláírt bitcoin tranzakciót (PSBT) amit elmenthet vagy kimásolhat amit később aláírhatja offline %1 tárcával vagy egy PSBT kompatibilis hardvertárcával.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 ebből a tárcából: '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Biztosan létrehozza ezt a tranzakciót?</translation>
@@ -3482,7 +3540,7 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
</message>
<message>
<source>From</source>
- <translation type="unfinished">Küldő</translation>
+ <translation type="unfinished">Innen</translation>
</message>
<message>
<source>unknown</source>
@@ -3490,7 +3548,7 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
</message>
<message>
<source>To</source>
- <translation type="unfinished">Címzett</translation>
+ <translation type="unfinished">Ide</translation>
</message>
<message>
<source>own address</source>
@@ -3563,8 +3621,8 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Kimeneti index</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(A tanúsítvány nem ellenőrzött)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (A tanúsítvány nem ellenőrzött)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3665,10 +3723,6 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Elküldve ide</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Saját részre kifizetve</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Bányászva</translation>
</message>
@@ -3744,10 +3798,6 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
<translation type="unfinished">Elküldve ide</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Saját részre</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Bányászva</translation>
</message>
@@ -3773,11 +3823,11 @@ Megjegyzés: Mivel a díj bájtonként van kiszámítva, egy "100 satoshi kvB-nk
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Címke &amp;másolása</translation>
+ <translation type="unfinished">C&amp;ímke másolása</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">Ö&amp;sszeg másolása</translation>
+ <translation type="unfinished">&amp;Összeg másolása</translation>
</message>
<message>
<source>Copy transaction &amp;ID</source>
@@ -3886,7 +3936,7 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
</message>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Új tárca készítése</translation>
+ <translation type="unfinished">Új tárca létrehozása</translation>
</message>
<message>
<source>Error</source>
@@ -3999,7 +4049,7 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<message>
<source>Wallet Data</source>
<extracomment>Name of the wallet data file format.</extracomment>
- <translation type="unfinished">Tárca adatai</translation>
+ <translation type="unfinished">Tárca adat</translation>
</message>
<message>
<source>Backup Failed</source>
@@ -4033,6 +4083,10 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">%s sérült. Próbálja meg a bitcoint-wallet tárca mentő eszközt használni, vagy állítsa helyre egy biztonsági mentésből.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s: az -assumeutxo pillanatkép állapot jóváhagyása sikertelen. Ez hardverproblémára, programhibára vagy olyan hibás módosításra utalhat a programban, ami engedélyezte az érvénytelen pillanatkép betöltését. Emiatt a csomópont most leáll és nem használ olyan állapotot ami a megadott pillanatképre épül, újraépítve a blokkláncot %d és %d között. A következő indításkor a csomópont szinkronizálni fog innen: %d figyelmen kívül hagyva minden adatot a pillanatképből. Kérjük jelentse ezt a problémát itt: %s, hozzátéve hogyan jutott a hibát okozó pillanatképhez. Az érvénytelen láncállapot pillanatkép megőrizve marad a lemezen arra az esetre, ha hasznosnak bizonyul a hiba okának feltárása során.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s kérés figyel a(z) %u porton. Ennek a portnak a megítélése "rossz" ezért valószínűtlen, hogy más partner ezen keresztül csatlakozna. Részletekért és teljes listáért lásd doc/p2p-bad-ports.md.</translation>
</message>
@@ -4061,10 +4115,6 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Hiba a tárca betöltése közben. A tárca igényli a letöltött blokkokat, de a szoftver jelenleg nem támogatja a tárcák betöltését miközben a blokkok soron kívüli letöltése zajlik feltételezett utxo pillanatképek használatával. A tárca betöltése sikerülhet amint a csomópont szinkronizálása eléri a %s magasságot.</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Hiba %s beolvasása közben. Az összes kulcs sikeresen beolvasva, de a tranzakciós adatok és a címtár rekordok hiányoznak vagy sérültek.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Hiba %s olvasásakor! A tranzakciós adatok hiányosak vagy sérültek. Tárca átfésülése folyamatban.</translation>
</message>
@@ -4133,6 +4183,10 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Ritkítás: az utolsó tárcaszinkronizálás meghaladja a ritkított adatokat. Szükséges a -reindex használata (ritkított csomópont esetében a teljes blokklánc ismételt letöltése).</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Sikertelen átnevezés: '%s' -&gt; '%s'. Ezt megoldhatja azzal, ha kézzel áthelyezi vagy törli az érvénytelen pillanatkép könyvtárat %s, különben ugyanebbe a hibába fog ütközni a következő indításkor is.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: Ismeretlen sqlite tárca séma verzió: %d. Csak az alábbi verzió támogatott: %d</translation>
</message>
@@ -4141,10 +4195,6 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">A blokk-adatbázis tartalmaz egy blokkot ami a jövőből érkezettnek látszik. Ennek oka lehet, hogy a számítógép dátum és idő beállítása helytelen. Csak akkor építse újra a blokk-adatbázist ha biztos vagy benne, hogy az időbeállítás helyes.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">A blokk index adatbázis régi típusú 'txindex'-et tartalmaz. Az elfoglalt tárhely felszabadításához futtassa a teljes -reindex parancsot, vagy hagyja figyelmen kívül ezt a hibát. Ez az üzenet nem fog újra megjelenni.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">A tranzakció összege túl alacsony az elküldéshez miután a díj levonódik</translation>
</message>
@@ -4181,6 +4231,10 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">A megadott tárca fájl formátuma "%s" ismeretlen. Kérjuk adja meg "bdb" vagy "sqlite" egyikét.</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Nem támogatott kategóriához kötött naplózási szint %1$=%2$s. Várt %1$s=&lt;category&gt;:&lt;loglevel&gt;. Érvényes kategóriák: %3$s. Érvényes naplózási szintek: %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Nem támogatott láncállapot-adatbázis formátum található. Kérjük indítsa újra -reindex-chainstate kapcsolóval. Ez újraépíti a láncállapot-adatbázist.</translation>
</message>
@@ -4189,6 +4243,10 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Tárca sikeresen létrehozva. A régi típusú tárcák elavultak ezért a régi típusú tárcák létrehozásának és megnyitásának támogatása a jövőben meg fog szűnni.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Tárca betöltése sikeres. A régi típusú tárcák elavultak ezért a régi típusú tárcák létrehozásának és megnyitásának támogatása a jövőben meg fog szűnni. Régi típusú tárcáról való áttérés leíró tárcára a migratewallet paranccsal lehetséges.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Figyelmeztetés: A dumpfájl tárca formátum (%s) nem egyezik a parancssor által megadott formátummal (%s).</translation>
</message>
@@ -4237,30 +4295,10 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Nem lehet írni a '%s' könyvtárba; ellenőrizze a jogosultságokat.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">A -txindex frissítése nem fejezhető be mivel egy korábbi verzió kezdte el. Indítsa újra az előző verziót vagy futtassa a teljes -reindex parancsot.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s: az -assumeutxo pillanatkép állapot jóváhagyása sikertelen. Ez hardverproblémára, programhibára vagy olyan hibás módosításra utalhat a programban, ami engedélyezte az érvénytelen pillanatkép betöltését. Emiatt a csomópont most leáll és nem használ olyan állapotot ami a megadott pillanatképre épül, újraépítve a blokkláncot %d és %d között. A következő indításkor a csomópont szinkronizálni fog innen: %d figyelmen kívül hagyva minden adatot a pillanatképből. Kérjük jelentse ezt a problémát itt: %s, hozzátéve hogyan jutott a hibát okozó pillanatképhez. Az érvénytelen láncállapot pillanatkép megőrizve marad a lemezen arra az esetre, ha hasznosnak bizonyul a hiba okának feltárása során.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s nagyon magasra van állítva! Ilyen magas díj akár egyetlen tranzakció költsége is lehet.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">A -reindex-chainstate összeférhetetlen a -blockfilterindex kapcsolóval. Kérjük átmenetileg tiltsa le a blockfilterindex-et amíg a -reindex-chainstate használatban van, vagy használja a -reindex-chainstate helyett a -reindex kapcsolót ami teljesen újraépíti az összes indexet.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">A -reindex-chainstate összeférhetetlen a -coinstatindex kapcsolóval. Kérjük átmenetileg tiltsa le a coinstatindex-et amíg a -reindex-chainstate használatban van, vagy használja a -reindex-chainstate helyett a -reindex kapcsolót ami teljesen újraépíti az összes indexet.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">A -reindex-chainstate összeférhetetlen a -txindex kapcsolóval. Kérjük átmenetileg tiltsa le a txindex-et amíg a -reindex-chainstate használatban van, vagy használja a -reindex-chainstate helyett a -reindex kapcsolót ami teljesen újraépíti az összes indexet.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Nem lehetséges a megadott kapcsolatok és az addrman által felderített kapcsolatok egyidejű használata.</translation>
</message>
@@ -4269,6 +4307,10 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Hiba %s betöltése közben: Külső aláíró tárca betöltése külső aláírók támogatása nélkül</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Hiba %s beolvasása közben. Az összes kulcs sikeresen beolvasva, de a tranzakciós adatok vagy a címtár rekordok hiányoznak vagy sérültek.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Hiba: A címjegyzék adatot nem lehet beazonosítani, hogy a migrált tárcákhoz tartozna</translation>
</message>
@@ -4281,6 +4323,10 @@ A "Fájl &gt; Tárca megnyitása" menüben tölthet be egyet.
<translation type="unfinished">Hiba: A tárcában lévő %s tranzakciót nem lehet beazonosítani, hogy a migrált tárcákhoz tartozna</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Sikertelen az emelt díjak becslése, mert a megerősítetlen UTXO-k hatalmas mennyiségű megerősítetlen tranzakcióktól függnek.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Az érvénytelen peers.dat fájl átnevezése sikertelen. Kérjük mozgassa vagy törölje, majd próbálja újra.</translation>
</message>
@@ -4355,10 +4401,6 @@ Kérjük próbálja futtatni a legújabb szoftver verziót.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Nem támogatott kategóriához kötött naplózási szint -loglevel=%s. Várt -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Érvényes kategóriák: %s. Érvényes naplózási szintek: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4463,14 +4505,6 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Hiba: Nem lehet kinyerni a célt az előállított scriptpubkey-ből</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Hiba: Nem sikerült figyelő tranzakció hozzáadása a figyelő tárcához</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Hiba: Nem sikerült a figyelő tranzakciók törlése</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">Hiba: Kurzor létrehozása az adatbázisba sikertelen.</translation>
</message>
@@ -4507,10 +4541,6 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Hiba: Nem áll rendelkezésre %s cím.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Hiba: Nem minden figyelő tranzakció törlése sikerült</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Hiba: Ez a tárca már használja az SQLite-t</translation>
</message>
@@ -4535,6 +4565,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Hiba: Nem sikerült beolvasni minden bejegyzést az adatbázisban.</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Hiba: Nem lehet beolvasni a tárca legfelső blokkját megadó rekordot</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Hiba: Nem sikerült a figyelő címjegyzék adat eltávolítása</translation>
</message>
@@ -4543,6 +4577,14 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Hiba: Nem sikerült rekordot írni az új tárcába</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Hiba: Nem lehet írni a megoldható tárca legfelső blokkját megadó rekordot</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Hiba: Nem lehet írni a figyelő tárca legfelső blokkját megadó rekordot</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Egyik hálózati portot sem sikerül figyelni. Használja a -listen=0 kapcsolót, ha ezt szeretné.</translation>
</message>
@@ -4551,6 +4593,10 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Indítás közben nem sikerült átfésülni a tárcát</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Indexek indítása sikertelen, a program leáll...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Adatbázis ellenőrzése sikertelen</translation>
</message>
@@ -4787,10 +4833,6 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Tartományon kívüli tranzakciós kimenet index</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">A tranzakcóhoz tartozó mempool elődlánc túl hosszú</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Legalább egy címzett kell a tranzakcióhoz</translation>
</message>
@@ -4867,14 +4909,26 @@ A tárca biztonsági mentésének visszaállítása sikertelen.</translation>
<translation type="unfinished">Ismeretlen új szabályok aktiválva (verzióbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Nem támogatott globális naplózási szint -loglevel=%s. Lehetséges értékek: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Nem támogatott globális naplózási szint %s=%s. Lehetséges értékek: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Tárca fájl létrehozása sikertelen: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates nem támogatott ezen a láncon: %s</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Nem támogatott naplózási kategória %s=%s</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Hiba: Nem sikerült hozzáadni a megfigyelt %s tranzakciót a figyelő tárcához</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">A felhasználói ügynök megjegyzés (%s) veszélyes karaktert tartalmaz.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_id.ts b/src/qt/locale/bitcoin_id.ts
index 4d900ed4d2..975959d8b5 100644
--- a/src/qt/locale/bitcoin_id.ts
+++ b/src/qt/locale/bitcoin_id.ts
@@ -3,15 +3,15 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Klik kanan untuk mengedit atau label</translation>
+ <translation type="unfinished">Klik kanan untuk mengedit alamat atau label</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">O3@outlook.co.id</translation>
+ <translation type="unfinished">Membuat alamat baru</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Salin alamat yang saat ini dipilih ke papan klip sistem</translation>
+ <translation type="unfinished">Salin alamat terpilih ke papan klip</translation>
</message>
<message>
<source>C&amp;lose</source>
@@ -30,24 +30,21 @@
<translation type="unfinished">Ekspor data di tab saat ini ke sebuah file</translation>
</message>
<message>
- <source>Choose the address to send coins to</source>
- <translation type="unfinished">Pilih alamat tujuan pengiriman koin</translation>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Ekspor
+wallet</translation>
</message>
<message>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished">Pilih alamat untuk menerima koin dengan</translation>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Hapus</translation>
</message>
<message>
- <source>C&amp;hoose</source>
- <translation type="unfinished">&amp;Choose</translation>
- </message>
- <message>
- <source>Sending addresses</source>
- <translation type="unfinished">Alamat pengirim</translation>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">Pilih alamat tujuan pengiriman koin</translation>
</message>
<message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Alamat penerima</translation>
+ <source>C&amp;hoose</source>
+ <translation type="unfinished">&amp;Choose</translation>
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
@@ -61,7 +58,7 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
</message>
<message>
<source>&amp;Copy Address</source>
- <translation type="unfinished">&amp;Copy Alamat</translation>
+ <translation type="unfinished">&amp;Salin Alamat</translation>
</message>
<message>
<source>Copy &amp;Label</source>
@@ -101,23 +98,23 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
- <translation type="unfinished">Dialog passphrase</translation>
+ <translation type="unfinished">Dialog frasa sandi</translation>
</message>
<message>
<source>Enter passphrase</source>
- <translation type="unfinished">Masukan passphrase</translation>
+ <translation type="unfinished">Masukan frasa sandi</translation>
</message>
<message>
<source>New passphrase</source>
- <translation type="unfinished">Passphrase baru</translation>
+ <translation type="unfinished">Frasa sandi baru</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Ulangi passphrase baru</translation>
+ <translation type="unfinished">Ulangi frasa sandi baru</translation>
</message>
<message>
<source>Show passphrase</source>
- <translation type="unfinished">Perlihatkan passphrase</translation>
+ <translation type="unfinished">Tampilkan frasa sandi</translation>
</message>
<message>
<source>Encrypt wallet</source>
@@ -189,11 +186,11 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Passphrase yang dimasukan tidak cocok.</translation>
+ <translation type="unfinished">Passphrase yang dimasukan tidak sesuai.</translation>
</message>
<message>
<source>Wallet unlock failed</source>
- <translation type="unfinished">Gagal membuka wallet</translation>
+ <translation type="unfinished">Gagal membuka dompet</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
@@ -374,6 +371,14 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Tutup semua dompet</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrasi dompet</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrasi sebuah dompet</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Tampilkan %1 pesan bantuan untuk mendapatkan daftar opsi baris perintah Bitcoin yang memungkinkan</translation>
</message>
@@ -394,6 +399,11 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Tidak ada wallet tersedia</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Data Dompet</translation>
+ </message>
+ <message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
<translation type="unfinished">Muat Pencadangan Dompet</translation>
@@ -403,21 +413,94 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
<translation type="unfinished">Pulihkan Dompet</translation>
</message>
+ <message>
+ <source>Wallet Name</source>
+ <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
+ <translation type="unfinished">Nama Dompet</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Jendela</translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished">Jendela Utama</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation type="unfinished">%1 klien</translation>
+ </message>
+ <message>
+ <source>&amp;Hide</source>
+ <translation type="unfinished">Sembunyi</translation>
+ </message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">Tampilkan</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n koneksi yang aktif ke jaringan Bitcoin</numerusform>
</translation>
</message>
<message>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">Klik untuk tindakan lainnya</translation>
+ </message>
+ <message>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">Tampilkan tab Rekan</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">nonaktifkan aktivitas jaringan</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">aktifkan aktivitas jaringan</translation>
+ </message>
+ <message>
<source>Pre-syncing Headers (%1%)…</source>
<translation type="unfinished">Pra-Singkronisasi Header (%1%)...</translation>
</message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Gagal saat membuat dompet</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Tidak bisa membuat dompet baru, perangkat lunak dikompilasi tanpa dukungan sqlite (yang diperlukan untuk dompet deskriptor)</translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ <message>
+ <source>Copy change</source>
+ <translation type="unfinished">Salin Perubahan</translation>
+ </message>
+ <message>
+ <source>(%1 locked)</source>
+ <translation type="unfinished">(%1 terkunci)</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(tidak ada label)</translation>
+ </message>
</context>
<context>
<name>CreateWalletActivity</name>
<message>
+ <source>Create Wallet</source>
+ <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
+ <translation type="unfinished">Bikin dompet</translation>
+ </message>
+ <message>
<source>Too many external signers found</source>
<translation type="unfinished">Terlalu banyak penanda tangan eksternal ditemukan</translation>
</message>
@@ -436,6 +519,49 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrasi dompet</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Memindahkan dompet akan mengubah dompet ini menjadi satu atau beberapa dompet deskriptor. Cadangan dompet baru perlu dibuat.
+Jika dompet ini berisi skrip yang hanya bisa dilihat, dompet baru akan dibuat yang berisi skrip tersebut.
+Jika dompet ini berisi skrip yang dapat dipecahkan tetapi tidak dapat ditonton, dompet yang berbeda dan baru akan dibuat yang berisi skrip tersebut.
+
+Proses migrasi akan mencadangkan dompet sebelum melakukan pemindahan. Fail cadangan ini akan diberi nama -.legacy.bak dan dapat ditemukan di direktori untuk dompet ini. Jika terjadi gagal pemindahan, cadangan dapat dipulihkan dengan fungsi "Pulihkan Dompet".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrasi dompet</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Memindahkan Dompet &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Dompet '%1' berhasil dipindahkan.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Skrip hanya lihat telah dimigrasikan ke dompet yang baru '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migrasi gagal</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migrasi berhasil</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -450,11 +576,6 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">wallet default</translation>
</message>
<message>
- <source>Open Wallet</source>
- <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Buka Wallet</translation>
- </message>
- <message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
<translation type="unfinished">Membuka Wallet &lt;b&gt;%1&lt;/b&gt;...</translation>
@@ -491,10 +612,6 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<context>
<name>WalletController</name>
<message>
- <source>Close wallet</source>
- <translation type="unfinished">Tutup wallet</translation>
- </message>
- <message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
<translation type="unfinished">Apakah anda yakin ingin menutup dompet &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
@@ -518,6 +635,14 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Bikin dompet</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Anda hanya selangkah lagi untuk membuat dompet baru anda!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Mohon sertakan nama, dan jika diinginkan, aktifkan pilihan lanjut apapun</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Nama Dompet</translation>
</message>
@@ -554,14 +679,6 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Buat dompet kosong</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Pakai deskriptor untuk managemen scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Dompet Deskriptor</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Gunakan perangkat penandatanganan eksternal seperti dompet perangkat keras. Konfigurasikan skrip penandatangan eksternal di preferensi dompet terlebih dahulu.</translation>
</message>
@@ -574,10 +691,6 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Membuat</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Dikompilasi tanpa support sqlite (dibutuhkan untuk dompet deskriptor)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Dikompilasi tanpa dukungan penandatanganan eksternal (diperlukan untuk penandatanganan eksternal)</translation>
@@ -961,6 +1074,10 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">&amp;Jalur skrip penanda tangan eksternal</translation>
</message>
<message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Jendela</translation>
+ </message>
+ <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Dikompilasi tanpa dukungan penandatanganan eksternal (diperlukan untuk penandatanganan eksternal)</translation>
@@ -1003,10 +1120,52 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
<translation type="unfinished">Umur</translation>
</message>
+ <message>
+ <source>Received</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
+ <translation type="unfinished">Diterima</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
+ <translation type="unfinished">Alamat</translation>
+ </message>
</context>
<context>
<name>RPCConsole</name>
<message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">Jumlah transaksi saat ini</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished">Penggunaan memori</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <translation type="unfinished">Diterima</translation>
+ </message>
+ <message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versi lapisan transportasi: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Transpor</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">String ID sesi BIP324 dalam heksadesimal, jika ada.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">ID sesi</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation type="unfinished">Versi</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">Apakah kita merelay transaksi ke peer ini.</translation>
</message>
@@ -1024,6 +1183,25 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
<translation type="unfinished">Jumlah total alamat yang diterima dari rekan ini yang dihapus (tidak diproses) karena pembatasan tarif.</translation>
</message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">Waktu blok terakhir</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">mendeteksi: peer bisa jadi v1 atau v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protokol transportasi teks biasa tanpa enkripsi</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 protokol transportasi terenkripsi</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
@@ -1043,6 +1221,17 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
<translation type="unfinished">Bech32m (BIP-350) adalah peningkatan terhadap Bech32, dukungan dompet masih terbatas.</translation>
</message>
+ <message>
+ <source>Could not unlock wallet.</source>
+ <translation type="unfinished">Tidak dapat membuka dompet.</translation>
+ </message>
+ </context>
+<context>
+ <name>RecentRequestsTableModel</name>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(tidak ada label)</translation>
+ </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -1051,6 +1240,10 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Sembunyikan</translation>
</message>
<message>
+ <source>Copy change</source>
+ <translation type="unfinished">Salin Perubahan</translation>
+ </message>
+ <message>
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
@@ -1070,7 +1263,11 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(tidak ada label)</translation>
+ </message>
+</context>
<context>
<name>TransactionDesc</name>
<message>
@@ -1091,12 +1288,27 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
</message>
</context>
<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(tidak ada label)</translation>
+ </message>
+ </context>
+<context>
<name>TransactionView</name>
<message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">File yang dipisahkan koma</translation>
</message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Alamat</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Gagal Mengekspor</translation>
+ </message>
</context>
<context>
<name>WalletFrame</name>
@@ -1120,13 +1332,27 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<context>
<name>WalletView</name>
<message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Ekspor
+wallet</translation>
+ </message>
+ <message>
<source>Export the data in the current tab to a file</source>
<translation type="unfinished">Ekspor data di tab saat ini ke sebuah file</translation>
</message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Data Dompet</translation>
+ </message>
</context>
<context>
<name>bitcoin-core</name>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s gagal memvalidasi status snapshot -assumeutxo. Ini mengindikasikan masalah perangkat keras, atau bug pada perangkat lunak, atau modifikasi perangkat lunak yang buruk yang memungkinkan snapshot yang tidak valid dimuat. Sebagai akibatnya, node akan dimatikan dan berhenti menggunakan status apa pun yang dibangun di atas snapshot, mengatur ulang tinggi rantai dari %d ke %d. Pada restart berikutnya, node akan melanjutkan sinkronisasi dari %d tanpa menggunakan data snapshot apa pun. Silakan laporkan kejadian ini ke %s, termasuk bagaimana Anda mendapatkan snapshot tersebut. Chainstate snapshot yang tidak valid akan dibiarkan di disk jika hal itu membantu dalam mendiagnosis masalah yang menyebabkan kesalahan ini.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s meminta mendengarkan di port %u. Port ini dianggap "buruk" dan oleh karena itu tidak mungkin peer lain akan terhubung kesini. Lihat doc/p2p-bad-ports.md untuk detail dan daftar lengkap.</translation>
</message>
@@ -1147,10 +1373,18 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Mode pangkas tidak kompatibel dengan -reindex-chainstate. Gunakan full -reindex sebagai gantinya.</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Penggantian nama '%s' -&gt; '%s' gagal. Anda harus menyelesaikannya dengan memindahkan atau menghapus secara manual direktori snapshot %s yang tidak valid, jika tidak, Anda akan menemukan kesalahan yang sama lagi pada startup berikutnya.</translation>
+ </message>
+ <message>
<source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
<translation type="unfinished">Ini adalah biaya transaksi maksimum yang Anda bayarkan (selain biaya normal) untuk memprioritaskan penghindaran pengeluaran sebagian daripada pemilihan koin biasa.</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Tingkat penebangan khusus kategori yang tidak didukung %1$s=%2$s. Diharapkan %1$s=&lt;kategori&gt;:&lt;loglevel&gt;. Kategori yang valid: %3$s. Tingkat pencatatan yang valid: %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Ditemukan format database chainstate yang tidak didukung. Silakan mulai ulang dengan -reindex-chainstate. Ini akan membangun kembali database chainstate.</translation>
</message>
@@ -1159,16 +1393,16 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Dompet berhasil dibuat. Jenis dompet lama tidak digunakan lagi dan dukungan untuk membuat dan membuka dompet lama akan dihapus di masa mendatang.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Opsi -reindex-chainstate tidak kompatibel dengan -blockfilterindex. Harap nonaktifkan blockfilterindex sementara saat menggunakan -reindex-chainstate, atau ganti -reindex-chainstate dengan -reindex untuk membangun kembali semua indeks sepenuhnya.</translation>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Dompet berhasil dimuat. Tipe dompet lama akan ditinggalkan dan dukungan untuk membuat dan membuka dompet ini akan dihapus di masa depan. Dompet lama dapat dimigrasikan ke dompet deskriptor dengan migratewallet.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Opsi -reindex-chainstate tidak kompatibel dengan -coinstatsindex. Harap nonaktifkan sementara coinstatsindex saat menggunakan -reindex-chainstate, atau ganti -reindex-chainstate dengan -reindex untuk membangun kembali semua indeks sepenuhnya.</translation>
+ <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">%s ditetapkan sangat tinggi! Biaya sebesar ini dapat dibayarkan dalam satu transaksi.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Opsi -reindex-chainstate tidak kompatibel dengan -txindex. Harap nonaktifkan sementara txindex saat menggunakan -reindex-chainstate, atau ganti -reindex-chainstate dengan -reindex untuk sepenuhnya membangun kembali semua indeks.</translation>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Kesalahan membaca %s! Semua kunci dibaca dengan benar, tetapi data transaksi atau metadata alamat mungkin hilang atau salah.</translation>
</message>
<message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
@@ -1183,10 +1417,22 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Kesalahan: %s transaksi di dompet tidak dapat diidentifikasi sebagai dompet yang dimigrasikan</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Gagal menghitung biaya peningkatan, karena UTXO yang belum dikonfirmasi bergantung pada kelompok besar transaksi yang belum dikonfirmasi.</translation>
+ </message>
+ <message>
+ <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <translation type="unfinished">Estimasi biaya gagal. Fallbackfee dinonaktifkan. Tunggu beberapa blok atau aktifkan %s.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Opsi yang tidak kompatibel: -dnsseed=1 secara eksplisit ditentukan, tetapi -onlynet melarang koneksi ke IPv4/IPv6</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;jumlah&gt;: '%s' (harus setidaknya biaya minrelay sebesar %s untuk mencegah transaksi macet)</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Koneksi keluar dibatasi untuk CJDNS (-onlynet=cjdns) tetapi -cjdnsreachable tidak disertakan</translation>
</message>
@@ -1211,6 +1457,18 @@ Tanda tangan hanya bisa digunakan dengan tipe alamat 'warisan'</translation>
<translation type="unfinished">Jumlah total koin yang dipilih tidak menutupi transaksi target. Silahkan izinkan input yang lain untuk secara otomatis dipilih atau masukkan lebih banyak koin secara manual.</translation>
</message>
<message>
+ <source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
+ <translation type="unfinished">Transaksi membutuhkan satu tujuan dengan nilai non-0, feerate non-0, atau input yang telah dipilih sebelumnya</translation>
+ </message>
+ <message>
+ <source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
+ <translation type="unfinished">Snapshot UTXO gagal divalidasi. Mulai ulang untuk melanjutkan pengunduhan blok awal normal, atau coba muat snapshot yang berbeda.</translation>
+ </message>
+ <message>
+ <source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
+ <translation type="unfinished">UTXO yang belum dikonfirmasi tersedia, tetapi menghabiskannya menciptakan rantai transaksi yang akan ditolak oleh mempool</translation>
+ </message>
+ <message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
The wallet might have been tampered with or created with malicious intent.
@@ -1233,10 +1491,6 @@ Silakan coba jalankan versi perangkat lunak terbaru.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Level logging khusus kategori yang tidak didukung -loglevel=%s. Diharapkan -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Kategori yang valid: %s. Level log yang valid: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -1249,26 +1503,22 @@ Unable to restore backup of wallet.</source>
Tidak dapat memulihkan cadangan dompet..</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Eror: Tidak dapat mengekstrak destinasi dari scriptpubkey yang dibuat</translation>
+ <source>Block verification was interrupted</source>
+ <translation type="unfinished">Verifikasi Blok terganggu</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Kesalahan: Tidak dapat menambahkan watchonly tx ke dompet watchonly</translation>
+ <source>Error reading configuration file: %s</source>
+ <translation type="unfinished">Kesalahan membaca file konfigurasi: %s</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Kesalahan: Tidak dapat menghapus transaksi hanya menonton</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Eror: Tidak dapat mengekstrak destinasi dari scriptpubkey yang dibuat</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">Kesalahan: Gagal membuat dompet baru yang hanya dilihat</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Kesalahan: Tidak semua txs watchonly dapat dihapus</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Kesalahan: Dompet ini sudah menggunakan SQLite</translation>
</message>
@@ -1293,10 +1543,22 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<translation type="unfinished">Kesalahan: Tidak dapat menghapus data buku alamat yang hanya dilihat</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Gagal memulai indeks, mematikan..</translation>
+ </message>
+ <message>
<source>Insufficient dbcache for block verification</source>
<translation type="unfinished">Kekurangan dbcache untuk verifikasi blok</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;jumlah&gt;: '%s' (harus minimal %s)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Jumlah yang tidak valid untuk %s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid port specified in %s: '%s'</source>
<translation type="unfinished">Port tidak valid dalam %s:'%s'</translation>
</message>
@@ -1317,6 +1579,10 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<translation type="unfinished">Tidak dapat diselesaikan input yang dipilih %s</translation>
</message>
<message>
+ <source>Specified data directory "%s" does not exist.</source>
+ <translation type="unfinished">Direktori data yang ditentukan "%s" tidak ada.</translation>
+ </message>
+ <message>
<source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
<translation type="unfinished">Tidak dapat mengalokasikan memori untuk -maxsigcachesize: '%s' MiB</translation>
</message>
@@ -1329,8 +1595,12 @@ Tidak dapat memulihkan cadangan dompet..</translation>
<translation type="unfinished">Tidak dapat membongkar dompet sebelum bermigrasi</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Level logging global yang tidak didukung -loglevel=%s. Nilai yang valid: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Tingkat penebangan global yang tidak didukung %s = %s. Nilai yang valid: %s.</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">menerima estimasi biaya basi tidak didukung pada %s rantai.</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_is.ts b/src/qt/locale/bitcoin_is.ts
index 72372fccca..6ad7445e3c 100644
--- a/src/qt/locale/bitcoin_is.ts
+++ b/src/qt/locale/bitcoin_is.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Veldu</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Veski sem senda frá sér</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Veski sem þiggja til sín</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Þetta eru Bitcoin veskin sem senda greiðslur. Skoðið ævinlega vel upphæðina og veskin sem þiggja greiðslur áður en rafmynt er send.</translation>
</message>
@@ -501,10 +493,6 @@
<translation type="unfinished">Gjald:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Ryk:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Eftirgjald:</translation>
</message>
@@ -537,10 +525,6 @@
<translation type="unfinished">Móttekið með færslugildi</translation>
</message>
<message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Þetta merki verður rautt ef einhver viðtakandi tekur við upphæð sem er lægri en núgildandi þröskuldur.</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(engin merking)</translation>
</message>
@@ -765,10 +749,6 @@
<source>Change:</source>
<translation type="unfinished">Skiptimynt:</translation>
</message>
- <message>
- <source>Dust:</source>
- <translation type="unfinished">Ryk:</translation>
- </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -858,11 +838,4 @@
<translation type="unfinished">Flytja gögn í flipanum í skrá</translation>
</message>
</context>
-<context>
- <name>bitcoin-core</name>
- <message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Villa við lestur %s! Allir lyklar fóru inn á réttan hátt, en færslugögn eða færslugildi gætu verið röng eða horfin.</translation>
- </message>
- </context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_it.ts b/src/qt/locale/bitcoin_it.ts
index 0144e463ad..83410574dd 100644
--- a/src/qt/locale/bitcoin_it.ts
+++ b/src/qt/locale/bitcoin_it.ts
@@ -7,7 +7,7 @@
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Crea un indirizzo nuovo</translation>
+ <translation type="unfinished">Crea un nuovo indirizzo</translation>
</message>
<message>
<source>&amp;New</source>
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copia negli appunti del sistema l'indirizzo attualmente selezionato</translation>
+ <translation type="unfinished">Copia l'indirizzo attualmente selezionato negli appunti di sistema</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -27,11 +27,11 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Rimuovi dalla lista l'indirizzo attualmente selezionato</translation>
+ <translation type="unfinished">Rimuovi l'indirizzo attualmente selezionato dall'elenco</translation>
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">Inserisci indirizzo o nominativo da cercare</translation>
+ <translation type="unfinished">Inserisci l'indirizzo o l'etichetta per la ricerca</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -58,14 +58,6 @@
<translation type="unfinished">Scegli</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Indirizzi d'invio</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Indirizzi di ricezione</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Questi sono i tuoi indirizzi Bitcoin per l'invio di pagamenti. Controlla sempre l'importo e l'indirizzo del beneficiario prima di inviare bitcoin.</translation>
</message>
@@ -102,6 +94,14 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Si è verificato un errore nel salvare l'elenco degli indirizzi su %1. Provare di nuovo.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Invio indirizzi - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Ricezione indirizzi - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Esportazione Fallita</translation>
</message>
@@ -299,6 +299,14 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">sconosciuto</translation>
</message>
<message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Font default di sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizzato...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Importo</translation>
</message>
@@ -684,6 +692,14 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Chiudi tutti i portafogli</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migra Portafoglio</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migra un portafoglio</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Mostra il messaggio di aiuto di %1 per ottenere una lista di opzioni di comando per Bitcoin</translation>
</message>
@@ -772,6 +788,14 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Pre-sincronizzazione intestazioni (%1%)…</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Errore creazione portafoglio</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Impossibile creare un nuovo portafoglio, il software è stato compilato senza supporto sqlite (richiesto per i portafogli descrittori)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Errore: %1</translation>
</message>
@@ -878,10 +902,6 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Commissione:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvere:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Dopo Commissione:</translation>
</message>
@@ -970,10 +990,6 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Copia byte</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copia polvere</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copia resto</translation>
</message>
@@ -982,14 +998,6 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">(%1 bloccato)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">sì</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Questa etichetta diventa rossa se uno qualsiasi dei destinatari riceve un importo inferiore alla soglia minima di polvere.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Può variare di +/- %1 satoshi per input.</translation>
</message>
@@ -1049,6 +1057,57 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrare portafoglio</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Sei sicuro di voler migrare il portafoglio &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">La migrazione del portafoglio convertirà questo portafoglio in uno o più portafogli descrittori. Dovrà essere eseguito un nuovo backup del portafoglio.
+Se questo portafoglio contiene script di sola lettura, verrà generato un nuovo portafoglio che contiene quegli scripts di sola lettura.
+Se questo portafoglio contiene script risolvibili ma non osservati, verrà creato un portafoglio nuovo differente, per contenere questi script.
+
+Il processo di migrazione creerà un backup del portafoglio prima della migrazione. Questo file di backup verrà chiamato &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak e verrà collocato nella stessa cartella di questo portafoglio. Se la migrazione non andasse a buon fine, il backup può essere ripristinato con la funzionalità "Ripristina Portafoglio".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migra Wallet</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrando il Portafoglio &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Portafoglio '%1' migrato con successo.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Gli script di sola lettura sono stati migrati su un nuovo wallet chiamato '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Gli script risolvibili ma non monitorati sono stati migrati su un nuovo wallet chiamato '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migrazione fallita</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migrazione Riuscita</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1131,6 +1190,14 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Crea Portafoglio</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Ti manca un ultimo passo per creare il tuo nuovo portafoglio!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Fornisci un nome e, ove desiderato, attiva le opzioni avanzate</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Nome Portafoglio</translation>
</message>
@@ -1167,14 +1234,6 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Crea Portafoglio Vuoto</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Usa descrittori per la gestione degli scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Descrittore Portafoglio</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Usa un dispositivo esterno di firma come un portafoglio hardware. Configura lo script esterno per la firma nelle preferenze del portafoglio.</translation>
</message>
@@ -1187,10 +1246,6 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Crea</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilato senza il supporto per sqlite (richiesto per i descrittori portafoglio)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Compilato senza supporto per firma esterna (richiesto per firma esterna)</translation>
@@ -1522,6 +1577,10 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Riduci ad icona invece di uscire dall'applicazione quando la finestra viene chiusa. Attivando questa opzione l'applicazione terminerà solo dopo aver selezionato Esci dal menu File.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Font nella scheda Panoramica:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Le azioni da riga di comando hanno precedenza su quelle impostate da questo pannello:</translation>
</message>
@@ -1738,14 +1797,6 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">Usa un proxy SOCKS&amp;5 separato per raggiungere peers attraverso i Tor onion services.</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Font Monospaced nella tab di Overview</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">corrispondenza più vicina "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Cancella</translation>
</message>
@@ -1983,8 +2034,12 @@ E' possibile firmare solo con indirizzi di tipo "legacy".</translation>
<translation type="unfinished">PSBT salvata su disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * Invia %1 a %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Invia %1 a %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">proprio indirizzo</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2242,6 +2297,22 @@ Se ricevi questo errore, dovresti richiedere al commerciante di fornire un URI c
<translation type="unfinished">Seleziona un peer per visualizzare informazioni più dettagliate.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versione del livello di trasporto (transport layer): %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Trasporto</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">La stringa dell' ID sessione BIP324 nell'hex, se presente.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">ID Sessione</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Versione</translation>
</message>
@@ -2463,6 +2534,21 @@ Se ricevi questo errore, dovresti richiedere al commerciante di fornire un URI c
<translation type="unfinished">Trova l’indirizzo in uscita: a vita breve, per richiedere indirizzi</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">rilevamento: il peer potrebbe essere v1 o v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: non criptato, protocollo di trasporto testo semplice</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: protocollo di trasporto criptato BIP324 </translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">Abbiamo selezionato il peer per il relay a banda larga </translation>
</message>
@@ -2517,6 +2603,10 @@ Se ricevi questo errore, dovresti richiedere al commerciante di fornire un URI c
<translation type="unfinished">Ctrl+W</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Finestra nodi - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Esecuzione del comando usando il portafoglio "%1"</translation>
</message>
@@ -2859,10 +2949,6 @@ Per ulteriori informazioni su come usare la console, premi %6.
<translation type="unfinished">Input...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Polvere:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Scegli...</translation>
</message>
@@ -2939,10 +3025,6 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">Copia byte</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copia polvere</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copia resto</translation>
</message>
@@ -2973,10 +3055,6 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">Crea una Transazione Bitcoin Parzialmente Firmata (PSBT) da utilizzare con ad es. un portafoglio %1 offline o un portafoglio hardware compatibile con PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">dal portafoglio '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 a %2</translation>
</message>
@@ -3030,6 +3108,10 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">Per favore, controlla la tua proposta di transazione. Questo produrrà una Partially Signed Bitcoin Transaction (PSBT) che puoi salvare o copiare e quindi firmare con es. un portafoglio %1 offline o un portafoglio hardware compatibile con PSBT.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 dal wallet '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Vuoi creare questa transazione?</translation>
@@ -3490,8 +3572,8 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">Indice di output</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Il certificato non è stato verificato)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Il certificato non è stato verificato)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3592,10 +3674,6 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">Inviato a</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pagamento a te stesso</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Ottenuto dal mining</translation>
</message>
@@ -3671,10 +3749,6 @@ Nota: poiché la commissione è calcolata su base per byte, una commissione di "
<translation type="unfinished">Inviato a</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">A te stesso</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Ottenuto dal mining</translation>
</message>
@@ -3956,6 +4030,10 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">%s corrotto. Prova a usare la funzione del portafoglio bitcoin-wallet per salvare o recuperare il backup.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s non è riuscito a validare la data dello snapshot -assumeutxo. Ciò indica un errore hardware, o un bug nel software, o una cattiva modifica del software che ha permesso allo snapshot invalido di essere caricato. Di conseguenza, il nodo verrà spento e smetterà di utilizzare qualunque stato costruito sullo snapshot, reimpostando l'altezza della catena da %d a %d. Al prossimo riavvio, il nodo riprenderà la sincronizzazione da %d senza usare alcun dato dello snapshot. Per favore segnala questo incidente a %s, includendo come hai ottenuto lo snapshot. Il chainstate dello snapshot invalido rimarrà sul disco nel caso in cui tornasse utile per indagare la causa dell'errore.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s richiede di ascoltare sulla porta %u. Questa porta è considerata "cattiva" e quindi è improbabile che un peer vi si connetta. Vedere doc/p2p-bad-ports.md per i dettagli e un elenco completo.</translation>
</message>
@@ -3984,10 +4062,6 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Errore nel caricamento del portafoglio. Il portafoglio richiede il download dei blocchi e il software non supporta attualmente il caricamento dei portafogli mentre i blocchi vengono scaricati in ordine sparso quando si utilizzano gli snapshot di assumeutxo. Il portafoglio dovrebbe poter essere caricato con successo dopo che la sincronizzazione del nodo ha raggiunto l'altezza %s.</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Errore lettura %s! Tutte le chiavi sono state lette correttamente, ma i dati delle transazioni o della rubrica potrebbero essere mancanti o non corretti.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Errore nella lettura di %s! I dati della transazione potrebbero essere mancanti o errati. Nuova scansione del portafoglio in corso.</translation>
</message>
@@ -4056,6 +4130,10 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Epurazione: l'ultima sincronizzazione del portafoglio risulta essere precedente alla eliminazione dei dati per via della modalità epurazione. È necessario eseguire un -reindex (scaricare nuovamente la catena di blocchi in caso di nodo epurato).</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Rinomina di '%s'-&gt; '%s' fallita. Potresti risolvere il problema spostando manualmente o eliminando la cartella di snapshot invalida %s, altrimenti potrai incontrare ancora lo stesso errore al prossimo avvio.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: Versione dello schema del portafoglio sqlite sconosciuta %d. Solo la versione %d è supportata</translation>
</message>
@@ -4064,10 +4142,6 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Il database dei blocchi contiene un blocco che sembra provenire dal futuro. Questo può essere dovuto alla data e ora del tuo computer impostate in modo scorretto. Ricostruisci il database dei blocchi se sei certo che la data e l'ora sul tuo computer siano corrette</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">Il database dell'indice dei blocchi contiene un 'txindex' obsoleto. Per liberare lo spazio occupato sul disco, esegui un -reindex completo, altrimenti ignora questo errore. Questo messaggio di errore non verrà più visualizzato.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">L'importo della transazione risulta troppo basso per l'invio una volta dedotte le commissioni.</translation>
</message>
@@ -4104,6 +4178,10 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Il formato “%s” del file portafoglio fornito non è riconosciuto. si prega di fornire uno che sia “bdb” o “sqlite”. </translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Livello di logging specifico per categoria %1$s=%2$s non supportato. Previsto %1$s=&lt;category&gt;:&lt;loglevel&gt;. Categorie valide: %3$s. Livelli di log validi: %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Formato del database chainstate non supportato. Riavviare con -reindex-chainstate. In questo modo si ricostruisce il database dello stato della catena.</translation>
</message>
@@ -4112,6 +4190,10 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Portafoglio creato con successo. Il tipo di portafoglio legacy è stato deprecato e il supporto per la creazione e l'apertura di portafogli legacy sarà rimosso in futuro.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Portafoglio caricato con successo. Il portafoglio di tipo legacy è deprecato e verrà rimosso il supporto per creare e aprire portafogli legacy in futuro. I portafogli legacy possono essere migrati a un portafoglio descrittore con migratewallet.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Attenzione: il formato “%s” del file dump di portafoglio non combacia con il formato “%s” specificato nella riga di comando.</translation>
</message>
@@ -4160,30 +4242,10 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Impossibile scrivere nella directory dei dati ' %s'; controlla le autorizzazioni.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">L'upgrade -txindex avviato su una versione precedente non può essere completato. Riavviare con la versione precedente o eseguire un -reindex completo.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s non è riuscito a convalidare lo stato dell'istantanea -assumeutxo. Questo indica un problema hardware, un bug nel software o una modifica errata del software che ha permesso di caricare un'istantanea non valida. Di conseguenza, il nodo si spegnerà e smetterà di usare qualsiasi stato costruito sull'istantanea, azzerando l'altezza della catena da %d a %d. Al successivo riavvio, il nodo riprenderà la sincronizzazione da %d senza utilizzare i dati dell'istantanea. Per cortesia segnala l'incidente a %s, indicando anche come si è ottenuta l'istantanea. Lo stato della catena di istantanee non valido è stato lasciato sul disco nel caso in cui sia utile per diagnosticare il problema che ha causato questo errore.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s è impostato molto alto! Commissioni così alte potrebbero essere pagate su una singola transazione.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'opzione -reindex-chainstate non è compatibile con -blockfilterindex. Disattivare temporaneamente blockfilterindex mentre si usa -reindex-chainstate, oppure sostituire -reindex-chainstate con -reindex per ricostruire completamente tutti gli indici.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'opzione -reindex-chainstate non è compatibile con -coinstatsindex. Si prega di disabilitare temporaneamente coinstatsindex mentre si usa -reindex-chainstate, oppure di sostituire -reindex-chainstate con -reindex per ricostruire completamente tutti gli indici.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">L'opzione -reindex-chainstate non è compatibile con -txindex. Si prega di disabilitare temporaneamente txindex mentre si usa -reindex-chainstate, oppure di sostituire -reindex-chainstate con -reindex per ricostruire completamente tutti gli indici.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Non e' possibile fornire connessioni specifiche e contemporaneamente usare addrman per trovare connessioni uscenti. </translation>
</message>
@@ -4192,6 +4254,10 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Errore caricando %s: il wallet del dispositivo esterno di firma é stato caricato senza che il supporto del dispositivo esterno di firma sia stato compilato.</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Errore durante la lettura di %s! Tutte le chiavi lette correttamente, ma i dati della transazione o metadati potrebbero essere mancanti o incorretti.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Errore: I dati della rubrica nel portafoglio non possono essere identificati come appartenenti a portafogli migrati</translation>
</message>
@@ -4204,6 +4270,10 @@ Vai su File &gt; Apri Portafoglio per caricare un portafoglio.
<translation type="unfinished">Errore: La transazione %s nel portafoglio non può essere identificata come appartenente ai portafogli migrati.</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Impossibile calcolare il salto di commissioni, poiché gli UTXO non confermati dipendono da una enorme serie di transazioni non confermate.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Mancata rinominazione del file peers.dat non valido. Per favore spostarlo o eliminarlo e provare di nuovo.</translation>
</message>
@@ -4278,10 +4348,6 @@ Provare a eseguire l'ultima versione del software.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Livello di log specifico della categoria non supportato -loglevel=%s. Atteso -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Categorie valide: %s. Livelli di log validi: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4334,6 +4400,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Il dumpfile %s non esiste.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Errore nel completamento della db txn per rimuovere transazioni dal wallet</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Errore di creazione %s</translation>
</message>
@@ -4382,16 +4452,12 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Si è verificato un errore leggendo la voce successiva dal database del portafogli elettronico</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Errore: Impossibile estrarre la destinazione dalla scriptpubkey generata</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Errore: Impossibile aggiungere la transazione in sola consultazione al wallet in sola consultazione</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Errore nell'inizializzazione della db txn per rimuovere transazioni dal wallet</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Errore: Non in grado di rimuovere le transazioni di sola lettura</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Errore: Impossibile estrarre la destinazione dalla scriptpubkey generata</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4430,10 +4496,6 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Errore: Nessun %s indirizzo disponibile</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Errore: Non è stato possibile cancellare tutte le transazioni in sola consultazione</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Errore: Questo portafoglio utilizza già SQLite</translation>
</message>
@@ -4458,6 +4520,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Errore: Non in grado di leggere tutti i record nel database</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Errore: Impossibile leggere il salvataggio del localizzatore del miglior blocco del wallet</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Errore: Impossibile rimuovere i dati della rubrica degli indirizzi in sola consultazione</translation>
</message>
@@ -4466,6 +4532,22 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Errore: non è possibile scrivere la voce nel nuovo portafogli elettronico</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Errore: Impossibile scrivere un localizzatore risolvibile del miglior blocco del wallet</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Errore: Impossibile scrivere il localizzatore di sola lettura del miglior blocco del wallet</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Errore: copia rubrica fallita per il wallet %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Errore: la transazione database non può essere eseguita per il portafoglio %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Nessuna porta disponibile per l'ascolto. Usa -listen=0 se vuoi procedere comunque.</translation>
</message>
@@ -4474,10 +4556,18 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Impossibile ripetere la scansione del portafoglio durante l'inizializzazione</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Impossibile inizializzare gli indici, spegnimento...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Errore nella verifica del database</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">La rimozione della transazione è fallita: %s</translation>
+ </message>
+ <message>
<source>Ignoring duplicate -wallet %s.</source>
<translation type="unfinished">Ignorando il duplicato -wallet %s.</translation>
</message>
@@ -4694,6 +4784,10 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Questo è il costo di transazione che pagherai se invii una transazione.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">La transazione %s non appartiene a questo portafoglio</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Importo transazione troppo piccolo</translation>
</message>
@@ -4706,10 +4800,6 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">La transazione cambia l' indice dell'output fuori dal limite.</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">La transazione ha una sequenza troppo lunga nella mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">La transazione deve avere almeno un destinatario</translation>
</message>
@@ -4786,14 +4876,30 @@ Non in grado di ripristinare il backup del portafoglio.</translation>
<translation type="unfinished">Nuove regole non riconosciute sono state attivate (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Livello di registrazione globale non supportato -loglevel=1%s. Valore valido: 1%s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Livello di logging globale non supportato %s=%s. Regole valide: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Creazione del file wallet fallita: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates non è supportato sulla catena %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Categoria di registrazione non supportata %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Errore: Non è stato possibile aggiungere la transazione di sola lettura %s al wallet di sola lettura</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Errore: Non è stato possibile eliminare le transazioni di sola lettura</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Il commento del User Agent (%s) contiene caratteri non sicuri.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ja.ts b/src/qt/locale/bitcoin_ja.ts
index 5fb072d8c6..bdd23b7c04 100644
--- a/src/qt/locale/bitcoin_ja.ts
+++ b/src/qt/locale/bitcoin_ja.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">選択(&amp;C)</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">送金先アドレス</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">受取用アドレス</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">これらは、あなたが知っている送信先の Bitcoin アドレスです。コインを送る前に必ず、金額と受取用アドレスを確認してください。</translation>
</message>
@@ -99,7 +91,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>There was an error trying to save the address list to %1. Please try again.</source>
<extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
- <translation type="unfinished">トランザクション履歴を %1 へ保存する際にエラーが発生しました。再試行してください。</translation>
+ <translation type="unfinished">取引履歴を %1 へ保存する際にエラーが発生しました。再試行してください。</translation>
+ </message>
+ <message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">送信アドレス - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">受信アドレス - %1</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -161,7 +161,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Confirm wallet encryption</source>
- <translation type="unfinished">ウォレットの暗号化の承諾</translation>
+ <translation type="unfinished">ウォレットの暗号化の確認</translation>
</message>
<message>
<source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
@@ -173,12 +173,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet encrypted</source>
- <translation type="unfinished">ウォレットの暗号化の完了</translation>
+ <translation type="unfinished">ウォレットは暗号化されました</translation>
</message>
<message>
<source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">新しいウォレットのパスフレーズを入力してください。
-パスフレーズは、ランダムな10文字以上の文字か、8語以上の単語を使用してください。</translation>
+ <translation type="unfinished">新しいウォレットのパスフレーズを入力してください。&lt;br/&gt;パスフレーズは、&lt;b&gt;ランダムな10文字以上の文字&lt;/b&gt;か、&lt;b&gt;8語以上の単語&lt;/b&gt;を使用してください。</translation>
</message>
<message>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
@@ -272,8 +271,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Internal error</source>
- <translation type="unfinished">内部エラー
-:あなたの問題ではありません</translation>
+ <translation type="unfinished">内部エラー</translation>
</message>
<message>
<source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
@@ -353,19 +351,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 d</source>
- <translation type="unfinished">%1日</translation>
+ <translation type="unfinished">%1 日</translation>
</message>
<message>
<source>%1 h</source>
- <translation type="unfinished">%1時間</translation>
+ <translation type="unfinished">%1 時間</translation>
</message>
<message>
<source>%1 m</source>
- <translation type="unfinished">%1分</translation>
+ <translation type="unfinished">%1 分</translation>
</message>
<message>
<source>%1 s</source>
- <translation type="unfinished">%1秒</translation>
+ <translation type="unfinished">%1 秒</translation>
</message>
<message>
<source>None</source>
@@ -373,7 +371,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 ms</source>
- <translation type="unfinished">%1ミリ秒</translation>
+ <translation type="unfinished">%1 ミリ秒</translation>
</message>
<message numerus="yes">
<source>%n second(s)</source>
@@ -396,7 +394,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
- <numerusform>%n 日々</numerusform>
+ <numerusform>%n 日</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -407,7 +405,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 and %2</source>
- <translation type="unfinished">%1 %2</translation>
+ <translation type="unfinished">%1 と %2</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
@@ -481,7 +479,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Network activity disabled.</source>
<extracomment>A substring of the tooltip.</extracomment>
- <translation type="unfinished">ネットワーク活動は無効化されました。</translation>
+ <translation type="unfinished">ネットワーク活動は停止されました。</translation>
</message>
<message>
<source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
@@ -513,7 +511,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">ウォレットを暗号化…(&amp;E)</translation>
+ <translation type="unfinished">ウォレットを暗号化(&amp;E)…</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -521,15 +519,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">ウォレットをバックアップ…(&amp;B)</translation>
+ <translation type="unfinished">ウォレットをバックアップ(&amp;B)…</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">パスフレーズを変更…(&amp;C)</translation>
+ <translation type="unfinished">パスフレーズを変更(&amp;C)…</translation>
</message>
<message>
<source>Sign &amp;message…</source>
- <translation type="unfinished">メッセージを署名…(&amp;m)</translation>
+ <translation type="unfinished">メッセージに署名(&amp;m)…</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
@@ -537,7 +535,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Verify message…</source>
- <translation type="unfinished">メッセージを検証…(&amp;V)</translation>
+ <translation type="unfinished">メッセージを検証(&amp;V)…</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
@@ -545,11 +543,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">PSBTをファイルから読む…(&amp;L)</translation>
+ <translation type="unfinished">PSBTをファイルから読む(&amp;L)…</translation>
</message>
<message>
<source>Open &amp;URI…</source>
- <translation type="unfinished">URIを開く…(&amp;U)</translation>
+ <translation type="unfinished">URIを開く(&amp;U)…</translation>
</message>
<message>
<source>Close Wallet…</source>
@@ -585,7 +583,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Synchronizing with network…</source>
- <translation type="unfinished">ネットワークに同期中……</translation>
+ <translation type="unfinished">ネットワークに同期中…</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
@@ -655,7 +653,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
- <translation type="unfinished">部分的に署名されたビットコインのトランザクションを読み込み</translation>
+ <translation type="unfinished">部分的に署名されたBitcoinの取引を読み込む</translation>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
@@ -663,7 +661,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
- <translation type="unfinished">部分的に署名されたビットコインのトランザクションをクリップボードから読み込み</translation>
+ <translation type="unfinished">部分的に署名されたBitcoinの取引をクリップボードから読み込む</translation>
</message>
<message>
<source>Node window</source>
@@ -712,12 +710,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">全てのウォレットを閉じる</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">ウォレットの移行</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">ウォレットの移行</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">%1 のヘルプ メッセージを表示し、使用可能な Bitcoin のコマンドラインオプション一覧を見る。</translation>
</message>
<message>
<source>&amp;Mask values</source>
- <translation type="unfinished">&amp;値を隠す</translation>
+ <translation type="unfinished">値を隠す (&amp;M)</translation>
</message>
<message>
<source>Mask the values in the Overview tab</source>
@@ -729,7 +735,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>No wallets available</source>
- <translation type="unfinished">ウォレットは利用できません</translation>
+ <translation type="unfinished">利用できるウォレットがありません</translation>
</message>
<message>
<source>Wallet Data</source>
@@ -744,7 +750,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Restore Wallet</source>
<extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">ウォレットを復</translation>
+ <translation type="unfinished">ウォレットを復元</translation>
</message>
<message>
<source>Wallet Name</source>
@@ -769,23 +775,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">隠す</translation>
+ <translation type="unfinished">隠す (&amp;H)</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">表示</translation>
+ <translation type="unfinished">表示 (&amp;h)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n ビットコイン ネットワークへのアクティブな接続。</numerusform>
+ <numerusform>Bitcoinネットワークへの %n のアクティブな接続。</numerusform>
</translation>
</message>
<message>
<source>Click for more actions.</source>
<extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">クリックして、より多くのアクションを表示。</translation>
+ <translation type="unfinished">クリックして、さらにアクションを表示。</translation>
</message>
<message>
<source>Show Peers tab</source>
@@ -795,16 +801,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Disable network activity</source>
<extracomment>A context menu item.</extracomment>
- <translation type="unfinished">ネットワーク活動を無効化する</translation>
+ <translation type="unfinished">ネットワーク活動を停止する</translation>
</message>
<message>
<source>Enable network activity</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
- <translation type="unfinished">ネットワーク活動を有効化する</translation>
+ <translation type="unfinished">ネットワーク活動を開始する</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">事前同期ヘッダー (%1%)…</translation>
+ <translation type="unfinished">ヘッダーを事前同期中 (%1 %)…</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">ウォレットの作成に失敗</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">新しいウォレットを作成できません。このソフトウェアは sqlite のサポート (ディスクリプターウォレットに必要) なしでコンパイルされています </translation>
</message>
<message>
<source>Error: %1</source>
@@ -852,11 +866,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Sent transaction</source>
- <translation type="unfinished">送金取引</translation>
+ <translation type="unfinished">送信済み取引</translation>
</message>
<message>
<source>Incoming transaction</source>
- <translation type="unfinished">入金取引</translation>
+ <translation type="unfinished">受信中の取引</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
@@ -913,10 +927,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手数料:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">ダスト:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">手数料差引後金額:</translation>
</message>
@@ -942,11 +952,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Received with label</source>
- <translation type="unfinished">対応するラベル</translation>
+ <translation type="unfinished">ラベル</translation>
</message>
<message>
<source>Received with address</source>
- <translation type="unfinished">対応するアドレス</translation>
+ <translation type="unfinished">アドレス</translation>
</message>
<message>
<source>Date</source>
@@ -954,7 +964,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Confirmations</source>
- <translation type="unfinished">検証数</translation>
+ <translation type="unfinished">承認数</translation>
</message>
<message>
<source>Confirmed</source>
@@ -978,7 +988,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
- <translation type="unfinished">取引IDとアウトプットのインデックスをコピー</translation>
+ <translation type="unfinished">取引IDとアウトプットのインデックスをコピー(&amp;I)</translation>
</message>
<message>
<source>L&amp;ock unspent</source>
@@ -990,7 +1000,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy quantity</source>
- <translation type="unfinished">選択数をコピー</translation>
+ <translation type="unfinished">金額をコピー</translation>
</message>
<message>
<source>Copy fee</source>
@@ -1005,10 +1015,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">バイト数をコピー</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">ダストをコピー</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">お釣りをコピー</translation>
</message>
@@ -1017,18 +1023,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(ロック済み %1個)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">はい</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">いいえ</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">受取額が現在のダスト閾値を下回るアドレスがひとつでもあると、このラベルが赤くなります。</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">インプット毎に %1 satoshi 前後変動する場合があります。</translation>
</message>
@@ -1038,11 +1032,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>change from %1 (%2)</source>
- <translation type="unfinished">%1 (%2) からのおつり</translation>
+ <translation type="unfinished">%1 (%2) からのお釣り</translation>
</message>
<message>
<source>(change)</source>
- <translation type="unfinished">(おつり)</translation>
+ <translation type="unfinished">(お釣り)</translation>
</message>
</context>
<context>
@@ -1063,7 +1057,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Create wallet warning</source>
- <translation type="unfinished">ウォレットを作成 - 警告</translation>
+ <translation type="unfinished">ウォレット作成の警告</translation>
</message>
<message>
<source>Can't list signers</source>
@@ -1088,14 +1082,65 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">ウォレットを移行する</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">ウォレット &lt;i&gt;%1&lt;/i&gt; を移行してもよろしいですか?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">ウォレットを移行すると、このウォレットが 1 つ以上のディスクリプターウォレットに変換されます。 新しいウォレットのバックアップを作成する必要があります。
+このウォレットに監視専用スクリプトが含まれている場合、それらの監視専用スクリプトを含む新しいウォレットが作成されます。
+このウォレットに解決可能だが監視されないスクリプトが含まれている場合、それらのスクリプトを含む別の新しいウォレットが作成されます。
+
+移行プロセスでは、移行前にウォレットのバックアップが作成されます。 このバックアップ ファイルの名前は &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak で、元のウォレットのディレクトリにあります。 間違った移行が発生した場合は、「ウォレットの復元」機能を使用してバックアップから復元できます。</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">ウォレットを移行する</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">ウォレット &lt;b&gt;%1&lt;/b&gt; を移行中…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">ウォレット '%1' の移行が完了しました。</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">監視専用スクリプトは’%1’という名前の新しいウォレットに移行されました。</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">解決可能だが監視されないスクリプトは '%1' という名前の新しいウォレットに移行されました。</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">移行に失敗しました</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">移行に成功しました</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
- <translation type="unfinished">ウォレットを開くことに失敗しました</translation>
+ <translation type="unfinished">ウォレットを開けませんでした</translation>
</message>
<message>
<source>Open wallet warning</source>
- <translation type="unfinished">ウォレットを開く - 警告</translation>
+ <translation type="unfinished">ウォレットの起動に関する警告</translation>
</message>
<message>
<source>default wallet</source>
@@ -1109,7 +1154,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
- <translation type="unfinished">ウォレットを開いています &lt;b&gt;%1&lt;/b&gt;…</translation>
+ <translation type="unfinished">ウォレット &lt;b&gt;%1&lt;/b&gt; を開いています…</translation>
</message>
</context>
<context>
@@ -1117,12 +1162,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Restore Wallet</source>
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">ウォレットを復</translation>
+ <translation type="unfinished">ウォレットを復元</translation>
</message>
<message>
<source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">ウォレットの復元 &lt;b&gt;%1&lt;/b&gt;...</translation>
+ <translation type="unfinished">ウォレット &lt;b&gt;%1&lt;/b&gt; を復元中...</translation>
</message>
<message>
<source>Restore wallet failed</source>
@@ -1137,7 +1182,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Restore wallet message</source>
<extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">ウォレット メッセージの復元</translation>
+ <translation type="unfinished">ウォレットの復元に関するメッセージ</translation>
</message>
</context>
<context>
@@ -1152,7 +1197,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
- <translation type="unfinished">ブロックファイル剪定が有効の場合、長期間ウォレットを起動しないと全チェーンを再度同期させる必要があるかもしれません。</translation>
+ <translation type="unfinished">ブロックファイルの剪定が有効の場合、長期間ウォレットを起動しないと全チェーンを再度同期させる必要があるかもしれません。</translation>
</message>
<message>
<source>Close all wallets</source>
@@ -1170,6 +1215,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ウォレットを作成する</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">新しいウォレットの作成まであと一歩です!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">名前を入力し、必要に応じて詳細オプションを有効にしてください</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">ウォレット名</translation>
</message>
@@ -1179,7 +1232,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">ウォレットを暗号化。ウォレットは任意のパスフレーズによって暗号化されます。</translation>
+ <translation type="unfinished">ウォレットを暗号化します。ウォレットは任意のパスフレーズによって暗号化されます。</translation>
</message>
<message>
<source>Encrypt Wallet</source>
@@ -1191,7 +1244,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">このウォレットの秘密鍵を無効にします。秘密鍵が無効になっているウォレットには秘密鍵はなく、HDシードまたはインポートされた秘密鍵を持つこともできません。これはウォッチ限定のウォレットに最適です。</translation>
+ <translation type="unfinished">このウォレットの秘密鍵を無効にします。秘密鍵が無効になっているウォレットには秘密鍵はなく、HDシードまたはインポートされた秘密鍵を持つこともできません。これは監視専用のウォレットに最適です。</translation>
</message>
<message>
<source>Disable Private Keys</source>
@@ -1206,16 +1259,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">空ウォレットを作成</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">scriptPubKeyの管理にDescriptorを使用します</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Descriptorウォレット</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
- <translation type="unfinished">外部署名デバイスであるハードウェアウォレットを使ってください。最初に外部署名プログラム(HWI)をウォレットのオプションに設定してください。</translation>
+ <translation type="unfinished">外部署名デバイスであるハードウェアウォレットを使います。最初に外部署名プログラム(HWI)をウォレットのオプションに設定してください。</translation>
</message>
<message>
<source>External signer</source>
@@ -1226,13 +1271,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">作成</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">(Descriptorウォレットに必要な)sqliteサポート無しでコンパイル</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">外部署名なしで処理されました (外部署名が必要です)</translation>
+ <translation type="unfinished">外部署名のサポート(外部署名に必要)なしでコンパイルされています </translation>
</message>
</context>
<context>
@@ -1251,7 +1292,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
- <translation type="unfinished">このアドレス帳項目のアドレス。アドレスは送金先アドレスの場合のみ編集することができます。</translation>
+ <translation type="unfinished">このアドレス帳項目のアドレス。これは送金先アドレスの場合のみ編集することができます。</translation>
</message>
<message>
<source>&amp;Address</source>
@@ -1302,7 +1343,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
- <translation type="unfinished">ディレクトリが既に存在します。新しいディレクトリを作りたい場合は %1 と追記してください。</translation>
+ <translation type="unfinished">ディレクトリが既に存在します。新しいディレクトリを作りたい場合は %1 を追記してください。</translation>
</message>
<message>
<source>Path already exists, and is not a directory.</source>
@@ -1330,7 +1371,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
- <numerusform>(完全なチェーンには%n GB必要です)</numerusform>
+ <numerusform>(完全なチェーンには %n GB必要)</numerusform>
</translation>
</message>
<message>
@@ -1393,6 +1434,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">この初回同期には多大なリソースを消費し、あなたのコンピュータでこれまで見つからなかったハードウェア上の問題が発生する場合があります。%1 を実行する度に、中断された時点からダウンロードを再開します。</translation>
</message>
<message>
+ <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
+ <translation type="unfinished">[OK] をクリックすると、%1 は %4 が最初に起動されたときの %3 のうち最も古い取引から開始して、完全な %4 ブロック チェーン ( %2 GB) のダウンロードと処理を開始します。</translation>
+ </message>
+ <message>
<source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
<translation type="unfinished">ブロックチェーンの保存容量に制限を設けること(剪定)を選択した場合にも、過去のデータのダウンロードおよび処理が必要になります。しかし、これらのデータはディスク使用量を低く抑えるために、後で削除されます。</translation>
</message>
@@ -1487,7 +1532,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">わからない。ヘッダーを事前同期しています (%1, %2%)…</translation>
+ <translation type="unfinished">不明。ヘッダーの事前同期をしています (%1, %2%)…</translation>
</message>
</context>
<context>
@@ -1522,15 +1567,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">プルーニングを有効にすると、トランザクションの保存に必要なディスク容量が大幅に削減されます。すべてのブロックは完全に検証されます。この設定を元に戻すには、ブロックチェーン全体を再ダウンロードする必要があります。</translation>
+ <translation type="unfinished">剪定を有効にすると、取引の保存に必要なディスク容量が大幅に削減されます。すべてのブロックは完全に検証されます。この設定を元に戻すには、ブロックチェーン全体を再ダウンロードする必要があります。</translation>
</message>
<message>
<source>Size of &amp;database cache</source>
- <translation type="unfinished">データベースキャッシュのサイズ(&amp;D)</translation>
+ <translation type="unfinished">データベースキャッシュのサイズ(&amp;d)</translation>
</message>
<message>
<source>Number of script &amp;verification threads</source>
- <translation type="unfinished">スクリプト検証用スレッド数(&amp;V)</translation>
+ <translation type="unfinished">スクリプト検証用スレッド数(&amp;v)</translation>
</message>
<message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
@@ -1602,11 +1647,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Enable R&amp;PC server</source>
<extracomment>An Options window setting to enable the RPC server.</extracomment>
- <translation type="unfinished">R&amp;PC サーバーを有効にする</translation>
+ <translation type="unfinished">RPC サーバーを有効にする(&amp;P)</translation>
</message>
<message>
<source>W&amp;allet</source>
- <translation type="unfinished">ウォレット(&amp;A)</translation>
+ <translation type="unfinished">ウォレット(&amp;a)</translation>
</message>
<message>
<source>Whether to set subtract fee from amount as default or not.</source>
@@ -1616,7 +1661,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Subtract &amp;fee from amount by default</source>
<extracomment>An Options window setting to set subtracting the fee from a sending amount as default.</extracomment>
- <translation type="unfinished">デフォルトで金額からfeeを差し引く</translation>
+ <translation type="unfinished">デフォルトで金額からfeeを差し引く(&amp;f)</translation>
</message>
<message>
<source>Expert</source>
@@ -1624,11 +1669,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Enable coin &amp;control features</source>
- <translation type="unfinished">コインコントロール機能を有効化する(&amp;C)</translation>
+ <translation type="unfinished">コインコントロール機能を有効化する(&amp;c)</translation>
</message>
<message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
- <translation type="unfinished">未承認のお釣りを使用しない場合、取引が最低1回検証されるまではその取引のお釣りは利用できなくなります。これは残高の計算方法にも影響します。</translation>
+ <translation type="unfinished">未承認のお釣りを使用しない場合、取引が最低 1 回承認されるまではその取引のお釣りは利用できなくなります。これは残高の計算方法にも影響します。</translation>
</message>
<message>
<source>&amp;Spend unconfirmed change</source>
@@ -1637,7 +1682,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
- <translation type="unfinished">PSBT コントロールを有効にする</translation>
+ <translation type="unfinished">PSBT コントロールを有効にする(&amp;P)</translation>
</message>
<message>
<source>Whether to show PSBT controls.</source>
@@ -1662,11 +1707,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
- <translation type="unfinished">自動的にルーター上の Bitcoin クライアントのポートを開放します。あなたのユーターがNAT-PMPに対応していて、それが有効になっている場合のみ動作します。外部ポートはランダムで構いません。</translation>
+ <translation type="unfinished">自動的にルーター上の Bitcoin クライアントのポートを開放します。あなたのルーターが NAT-PMP に対応していて、それが有効になっている場合のみ動作します。外部ポートはランダムで構いません。</translation>
</message>
<message>
<source>Map port using NA&amp;T-PMP</source>
- <translation type="unfinished">NA&amp;T-PMP を使ってポートを割り当てる</translation>
+ <translation type="unfinished">NAT-PMP を使ってポートを割り当てる(&amp;T)</translation>
</message>
<message>
<source>Accept connections from outside.</source>
@@ -1674,7 +1719,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Allow incomin&amp;g connections</source>
- <translation type="unfinished">外部からの接続を許可する(&amp;G)</translation>
+ <translation type="unfinished">外部からの接続を許可する(&amp;g)</translation>
</message>
<message>
<source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
@@ -1698,7 +1743,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Used for reaching peers via:</source>
- <translation type="unfinished">ピアへの接続手段:</translation>
+ <translation type="unfinished">ピアへの接続経路:</translation>
</message>
<message>
<source>&amp;Window</source>
@@ -1706,11 +1751,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show the icon in the system tray.</source>
- <translation type="unfinished">システムトレイのアイコンを表示。</translation>
+ <translation type="unfinished">システムトレイにアイコンを表示。</translation>
</message>
<message>
<source>&amp;Show tray icon</source>
- <translation type="unfinished">&amp;トレイアイコンを表示</translation>
+ <translation type="unfinished">トレイアイコンを表示(&amp;S)</translation>
</message>
<message>
<source>Show only a tray icon after minimizing the window.</source>
@@ -1722,7 +1767,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>M&amp;inimize on close</source>
- <translation type="unfinished">閉じるときに最小化(&amp;I)</translation>
+ <translation type="unfinished">閉じるときに最小化(&amp;i)</translation>
</message>
<message>
<source>&amp;Display</source>
@@ -1730,7 +1775,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>User Interface &amp;language:</source>
- <translation type="unfinished">ユーザインターフェースの言語(&amp;L):</translation>
+ <translation type="unfinished">ユーザインターフェースの言語(&amp;l):</translation>
</message>
<message>
<source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
@@ -1742,7 +1787,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
- <translation type="unfinished">インターフェイスや送金時に使用する単位を選択する。</translation>
+ <translation type="unfinished">インターフェイスや送金時に使用するデフォルトの単位を選択する。</translation>
</message>
<message>
<source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
@@ -1750,11 +1795,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Third-party transaction URLs</source>
- <translation type="unfinished">サードパーティの取引確認URL</translation>
+ <translation type="unfinished">サードパーティの取引確認URL(&amp;T)</translation>
</message>
<message>
<source>Whether to show coin control features or not.</source>
- <translation type="unfinished">コインコントロール機能を表示するかどうか。</translation>
+ <translation type="unfinished">コインコントロール機能を表示するか否か。</translation>
</message>
<message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
@@ -1762,19 +1807,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
- <translation type="unfinished">Tor onion serviceを介してピアに到達するために別のSOCKS&amp;5プロキシを使用します:</translation>
- </message>
- <message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">概要タブの等幅フォント: </translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">埋込み "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">最もマッチする "%1"</translation>
+ <translation type="unfinished">Tor onion serviceを介してピアに到達するために別のSOCKS&amp;5プロキシを使用する(&amp;5):</translation>
</message>
<message>
<source>&amp;Cancel</source>
@@ -1783,11 +1816,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">外部署名なしで処理されました (外部署名が必要です)</translation>
+ <translation type="unfinished">外部署名のサポート (外部署名に必要)なしでコンパイルされています</translation>
</message>
<message>
<source>default</source>
- <translation type="unfinished">初期値</translation>
+ <translation type="unfinished">デフォルト</translation>
</message>
<message>
<source>none</source>
@@ -1806,7 +1839,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Current settings will be backed up at "%1".</source>
<extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
- <translation type="unfinished">現在の設定は「%1」にバックアップされます。</translation>
+ <translation type="unfinished">現在の設定は "%1" にバックアップされます。</translation>
</message>
<message>
<source>Client will be shut down. Do you want to proceed?</source>
@@ -1821,7 +1854,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
<extracomment>Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</extracomment>
- <translation type="unfinished">設定ファイルは、GUIでの設定を上書きする高度なユーザーオプションを指定するためのものです。また、コマンドラインオプションはこの設定ファイルの内容も上書きします。</translation>
+ <translation type="unfinished">設定ファイルは、GUIでの設定に優先する高度なユーザーオプションを指定するためのものです。また、コマンドラインオプションはこの設定ファイルの内容よりも優先します。</translation>
</message>
<message>
<source>Continue</source>
@@ -1867,7 +1900,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Watch-only:</source>
- <translation type="unfinished">ウォッチ限定:</translation>
+ <translation type="unfinished">監視専用:</translation>
</message>
<message>
<source>Available:</source>
@@ -1875,15 +1908,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Your current spendable balance</source>
- <translation type="unfinished">送金可能な残高</translation>
+ <translation type="unfinished">使用可能な残高</translation>
</message>
<message>
<source>Pending:</source>
- <translation type="unfinished">検証待ち:</translation>
+ <translation type="unfinished">保留中:</translation>
</message>
<message>
<source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
- <translation type="unfinished">取引が未承認で残高に反映されていない総額</translation>
+ <translation type="unfinished">未承認なので使用可能な残高に反映されていない取引の合計</translation>
</message>
<message>
<source>Immature:</source>
@@ -1891,7 +1924,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Mined balance that has not yet matured</source>
- <translation type="unfinished">採掘された未成熟な残高</translation>
+ <translation type="unfinished">未成熟な採掘の残高</translation>
</message>
<message>
<source>Balances</source>
@@ -1903,15 +1936,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Your current total balance</source>
- <translation type="unfinished">現在の残高の総計</translation>
+ <translation type="unfinished">現在の合計残高</translation>
</message>
<message>
<source>Your current balance in watch-only addresses</source>
- <translation type="unfinished">ウォッチ限定アドレス内の現在の残高</translation>
+ <translation type="unfinished">監視専用アドレスの現在の残高</translation>
</message>
<message>
<source>Spendable:</source>
- <translation type="unfinished">送金可能:</translation>
+ <translation type="unfinished">使用可能:</translation>
</message>
<message>
<source>Recent transactions</source>
@@ -1919,19 +1952,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Unconfirmed transactions to watch-only addresses</source>
- <translation type="unfinished">ウォッチ限定アドレスの未承認取引</translation>
+ <translation type="unfinished">監視専用アドレスの未承認取引</translation>
</message>
<message>
<source>Mined balance in watch-only addresses that has not yet matured</source>
- <translation type="unfinished">ウォッチ限定アドレスで採掘された未成熟な残高</translation>
+ <translation type="unfinished">監視専用アドレスで採掘された未成熟な残高</translation>
</message>
<message>
<source>Current total balance in watch-only addresses</source>
- <translation type="unfinished">ウォッチ限定アドレスの現在の残高の総計</translation>
+ <translation type="unfinished">監視専用アドレスの現在の残高の合計</translation>
</message>
<message>
<source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
- <translation type="unfinished">概要タブでプライバシーモードが有効になっています。値のマスクを解除するには、設定-&gt;マスクの値のチェックを外してください。</translation>
+ <translation type="unfinished">概要タブでプライバシーモードが有効になっています。値のマスクを解除するには、設定 -&gt; 値を隠す のチェックを外してください。</translation>
</message>
</context>
<context>
@@ -1942,11 +1975,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Sign Tx</source>
- <translation type="unfinished">署名されたトランザクション</translation>
+ <translation type="unfinished">取引に署名</translation>
</message>
<message>
<source>Broadcast Tx</source>
- <translation type="unfinished">Txをブロードキャスト</translation>
+ <translation type="unfinished">取引をブロードキャスト</translation>
</message>
<message>
<source>Copy to Clipboard</source>
@@ -1962,11 +1995,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Failed to load transaction: %1</source>
- <translation type="unfinished">%1 : トランザクションの読込失敗</translation>
+ <translation type="unfinished">取引の読込に失敗: %1</translation>
</message>
<message>
<source>Failed to sign transaction: %1</source>
- <translation type="unfinished">%1 : トランザクション署名失敗</translation>
+ <translation type="unfinished">取引の署名に失敗: %1</translation>
</message>
<message>
<source>Cannot sign inputs while wallet is locked.</source>
@@ -1982,19 +2015,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Signed transaction successfully. Transaction is ready to broadcast.</source>
- <translation type="unfinished">トランザクションへの署名が成功しました。トランザクションのブロードキャストの準備ができています。</translation>
+ <translation type="unfinished">取引への署名に成功しました。取引はブロードキャストの準備ができています。</translation>
</message>
<message>
<source>Unknown error processing transaction.</source>
- <translation type="unfinished">トランザクション処理中の不明なエラー。</translation>
+ <translation type="unfinished">取引処理中の不明なエラー。</translation>
</message>
<message>
<source>Transaction broadcast successfully! Transaction ID: %1</source>
- <translation type="unfinished">トランザクションのブロードキャストに成功しました!トランザクションID: %1</translation>
+ <translation type="unfinished">取引のブロードキャストに成功! 取引 ID: %1</translation>
</message>
<message>
<source>Transaction broadcast failed: %1</source>
- <translation type="unfinished">トランザクションのブロードキャストが失敗しました: %1</translation>
+ <translation type="unfinished">取引のブロードキャストに失敗しました: %1</translation>
</message>
<message>
<source>PSBT copied to clipboard.</source>
@@ -2002,20 +2035,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Save Transaction Data</source>
- <translation type="unfinished">トランザクションデータの保存</translation>
+ <translation type="unfinished">取引データの保存</translation>
</message>
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">部分的に署名されたトランザクション(バイナリ)</translation>
+ <translation type="unfinished">部分的に署名された取引(バイナリ)</translation>
</message>
<message>
<source>PSBT saved to disk.</source>
<translation type="unfinished">PSBTはディスクに保存されました。</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * %1 から %2 へ送信</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">%1を%2に送信</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自分のアドレス</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2023,7 +2060,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Pays transaction fee: </source>
- <translation type="unfinished">トランザクション手数料: </translation>
+ <translation type="unfinished">取引手数料の支払い: </translation>
</message>
<message>
<source>Total Amount</source>
@@ -2035,15 +2072,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Transaction has %1 unsigned inputs.</source>
- <translation type="unfinished">トランザクションには %1 個の未署名インプットがあります。</translation>
+ <translation type="unfinished">取引には %1 個の未署名インプットがあります。</translation>
</message>
<message>
<source>Transaction is missing some information about inputs.</source>
- <translation type="unfinished">トランザクションにインプットに関する情報がありません。</translation>
+ <translation type="unfinished">この取引にはインプットに関する情報がありません。</translation>
</message>
<message>
<source>Transaction still needs signature(s).</source>
- <translation type="unfinished">トランザクションにはまだ署名が必要です。</translation>
+ <translation type="unfinished">取引にはさらに署名が必要です。</translation>
</message>
<message>
<source>(But no wallet is loaded.)</source>
@@ -2051,7 +2088,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(But this wallet cannot sign transactions.)</source>
- <translation type="unfinished">(しかしこのウォレットはトランザクションに署名できません。)</translation>
+ <translation type="unfinished">(しかし、このウォレットは取引に署名できません。)</translation>
</message>
<message>
<source>(But this wallet does not have the right keys.)</source>
@@ -2059,18 +2096,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Transaction is fully signed and ready for broadcast.</source>
- <translation type="unfinished">トランザクションは完全に署名され、ブロードキャストの準備ができています。</translation>
+ <translation type="unfinished">取引は完全に署名され、ブロードキャストの準備ができています。</translation>
</message>
<message>
<source>Transaction status is unknown.</source>
- <translation type="unfinished">トランザクションの状態が不明です.</translation>
+ <translation type="unfinished">取引の状態が不明です。</translation>
</message>
</context>
<context>
<name>PaymentServer</name>
<message>
<source>Payment request error</source>
- <translation type="unfinished">支払いリクエスト エラー</translation>
+ <translation type="unfinished">支払いリクエストのエラー</translation>
</message>
<message>
<source>Cannot start bitcoin: click-to-pay handler</source>
@@ -2088,7 +2125,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Cannot process payment request because BIP70 is not supported.
Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
- <translation type="unfinished">BIP70がサポートされていないので支払い請求を処理できません。
+ <translation type="unfinished">BIP70がサポートされていないので支払いリクエストを処理できません。
BIP70には広範なセキュリティー上の問題があるので、ウォレットを換えるようにとの事業者からの指示は無視することを強く推奨します。
このエラーが発生した場合、事業者に対してBIP21に対応したURIを要求してください。</translation>
</message>
@@ -2116,7 +2153,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
<message>
<source>Age</source>
<extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">年</translation>
+ <translation type="unfinished">時間</translation>
</message>
<message>
<source>Direction</source>
@@ -2131,7 +2168,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
<message>
<source>Received</source>
<extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
- <translation type="unfinished">受信</translation>
+ <translation type="unfinished">受信済</translation>
</message>
<message>
<source>Address</source>
@@ -2163,7 +2200,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
<name>QRImageWidget</name>
<message>
<source>&amp;Save Image…</source>
- <translation type="unfinished">画像を保存…(&amp;S)</translation>
+ <translation type="unfinished">画像を保存(&amp;S)…</translation>
</message>
<message>
<source>&amp;Copy Image</source>
@@ -2175,7 +2212,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
</message>
<message>
<source>Error encoding URI into QR Code.</source>
- <translation type="unfinished">URIをQRコードへ変換している際にエラーが発生しました。</translation>
+ <translation type="unfinished">URIからQRコードへの変換でエラーが発生。</translation>
</message>
<message>
<source>QR code support not available.</source>
@@ -2267,7 +2304,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
</message>
<message>
<source>Received</source>
- <translation type="unfinished">受信</translation>
+ <translation type="unfinished">受信済</translation>
</message>
<message>
<source>Sent</source>
@@ -2286,16 +2323,32 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
<translation type="unfinished">詳しい情報を見たいピアを選択してください。</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">トランスポート層のバージョン: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">トランスポート</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">BIP324 のセッション ID の16進文字列 (存在する場合) 。</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">セッション ID</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">バージョン</translation>
</message>
<message>
<source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">このピアにトランザクションをリレーするかどうか。</translation>
+ <translation type="unfinished">このピアに取引をリレーするか否か。</translation>
</message>
<message>
<source>Transaction Relay</source>
- <translation type="unfinished">トランザクションリレー</translation>
+ <translation type="unfinished">取引のリレー</translation>
</message>
<message>
<source>Starting Block</source>
@@ -2315,11 +2368,11 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
</message>
<message>
<source>The mapped Autonomous System used for diversifying peer selection.</source>
- <translation type="unfinished">ピア選択の多様化に使用できるマップ化された自律システム。</translation>
+ <translation type="unfinished">ピア選択を多様化するために使用されるマッピングされた自律システム。</translation>
</message>
<message>
<source>Mapped AS</source>
- <translation type="unfinished">マップ化された自律システム</translation>
+ <translation type="unfinished">マッピングされた自律システム</translation>
</message>
<message>
<source>Whether we relay addresses to this peer.</source>
@@ -2339,7 +2392,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
<message>
<source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
<extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">レート制限が原因でドロップされた (処理されなかった) このピアから受信したアドレスの総数。</translation>
+ <translation type="unfinished">このピアから受信したアドレスのうち、レート制限起因でドロップされた (処理されなかった) ものの総数。</translation>
</message>
<message>
<source>Addresses Processed</source>
@@ -2377,7 +2430,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
</message>
<message>
<source>Permissions</source>
- <translation type="unfinished">パーミッション</translation>
+ <translation type="unfinished">権限</translation>
</message>
<message>
<source>The direction and type of peer connection: %1</source>
@@ -2389,7 +2442,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
</message>
<message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
- <translation type="unfinished">このピアと接続しているネットワーク: IPv4, IPv6, Onion, I2P, or CJDNS.</translation>
+ <translation type="unfinished">このピアと接続しているネットワークプロトコル: IPv4, IPv6, Onion, I2P, or CJDNS.</translation>
</message>
<message>
<source>Services</source>
@@ -2397,7 +2450,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
</message>
<message>
<source>High bandwidth BIP152 compact block relay: %1</source>
- <translation type="unfinished">高帯域幅のBIP152 Compact Blockリレー: %1</translation>
+ <translation type="unfinished">高帯域幅のBIP152 コンパクトブロックリレー: %1</translation>
</message>
<message>
<source>High Bandwidth</source>
@@ -2418,7 +2471,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
<message>
<source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
<extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
- <translation type="unfinished">mempoolに受け入れられた新しいトランザクションがこのピアから受信されてからの経過時間。</translation>
+ <translation type="unfinished">メモリプールに受け入れられた新しい取引がこのピアから受信されてからの経過時間。</translation>
</message>
<message>
<source>Last Send</source>
@@ -2446,7 +2499,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
</message>
<message>
<source>Time Offset</source>
- <translation type="unfinished">時間オフセット</translation>
+ <translation type="unfinished">時刻のオフセット</translation>
</message>
<message>
<source>Last block time</source>
@@ -2487,7 +2540,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
<message>
<source>Inbound: initiated by peer</source>
<extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">Inbound: ピアから接続</translation>
+ <translation type="unfinished">インバウンド: ピアからの接続</translation>
</message>
<message>
<source>Outbound Full Relay: default</source>
@@ -2497,22 +2550,37 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
<message>
<source>Outbound Block Relay: does not relay transactions or addresses</source>
<extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">アウトバウンドブロックリレー: トランザクションやアドレスは中継しません</translation>
+ <translation type="unfinished">アウトバウンドブロックリレー: 取引やアドレスは中継しません</translation>
</message>
<message>
<source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
<extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
- <translation type="unfinished">Outbound Manual: RPC %1 or %2/%3 設定オプションによって追加</translation>
+ <translation type="unfinished">手動アウトバウンド: RPC %1 or %2/%3 設定オプションによって追加</translation>
</message>
<message>
<source>Outbound Feeler: short-lived, for testing addresses</source>
<extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
- <translation type="unfinished">Outbound Feeler: 短時間接続、テスティングアドレス用</translation>
+ <translation type="unfinished">探索用アウトバウンド: 短時間接続、アドレスのテスト用</translation>
</message>
<message>
<source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
<extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
- <translation type="unfinished">Outbound Address Fetch: 短時間接続、solicitingアドレス用</translation>
+ <translation type="unfinished">アドレス収集用アウトバウンド: 短時間接続、アドレス収集用</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">検出中: ピアは v1 でも v2 でもよい</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: 非暗号, 平文トランスポートプロトコル</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 暗号化トランスポートプロトコル</translation>
</message>
<message>
<source>we selected the peer for high bandwidth relay</source>
@@ -2537,7 +2605,7 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
</message>
<message>
<source>1 &amp;hour</source>
- <translation type="unfinished">1時間(&amp;H)</translation>
+ <translation type="unfinished">1 時間(&amp;h)</translation>
</message>
<message>
<source>1 d&amp;ay</source>
@@ -2545,16 +2613,16 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
</message>
<message>
<source>1 &amp;week</source>
- <translation type="unfinished">1週間(&amp;W)</translation>
+ <translation type="unfinished">1 週間(&amp;w)</translation>
</message>
<message>
<source>1 &amp;year</source>
- <translation type="unfinished">1年(&amp;Y)</translation>
+ <translation type="unfinished">1 年(&amp;y)</translation>
</message>
<message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
- <translation type="unfinished">IP/ネットマスクをコピー &amp;C</translation>
+ <translation type="unfinished">IP/ネットマスクをコピー (&amp;C)</translation>
</message>
<message>
<source>&amp;Unban</source>
@@ -2562,15 +2630,15 @@ BIP70には広範なセキュリティー上の問題があるので、ウォレ
</message>
<message>
<source>Network activity disabled</source>
- <translation type="unfinished">ネットワーク活動が無効になりました</translation>
+ <translation type="unfinished">ネットワーク活動が停止しました</translation>
</message>
<message>
<source>Executing command without any wallet</source>
- <translation type="unfinished">どのウォレットも使わずにコマンドを実行します</translation>
+ <translation type="unfinished">どのウォレットも使わずにコマンドを実行しています</translation>
</message>
<message>
<source>Executing command using "%1" wallet</source>
- <translation type="unfinished">"%1" ウォレットを使ってコマンドを実行します</translation>
+ <translation type="unfinished">"%1" ウォレットを使ってコマンドを実行しています</translation>
</message>
<message>
<source>Welcome to the %1 RPC console.
@@ -2581,7 +2649,7 @@ For more information on using this console, type %6.
%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
<extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
- <translation type="unfinished">ようこそ、%1コンソールへ。
+ <translation type="unfinished">ようこそ、%1 RPCコンソールへ。
上下の矢印で履歴を移動し、%2でスクリーンをクリアできます。
%3および%4を使用してフォントサイズを調整できます。
使用可能なコマンドの概要については、%5を入力してください。
@@ -2612,7 +2680,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>To</source>
- <translation type="unfinished">外向き</translation>
+ <translation type="unfinished">送金先</translation>
</message>
<message>
<source>From</source>
@@ -2635,7 +2703,7 @@ For more information on using this console, type %6.
<name>ReceiveCoinsDialog</name>
<message>
<source>&amp;Amount:</source>
- <translation type="unfinished">金額:(&amp;A)</translation>
+ <translation type="unfinished">金額(&amp;A):</translation>
</message>
<message>
<source>&amp;Label:</source>
@@ -2647,19 +2715,19 @@ For more information on using this console, type %6.
</message>
<message>
<source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
- <translation type="unfinished">支払いリクエストに添付するメッセージ(任意)。支払リクエスト開始時に表示されます。注意: メッセージは Bitcoin ネットワーク上へ送信されません。</translation>
+ <translation type="unfinished">支払いリクエストに添付する任意のメッセージで、支払リクエストの開封時に表示されます。注意: メッセージは Bitcoin ネットワーク上へ送信されません。</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address.</source>
- <translation type="unfinished">新規受取用アドレスに紐づけるラベル(任意)。</translation>
+ <translation type="unfinished">新規受取用アドレスに紐づける任意のラベル。</translation>
</message>
<message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
- <translation type="unfinished">このフォームで支払いをリクエストしましょう。全ての入力欄は&lt;b&gt;任意入力&lt;/b&gt;です。</translation>
+ <translation type="unfinished">このフォームで支払いをリクエストしましょう。全ての欄は&lt;b&gt;任意&lt;/b&gt;です。</translation>
</message>
<message>
<source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
- <translation type="unfinished">リクエストする金額(任意)。特定の金額をリクエストしない場合は、この欄は空白のままかゼロにしてください。</translation>
+ <translation type="unfinished">リクエストする任意の金額。特定の金額をリクエストしない場合は、この欄は空白のままかゼロにしてください。</translation>
</message>
<message>
<source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
@@ -2671,7 +2739,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Create new receiving address</source>
- <translation type="unfinished">新しい受取用アドレスを作成</translation>
+ <translation type="unfinished">新しい受取用アドレスを作成(&amp;C)</translation>
</message>
<message>
<source>Clear all fields of the form.</source>
@@ -2683,7 +2751,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Requested payments history</source>
- <translation type="unfinished">支払いリクエスト履歴</translation>
+ <translation type="unfinished">支払いリクエストの履歴</translation>
</message>
<message>
<source>Show the selected request (does the same as double clicking an entry)</source>
@@ -2703,7 +2771,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Copy &amp;URI</source>
- <translation type="unfinished">URIをコピーする(&amp;U)</translation>
+ <translation type="unfinished">URIをコピー(&amp;U)</translation>
</message>
<message>
<source>&amp;Copy address</source>
@@ -2723,7 +2791,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Not recommended due to higher fees and less protection against typos.</source>
- <translation type="unfinished">料金が高く、タイプミスに対する保護が少ないため、お勧めできません。</translation>
+ <translation type="unfinished">料金が高く、タイプミスに対する保護が弱いため、お勧めできません。</translation>
</message>
<message>
<source>Generates an address compatible with older wallets.</source>
@@ -2750,11 +2818,11 @@ For more information on using this console, type %6.
<name>ReceiveRequestDialog</name>
<message>
<source>Request payment to …</source>
- <translation type="unfinished">支払先…</translation>
+ <translation type="unfinished">支払いリクエスト先…</translation>
</message>
<message>
<source>Address:</source>
- <translation type="unfinished">アドレス:</translation>
+ <translation type="unfinished">アドレス:</translation>
</message>
<message>
<source>Amount:</source>
@@ -2774,7 +2842,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Copy &amp;URI</source>
- <translation type="unfinished">URIをコピーする(&amp;U)</translation>
+ <translation type="unfinished">URIをコピー(&amp;U)</translation>
</message>
<message>
<source>Copy &amp;Address</source>
@@ -2790,15 +2858,15 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Save Image…</source>
- <translation type="unfinished">画像を保存…(&amp;S)</translation>
+ <translation type="unfinished">画像を保存(&amp;S)…</translation>
</message>
<message>
<source>Payment information</source>
- <translation type="unfinished">支払い情報</translation>
+ <translation type="unfinished">支払いリクエストの内容</translation>
</message>
<message>
<source>Request payment to %1</source>
- <translation type="unfinished">%1 への支払いリクエスト</translation>
+ <translation type="unfinished">支払いリクエスト %1</translation>
</message>
</context>
<context>
@@ -2817,7 +2885,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ラベル無し)</translation>
+ <translation type="unfinished">(ラベルなし)</translation>
</message>
<message>
<source>(no message)</source>
@@ -2825,11 +2893,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>(no amount requested)</source>
- <translation type="unfinished">(指定無し)</translation>
+ <translation type="unfinished">(金額指定無し)</translation>
</message>
<message>
<source>Requested</source>
- <translation type="unfinished">リクエストされた金額</translation>
+ <translation type="unfinished">リクエスト金額</translation>
</message>
</context>
<context>
@@ -2884,11 +2952,11 @@ For more information on using this console, type %6.
</message>
<message>
<source>Transaction Fee:</source>
- <translation type="unfinished">トランザクション手数料:</translation>
+ <translation type="unfinished">取引手数料:</translation>
</message>
<message>
<source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
- <translation type="unfinished">代替料金を利用することで、承認されるまでに数時間または数日 (ないし一生承認されない) トランザクションを送信してしまう可能性があります。手動にて手数料を選択するか、完全なブロックチェーンの検証が終わるまで待つことを検討しましょう。</translation>
+ <translation type="unfinished">不適切な料金を利用することで、承認されるまでに数時間または数日 (あるいは永久に承認されない) 取引を送信してしまう可能性があります。手動にて手数料を設定するか、ブロックチェーンの検証が完全に終わるまで待つことを考慮してください。</translation>
</message>
<message>
<source>Warning: Fee estimation is currently not possible.</source>
@@ -2927,36 +2995,32 @@ For more information on using this console, type %6.
<translation type="unfinished">入力…</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">ダスト:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">選択…</translation>
</message>
<message>
<source>Hide transaction fee settings</source>
- <translation type="unfinished">トランザクション手数料の設定を隠す</translation>
+ <translation type="unfinished">取引手数料の設定を隠す</translation>
</message>
<message>
<source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
- <translation type="unfinished">トランザクション仮想サイズ(vsize)のkB(1000 bytes)当たりのカスタム手数料率を設定してください。
+ <translation type="unfinished">取引の仮想サイズのkB(1000 bytes)当たりのカスタム手数料を設定してください。
-注意: 手数料はbyte単位で計算されます。"100 satoshis per kvB"という手数料率のとき、500 仮想バイト (half of 1 kvB)のトランザクションの手数料はたったの50 satoshisと計算されます。</translation>
+注意: 手数料はbyte単位で計算されます。"100 satoshis / kvB"という手数料率のとき、500 仮想バイト (1 kvBの半分)の取引の手数料はたったの50 satoshisと計算されます。</translation>
</message>
<message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
- <translation type="unfinished">ブロック内の空きよりトランザクション流量が少ない場合、マイナーや中継ノードは最低限の手数料でも処理することがあります。この最低限の手数料だけを支払っても問題ありませんが、一度トランザクションの需要がネットワークの処理能力を超えてしまった場合には、トランザクションが永久に承認されなくなってしまう可能性があることにご注意ください。</translation>
+ <translation type="unfinished">ブロック内の空きより取引の量が少ない場合、マイナーや中継ノードは最低限の手数料でも処理することがあります。この最低限の手数料だけを支払っても問題ありませんが、一度取引の需要がネットワークの処理能力を超えてしまった場合には、取引が永久に承認されなくなってしまう可能性があることに注意してください。</translation>
</message>
<message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
- <translation type="unfinished">手数料が低すぎるとトランザクションが永久に承認されなくなる可能性があります (ツールチップを参照)</translation>
+ <translation type="unfinished">手数料が低すぎると取引が永久に承認されなくなる可能性があります (ツールチップを参照)</translation>
</message>
<message>
<source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
- <translation type="unfinished">(スマート手数料は初期化されていません。初期化まで通常数ブロックを要します…)</translation>
+ <translation type="unfinished">(スマート手数料は初期化されていません。初期化まで通常は数ブロックを要します…)</translation>
</message>
<message>
<source>Confirmation time target:</source>
@@ -2964,11 +3028,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Enable Replace-By-Fee</source>
- <translation type="unfinished">Replace-By-Fee を有効化する</translation>
+ <translation type="unfinished">Replace-By-Fee を有効にする</translation>
</message>
<message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
- <translation type="unfinished">Replace-By-Fee(手数料の上乗せ: BIP-125)機能を有効にすることで、トランザクション送信後でも手数料を上乗せすることができます。この機能を利用しない場合、予め手数料を多めに見積もっておかないと取引が遅れる可能性があります。</translation>
+ <translation type="unfinished">Replace-By-Fee(手数料の上乗せ: BIP-125)機能を有効にすることで、取引送信後でも手数料を上乗せすることができます。この機能を利用しない場合、予め手数料を多めに見積もっておかないと取引が遅れるリスクがあります。</translation>
</message>
<message>
<source>Clear &amp;All</source>
@@ -2984,7 +3048,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>S&amp;end</source>
- <translation type="unfinished">送金(&amp;E)</translation>
+ <translation type="unfinished">送金(&amp;e)</translation>
</message>
<message>
<source>Copy quantity</source>
@@ -3007,10 +3071,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">バイト数をコピー</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">ダストをコピー</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">お釣りをコピー</translation>
</message>
@@ -3030,23 +3090,19 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<message>
<source>Set external signer script path in Options -&gt; Wallet</source>
<extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">オプションのウォレットタブにHWIのパスを設定してください</translation>
+ <translation type="unfinished">設定-&gt;オプション-&gt;ウォレット タブにHWIのパスを設定してください</translation>
</message>
<message>
<source>Cr&amp;eate Unsigned</source>
- <translation type="unfinished">未署名で作成</translation>
+ <translation type="unfinished">未署名で作成(&amp;e)</translation>
</message>
<message>
<source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">オフライン%1ウォレットまたはPSBTに対応したハードウェアウォレットと合わせて使用するためのPSBT(部分的に署名されたトランザクション)を作成します。</translation>
- </message>
- <message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> ウォレット '%1' から</translation>
+ <translation type="unfinished">オフラインの %1 ウォレット、あるいはPSBTに対応したハードウェアウォレットで使用するためのPSBT(部分的に署名された取引)を作成します。</translation>
</message>
<message>
<source>%1 to '%2'</source>
- <translation type="unfinished">%1 から '%2'</translation>
+ <translation type="unfinished">%1 → '%2'</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -3072,12 +3128,12 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Save Transaction Data</source>
- <translation type="unfinished">トランザクションデータの保存</translation>
+ <translation type="unfinished">取引データの保存</translation>
</message>
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">部分的に署名されたトランザクション(バイナリ)</translation>
+ <translation type="unfinished">部分的に署名された取引(バイナリ)</translation>
</message>
<message>
<source>PSBT saved</source>
@@ -3086,7 +3142,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>External balance:</source>
- <translation type="unfinished">Externalの残高:</translation>
+ <translation type="unfinished">外部残高:</translation>
</message>
<message>
<source>or</source>
@@ -3099,7 +3155,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<message>
<source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
- <translation type="unfinished">トランザクション提案を確認してください。これにより、部分的に署名されたビットコイン・トランザクション(PSBT)が作成されます。これを保存するかコピーして例えばオフラインの %1 ウォレットやPSBTを扱えるハードウェアウォレットで残りの署名が出来ます。</translation>
+ <translation type="unfinished">取引の提案を確認してください。これにより、部分的に署名されたBitcoin取引(PSBT)が作成されます。これを保存するかコピーして例えばオフラインの %1 ウォレットやPSBTを扱えるハードウェアウォレットで残りの署名が出来ます。</translation>
+ </message>
+ <message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished"> ウォレット '%2' の%1</translation>
</message>
<message>
<source>Do you want to create this transaction?</source>
@@ -3109,7 +3169,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<message>
<source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">取引を確認してください。 この取引を作成して送信するか、部分的に署名されたビットコイン取引(Partially Signed Bitcoin Transaction: PSBT)を作成できます。これを保存またはコピーして、オフラインの %1 ウォレットやPSBT互換のハードウェアウォレットなどで署名できます。</translation>
+ <translation type="unfinished">取引を確認してください。 この取引を作成して送信するか、部分的に署名されたBitcoin取引(Partially Signed Bitcoin Transaction: PSBT)を作成できます。これを保存またはコピーして、オフラインの %1 ウォレットやPSBT互換のハードウェアウォレットなどで署名できます。</translation>
</message>
<message>
<source>Please, review your transaction.</source>
@@ -3154,7 +3214,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Watch-only balance:</source>
- <translation type="unfinished">監視限定残高: </translation>
+ <translation type="unfinished">監視専用の残高: </translation>
</message>
<message>
<source>The recipient address is not valid. Please recheck.</source>
@@ -3162,11 +3222,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>The amount to pay must be larger than 0.</source>
- <translation type="unfinished">支払い総額は0より大きい必要があります。</translation>
+ <translation type="unfinished">支払い金額は0より大きい必要があります。</translation>
</message>
<message>
<source>The amount exceeds your balance.</source>
- <translation type="unfinished">支払い総額が残高を超えています。</translation>
+ <translation type="unfinished">金額が残高を超えています。</translation>
</message>
<message>
<source>The total exceeds your balance when the %1 transaction fee is included.</source>
@@ -3182,7 +3242,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
- <translation type="unfinished">%1 よりも高い手数料は、異常に高すぎです。</translation>
+ <translation type="unfinished">%1 よりも高い手数料は、法外に高い手数料と判定されます。</translation>
</message>
<message>
<source>%1/kvB</source>
@@ -3191,16 +3251,16 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>%n ブロック以内に確認を開始すると推定されます。</numerusform>
+ <numerusform>%n ブロック以内に承認を開始すると推定されます。</numerusform>
</translation>
</message>
<message>
<source>Warning: Invalid Bitcoin address</source>
- <translation type="unfinished">警告: 無効な Bitcoin アドレス</translation>
+ <translation type="unfinished">警告: 無効な Bitcoin アドレスです</translation>
</message>
<message>
<source>Warning: Unknown change address</source>
- <translation type="unfinished">警告:正体不明のお釣りアドレスです</translation>
+ <translation type="unfinished">警告: 不明なお釣りアドレスです</translation>
</message>
<message>
<source>Confirm custom change address</source>
@@ -3208,18 +3268,18 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
- <translation type="unfinished">お釣り用として指定されたアドレスはこのウォレットのものではありません。このウォレットの一部又は全部の資産がこのアドレスへ送金されます。よろしいですか?</translation>
+ <translation type="unfinished">お釣り用として指定されたアドレスはこのウォレットのものではありません。このウォレットの一部又は全部の資産がこのアドレスへ送金されます。確かですか?</translation>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ラベル無し)</translation>
+ <translation type="unfinished">(ラベルなし)</translation>
</message>
</context>
<context>
<name>SendCoinsEntry</name>
<message>
<source>A&amp;mount:</source>
- <translation type="unfinished">金額(&amp;A):</translation>
+ <translation type="unfinished">金額(&amp;m):</translation>
</message>
<message>
<source>Pay &amp;To:</source>
@@ -3235,7 +3295,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>The Bitcoin address to send the payment to</source>
- <translation type="unfinished">支払い先 Bitcoin アドレス</translation>
+ <translation type="unfinished">送金先 Bitcoin アドレス</translation>
</message>
<message>
<source>Paste address from clipboard</source>
@@ -3247,7 +3307,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>The amount to send in the selected unit</source>
- <translation type="unfinished">送金する金額の単位を選択</translation>
+ <translation type="unfinished">選択した単位での送金額</translation>
</message>
<message>
<source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
@@ -3255,11 +3315,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>S&amp;ubtract fee from amount</source>
- <translation type="unfinished">送金額から手数料を差し引く(&amp;U)</translation>
+ <translation type="unfinished">送金額から手数料を差し引く(&amp;u)</translation>
</message>
<message>
<source>Use available balance</source>
- <translation type="unfinished">利用可能な残額を使用</translation>
+ <translation type="unfinished">利用可能な残高を使用</translation>
</message>
<message>
<source>Message:</source>
@@ -3293,7 +3353,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>&amp;Sign Message</source>
- <translation type="unfinished">メッセージの署名(&amp;S)</translation>
+ <translation type="unfinished">メッセージに署名(&amp;S)</translation>
</message>
<message>
<source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
@@ -3329,7 +3389,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Sign &amp;Message</source>
- <translation type="unfinished">メッセージを署名(&amp;M)</translation>
+ <translation type="unfinished">メッセージに署名(&amp;M)</translation>
</message>
<message>
<source>Reset all sign message fields</source>
@@ -3341,7 +3401,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>&amp;Verify Message</source>
- <translation type="unfinished">メッセージの検証(&amp;V)</translation>
+ <translation type="unfinished">メッセージを検証(&amp;V)</translation>
</message>
<message>
<source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
@@ -3373,7 +3433,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Click "Sign Message" to generate signature</source>
- <translation type="unfinished">「メッセージを署名」をクリックして署名を生成</translation>
+ <translation type="unfinished">「メッセージに署名」をクリックして署名を生成</translation>
</message>
<message>
<source>The entered address is invalid.</source>
@@ -3456,17 +3516,17 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<message>
<source>0/unconfirmed, in memory pool</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
- <translation type="unfinished">0/未確認、メモリープール内</translation>
+ <translation type="unfinished">0/未承認、メモリープールに有る</translation>
</message>
<message>
<source>0/unconfirmed, not in memory pool</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
- <translation type="unfinished">0/未確認、メモリ プールにない</translation>
+ <translation type="unfinished">0/未承認、メモリープールに無い</translation>
</message>
<message>
<source>abandoned</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
- <translation type="unfinished">送信中止</translation>
+ <translation type="unfinished">取消しされました</translation>
</message>
<message>
<source>%1/unconfirmed</source>
@@ -3492,7 +3552,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Generated</source>
- <translation type="unfinished">生成</translation>
+ <translation type="unfinished">採掘</translation>
</message>
<message>
<source>From</source>
@@ -3504,7 +3564,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>To</source>
- <translation type="unfinished">外向き</translation>
+ <translation type="unfinished">送金先</translation>
</message>
<message>
<source>own address</source>
@@ -3512,7 +3572,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">ウォッチ限定</translation>
+ <translation type="unfinished">監視専用</translation>
</message>
<message>
<source>label</source>
@@ -3520,29 +3580,29 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Credit</source>
- <translation type="unfinished">貸方</translation>
+ <translation type="unfinished">入金額</translation>
</message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>%n 個以上のブロックで成熟する</numerusform>
+ <numerusform>あと %n 個のブロックで成熟</numerusform>
</translation>
</message>
<message>
<source>not accepted</source>
- <translation type="unfinished">承認されていない</translation>
+ <translation type="unfinished">未承認</translation>
</message>
<message>
<source>Debit</source>
- <translation type="unfinished">借方</translation>
+ <translation type="unfinished">出金額</translation>
</message>
<message>
<source>Total debit</source>
- <translation type="unfinished">借方総計</translation>
+ <translation type="unfinished">出金合計</translation>
</message>
<message>
<source>Total credit</source>
- <translation type="unfinished">貸方総計</translation>
+ <translation type="unfinished">入金合計</translation>
</message>
<message>
<source>Transaction fee</source>
@@ -3562,31 +3622,31 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Transaction ID</source>
- <translation type="unfinished">取引ID</translation>
+ <translation type="unfinished">取引 ID</translation>
</message>
<message>
<source>Transaction total size</source>
- <translation type="unfinished">トランザクションの全体サイズ</translation>
+ <translation type="unfinished">取引の全体サイズ</translation>
</message>
<message>
<source>Transaction virtual size</source>
- <translation type="unfinished">トランザクションの仮想サイズ</translation>
+ <translation type="unfinished">取引の仮想サイズ</translation>
</message>
<message>
<source>Output index</source>
- <translation type="unfinished">アウトプット インデックス数</translation>
+ <translation type="unfinished">アウトプット番号</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (証明書は検証されませんでした)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (証明書は未検証)</translation>
</message>
<message>
<source>Merchant</source>
- <translation type="unfinished">リクエスト元</translation>
+ <translation type="unfinished">取引相手</translation>
</message>
<message>
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
- <translation type="unfinished">生成されたコインは、%1 ブロックの間成熟させたあとに使用可能になります。このブロックは生成された際、ブロックチェーンに取り込まれるためにネットワークに放流されました。ブロックチェーンに取り込まれられなかった場合、取引状態が「承認されていない」に変更され、コインは使用不能になります。これは、別のノードがあなたの数秒前にブロックを生成した場合に時々起こる場合があります。</translation>
+ <translation type="unfinished">生成されたコインは、%1 ブロックの間成熟後に使用可能になります。このブロックは生成された際、ブロックチェーンに取り込まれるためにネットワークにブロードキャストされました。ブロックチェーンに取り込まれなかった場合、取引状態が「不承認」に変更され、コインは使用不能になります。これは、別のノードがあなたの数秒前にブロックを生成した場合に時々起こる場合があります。</translation>
</message>
<message>
<source>Debug information</source>
@@ -3594,7 +3654,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Transaction</source>
- <translation type="unfinished">トランザクション</translation>
+ <translation type="unfinished">取引</translation>
</message>
<message>
<source>Inputs</source>
@@ -3617,7 +3677,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<name>TransactionDescDialog</name>
<message>
<source>This pane shows a detailed description of the transaction</source>
- <translation type="unfinished">取引の詳細</translation>
+ <translation type="unfinished">このペインには取引の詳細な説明が表示されます</translation>
</message>
<message>
<source>Details for %1</source>
@@ -3644,7 +3704,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Abandoned</source>
- <translation type="unfinished">送信中止</translation>
+ <translation type="unfinished">取消しされました</translation>
</message>
<message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
@@ -3656,11 +3716,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Conflicted</source>
- <translation type="unfinished">衝突</translation>
+ <translation type="unfinished">衝突しました</translation>
</message>
<message>
<source>Immature (%1 confirmations, will be available after %2)</source>
- <translation type="unfinished">未成熟(%1 承認。%2 承認完了後に使用可能)</translation>
+ <translation type="unfinished">未成熟(%1 承認済、%2 承認完了後に使用可能)</translation>
</message>
<message>
<source>Generated but not accepted</source>
@@ -3679,24 +3739,20 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">送金</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">自分への送金</translation>
- </message>
- <message>
<source>Mined</source>
- <translation type="unfinished">発掘</translation>
+ <translation type="unfinished">採掘</translation>
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">ウォッチ限定</translation>
+ <translation type="unfinished">監視専用</translation>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(ラベル無し)</translation>
+ <translation type="unfinished">(ラベルなし)</translation>
</message>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
- <translation type="unfinished">トランザクションステータス。このフィールドの上にカーソルを合わせると承認数が表示されます。</translation>
+ <translation type="unfinished">取引の状態。このフィールドの上にカーソルを合わせると承認数が表示されます。</translation>
</message>
<message>
<source>Date and time that the transaction was received.</source>
@@ -3708,15 +3764,15 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished">ウォッチ限定アドレスがこの取引に含まれているかどうか。</translation>
+ <translation type="unfinished">監視専用のアドレスがこの取引に含まれているか否か。</translation>
</message>
<message>
<source>User-defined intent/purpose of the transaction.</source>
- <translation type="unfinished">ユーザー定義の取引の目的や用途。</translation>
+ <translation type="unfinished">ユーザーが定義した取引の目的や用途。</translation>
</message>
<message>
<source>Amount removed from or added to balance.</source>
- <translation type="unfinished">残高から増えた又は減った総額。</translation>
+ <translation type="unfinished">残高から増えた又は減った金額。</translation>
</message>
</context>
<context>
@@ -3754,12 +3810,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">送金</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">自己送金</translation>
- </message>
- <message>
<source>Mined</source>
- <translation type="unfinished">発掘</translation>
+ <translation type="unfinished">採掘</translation>
</message>
<message>
<source>Other</source>
@@ -3771,7 +3823,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Min amount</source>
- <translation type="unfinished">表示最小金額</translation>
+ <translation type="unfinished">最小金額</translation>
</message>
<message>
<source>Range…</source>
@@ -3791,27 +3843,27 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Copy transaction &amp;ID</source>
- <translation type="unfinished">TxIDをコピー(&amp;I)</translation>
+ <translation type="unfinished">取引 IDをコピー(&amp;I)</translation>
</message>
<message>
<source>Copy &amp;raw transaction</source>
- <translation type="unfinished">RAW-Txをコピー(r)</translation>
+ <translation type="unfinished">取引のRAWデータをコピー(r)</translation>
</message>
<message>
<source>Copy full transaction &amp;details</source>
- <translation type="unfinished">Txの詳細をコピー(d)</translation>
+ <translation type="unfinished">取引の詳細をコピー(d)</translation>
</message>
<message>
<source>&amp;Show transaction details</source>
- <translation type="unfinished">Txの詳細を表示(S)</translation>
+ <translation type="unfinished">取引の詳細を表示(S)</translation>
</message>
<message>
<source>Increase transaction &amp;fee</source>
- <translation type="unfinished">Tx手数料を追加(&amp;f)</translation>
+ <translation type="unfinished">取引手数料を追加(&amp;f)</translation>
</message>
<message>
<source>A&amp;bandon transaction</source>
- <translation type="unfinished">Txを取消す(b)</translation>
+ <translation type="unfinished">取引を取消す(b)</translation>
</message>
<message>
<source>&amp;Edit address label</source>
@@ -3837,7 +3889,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Watch-only</source>
- <translation type="unfinished">ウォッチ限定</translation>
+ <translation type="unfinished">監視専用</translation>
</message>
<message>
<source>Date</source>
@@ -3904,15 +3956,15 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Load Transaction Data</source>
- <translation type="unfinished">トランザクションデータのロード</translation>
+ <translation type="unfinished">取引データのロード</translation>
</message>
<message>
<source>Partially Signed Transaction (*.psbt)</source>
- <translation type="unfinished">部分的に署名されたトランザクション (*.psbt)</translation>
+ <translation type="unfinished">部分的に署名された取引(*.psbt)</translation>
</message>
<message>
<source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">PSBTファイルは、100MBより小さい必要があります。</translation>
+ <translation type="unfinished">PSBTファイルは、100 MiB より小さい必要があります。</translation>
</message>
<message>
<source>Unable to decode PSBT</source>
@@ -3952,7 +4004,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
- <translation type="unfinished">警告: 必要に応じて、お釣り用のアウトプットの額を減らしたり、インプットを追加することで追加手数料を支払うことができます。またお釣り用のアウトプットが存在しない場合、新たな乙利用のアウトプットを追加することもできます。これらの変更はプライバシーをリークする可能性があります。</translation>
+ <translation type="unfinished">警告: 必要に応じて、お釣り用のアウトプットの額を減らしたり、インプットを追加することで追加手数料を支払うことができます。またお釣り用のアウトプットが存在しない場合、新たなお釣り用のアウトプットを追加することもできます。これらの変更はプライバシーをリークする可能性があります。</translation>
</message>
<message>
<source>Confirm fee bump</source>
@@ -3960,7 +4012,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Can't draft transaction.</source>
- <translation type="unfinished">トランザクションのひな型を作成できませんでした。</translation>
+ <translation type="unfinished">取引のひな型を作成できませんでした。</translation>
</message>
<message>
<source>PSBT copied</source>
@@ -3973,11 +4025,11 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Can't sign transaction.</source>
- <translation type="unfinished">トランザクションを署名できませんでした。</translation>
+ <translation type="unfinished">取引に署名できませんでした。</translation>
</message>
<message>
<source>Could not commit transaction</source>
- <translation type="unfinished">トランザクションのコミットに失敗しました</translation>
+ <translation type="unfinished">取引の作成に失敗しました</translation>
</message>
<message>
<source>Can't display address</source>
@@ -4009,7 +4061,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Backup Failed</source>
- <translation type="unfinished">バックアップ失敗</translation>
+ <translation type="unfinished">バックアップに失敗しました</translation>
</message>
<message>
<source>There was an error trying to save the wallet data to %1.</source>
@@ -4017,11 +4069,11 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Backup Successful</source>
- <translation type="unfinished">バックアップ成功</translation>
+ <translation type="unfinished">バックアップに成功しました</translation>
</message>
<message>
<source>The wallet data was successfully saved to %1.</source>
- <translation type="unfinished">ウォレット データは正常に %1 に保存されました。</translation>
+ <translation type="unfinished">ウォレットのデータは正常に %1 に保存されました。</translation>
</message>
<message>
<source>Cancel</source>
@@ -4039,12 +4091,16 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%sが破損しています。ウォレットのツールbitcoin-walletを使って復旧するか、バックアップから復元してみてください。</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s は -assumeutxo スナップショットの状態を検証できませんでした。これは、ハードウェアの問題、ソフトウェアのバグ、または無効なスナップショットのロードを可能にした不適切なソフトウェア変更を示しています。この結果、ノードはシャットダウンし、スナップショットに基づいて構築された状態の使用を停止し、チェーンの高さを %d から %d にリセットします。次回の再起動時に、ノードはスナップショット データを使用せずに %d からの同期を再開します。スナップショットの入手方法も含めて、このインシデントを %s に報告してください。無効なスナップショットのチェーン状態は、このエラーの原因となった問題の診断に役立てるためにディスク上に残されます。</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
- <translation type="unfinished">%s ポート %u でリッスンするように要求します。このポートは「不良」と見なされるため、どのピアもこのポートに接続することはないでしょう。詳細と完全なリストについては、doc/p2p-bad-ports.md を参照してください。</translation>
+ <translation type="unfinished">%s はポート %u でリッスンするように要求します。このポートは「不良」と見なされるため、どのピアもこのポートに接続することはないでしょう。詳細と完全なリストについては、doc/p2p-bad-ports.md を参照してください。</translation>
</message>
<message>
<source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
- <translation type="unfinished">ウォレットをバージョン%iからバージョン%iにダウングレードできません。ウォレットバージョンは変更されていません。</translation>
+ <translation type="unfinished">ウォレットをバージョン%iからバージョン%iにダウングレードできません。ウォレットのバージョンは変更されていません。</translation>
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
@@ -4056,7 +4112,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
- <translation type="unfinished">%sのディスク容量では、ブロックファイルを保存できない可能性があります。%uGBのデータがこのディレクトリに保存されます。</translation>
+ <translation type="unfinished">%s のディスク容量では、ブロックファイルを保存しきれない可能性があります。およそ %u GB のデータがこのディレクトリに保存されます。</translation>
</message>
<message>
<source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
@@ -4067,24 +4123,20 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ウォレットの読み込みに失敗しました。ウォレットはブロックをダウンロードする必要があり、ソフトウェアは現在、assumeutxoスナップショットを使用してブロックが順不同でダウンロードされている間のウォレットの読み込みをサポートしていません。ノードの同期が高さ%sに達したら、ウォレットの読み込みが可能になります。</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">%s の読み込み中にエラーが発生しました! 全ての鍵は正しく読み込めましたが、取引データやアドレス帳の項目が失われたか、正しくない可能性があります。</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">%s が読めません! 取引データが欠落しているか誤っている可能性があります。ウォレットを再スキャンしています。</translation>
</message>
<message>
<source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
- <translation type="unfinished">エラー: Dumpfileのフォーマットレコードが不正です。"%s"が得られましたが、期待値は"format"です。</translation>
+ <translation type="unfinished">エラー: ダンプファイルのフォーマットレコードが不正です。"%s"が得られましたが、期待値は"format"です。</translation>
</message>
<message>
<source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
- <translation type="unfinished">エラー: Dumpfileの識別子レコードが不正です。得られた値は"%s"で、期待値は"%s"です。</translation>
+ <translation type="unfinished">エラー: ダンプファイルの識別子レコードが不正です。得られた値は"%s"で、期待値は"%s"です。</translation>
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <translation type="unfinished">エラー: Dumpfileのバージョンが未指定です。このバージョンのbitcoin-walletは、バージョン1のDumpfileのみをサポートします。バージョン%sのDumpfileを取得しました。</translation>
+ <translation type="unfinished">エラー: ダンプファイルのバージョンがサポート外です。このバージョンの Bitcoin ウォレットは、バージョン 1 のダンプファイルのみをサポートします。バージョン%sのダンプファイルでした。</translation>
</message>
<message>
<source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
@@ -4092,7 +4144,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">エラー: このレガシー ウォレットの記述子を生成できません。ウォレットが暗号化されている場合は、ウォレットのパスフレーズを必ず入力してください。</translation>
+ <translation type="unfinished">エラー: このレガシー ウォレットのディスクリプターを生成できません。ウォレットが暗号化されている場合は、ウォレットのパスフレーズを必ず入力してください。</translation>
</message>
<message>
<source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
@@ -4132,13 +4184,17 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
- <translation type="unfinished">プルーン モードは -reindex-chainstate と互換性がありません。代わりに完全再インデックスを使用してください。</translation>
+ <translation type="unfinished">剪定モードは -reindex-chainstate と互換性がありません。代わりに完全な再インデックス -reindex を使用してください。</translation>
</message>
<message>
<source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
<translation type="unfinished">剪定: 最後のウォレット同期ポイントが、剪定されたデータを越えています。-reindex を実行する必要があります (剪定されたノードの場合、ブロックチェーン全体を再ダウンロードします)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">'%s' -&gt; '%s' の名前変更に失敗しました。 この問題を解決するには、無効なスナップショット ディレクトリ %s を手動で移動または削除する必要があります。そうしないと、次回の起動時に同じエラーが再び発生します。</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: 未知のsqliteウォレットスキーマバージョン %d 。バージョン %d のみがサポートされています</translation>
</message>
@@ -4147,10 +4203,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ブロックデータベースに未来の時刻のブロックが含まれています。お使いのコンピューターの日付と時刻が間違っている可能性があります。コンピュータの日付と時刻が本当に正しい場合にのみ、ブロックデータベースの再構築を実行してください</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">ブロックインデックスのDBには、レガシーの 'txindex' が含まれています。 占有されているディスク領域を開放するには -reindex を実行してください。あるいはこのエラーを無視してください。 このエラーメッセージは今後表示されません。</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">取引の手数料差引後金額が小さすぎるため、送金できません</translation>
</message>
@@ -4164,11 +4216,11 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
- <translation type="unfinished">これは、通常のコイン選択よりも部分支払いの回避を優先するコイン選択を行う際に(通常の手数料に加えて)支払う最大のトランザクション手数料です。</translation>
+ <translation type="unfinished">これは、通常のコイン選択よりも部分支払いの回避を優先するコイン選択を行う際に(通常の手数料に加えて)支払う最大の取引手数料です。</translation>
</message>
<message>
<source>This is the transaction fee you may discard if change is smaller than dust at this level</source>
- <translation type="unfinished">これは、このレベルでダストよりもお釣りが小さい場合に破棄されるトランザクション手数料です</translation>
+ <translation type="unfinished">これは、このレベルでダストよりもお釣りが小さい場合に破棄される取引手数料です</translation>
</message>
<message>
<source>This is the transaction fee you may pay when fee estimates are not available.</source>
@@ -4187,6 +4239,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">未知のウォレットフォーマット"%s"が指定されました。"bdb"もしくは"sqlite"のどちらかを指定してください。</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">サポートされていないカテゴリ固有のログレベルです %1$s=%2$s。 期待値は %1$s=&lt;category&gt;:&lt;loglevel&gt;。 有効なカテゴリ: %3$s。 有効なログレベル: %4$s。</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">サポートされていないチェーンステート データベース形式が見つかりました。 -reindex-chainstate で再起動してください。これにより、チェーンステート データベースが再構築されます。</translation>
</message>
@@ -4195,6 +4251,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ウォレットが正常に作成されました。レガシー ウォレット タイプは非推奨になり、レガシー ウォレットの作成とオープンのサポートは将来的に削除される予定です。</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">ウォレットが正常にロードされました。 レガシーウォレットタイプは非推奨となり、レガシーウォレットの作成と使用のサポートは将来削除される予定です。 レガシーウォレットは、「mergewallet」を使用してディスクリプターウォレットに移行できます。</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">警告: ダンプファイルウォレットフォーマット"%s"は、コマンドラインで指定されたフォーマット"%s"と合致していません。</translation>
</message>
@@ -4208,7 +4268,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
- <translation type="unfinished">高さ%d以降のブロックのwitnessデータには検証が必要です。-reindexを付けて再起動してください。</translation>
+ <translation type="unfinished">高さ%d以降のブロックのwitnessデータは検証が必要です。-reindexを付けて再起動してください。</translation>
</message>
<message>
<source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
@@ -4220,7 +4280,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>-maxmempool must be at least %d MB</source>
- <translation type="unfinished">-maxmempoolは最低でも %d MB必要です</translation>
+ <translation type="unfinished">-maxmempool は最低でも %d MB 必要です</translation>
</message>
<message>
<source>A fatal internal error occurred, see debug.log for details</source>
@@ -4243,28 +4303,8 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">データディレクトリ '%s' に書き込むことができません。アクセス権を確認してください。</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">以前のバージョンで開始された -txindex アップグレードを完了できません。 以前のバージョンで再起動するか、 -reindex を実行してください。</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s は、-assumeutxo スナップショットの状態を検証できませんでした。 これは、ハードウェアの問題、ソフトウェアのバグ、または無効なスナップショットのロードを可能にした不適切なソフトウェアの変更を示しています。 この結果、ノードはシャットダウンし、スナップショット上に構築された状態の使用を停止し、チェーンの高さを %d から %d にリセットします。 次回の再起動時に、ノードはスナップショット データを使用せずに %d から同期を再開します。 スナップショットの取得方法も含めて、このインシデントを %s に報告してください。 このエラーの原因となった問題の診断に役立つように、無効なスナップショット チェーン状態がディスク上に残されています。</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
- <translation type="unfinished">%s が非常に高く設定されています! ひとつの取引でこの金額の手数料が支払われてしまうことがあります。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate オプションは -blockfilterindex と互換性がありません。 -reindex-chainstate の使用中は blockfilterindex を一時的に無効にするか、-reindex-chainstate を -reindex に置き換えてすべてのインデックスを完全に再構築してください。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate オプションは -coinstatsindex と互換性がありません。 -reindex-chainstate の使用中は一時的に coinstatsindex を無効にするか、-reindex-chainstate を -reindex に置き換えてすべてのインデックスを完全に再構築してください。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate オプションは -txindex と互換性がありません。 -reindex-chainstate の使用中は一時的に txindex を無効にするか、-reindex-chainstate を -reindex に置き換えてすべてのインデックスを完全に再構築してください。</translation>
+ <translation type="unfinished">%s が非常に高く設定されています! ひとつの取引でこのような高額の手数料が支払われてしまうことがあります。</translation>
</message>
<message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
@@ -4272,19 +4312,27 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
- <translation type="unfinished">%s のロード中にエラーが発生しました:外​​部署名者ウォレットがロードされています</translation>
+ <translation type="unfinished">%s のロード中にエラーが発生: 外部署名者サポートがコンパイルされていないソフトウエアで外部署名者ウォレットをロードしようとしています</translation>
+ </message>
+ <message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">%s の読み取り中にエラーが発生しました! すべてのキーは正しく読み取られますが、取引データまたはアドレス メタデータが欠落しているか、正しくない可能性があります。</translation>
</message>
<message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">エラー: ウォレット内のアドレス帳データが、移行されたウォレットに属していると識別できません</translation>
+ <translation type="unfinished">エラー: ウォレット内のアドレス帳データが、移行されたウォレットに属しているのか識別できません</translation>
</message>
<message>
<source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
- <translation type="unfinished">エラー: 移行中に作成された重複した記述子。ウォレットが破損している可能性があります。</translation>
+ <translation type="unfinished">エラー: 移行中に作成された重複したディスクリプター。ウォレットが破損している可能性があります。</translation>
</message>
<message>
<source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">エラー: ウォレット内のトランザクション %s は、移行されたウォレットに属していると識別できません</translation>
+ <translation type="unfinished">エラー: ウォレット内の取引%s は、移行されたウォレットに属しているのか識別できません</translation>
+ </message>
+ <message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">未承認の UTXO は未承認の取引の巨大なクラスターに依存しているため、バンプ料金の計算に失敗しました。</translation>
</message>
<message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
@@ -4296,11 +4344,11 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
- <translation type="unfinished">互換性のないオプション: -dnsseed=1 が明示的に指定されましたが、-onlynet は IPv4/IPv6 への接続を禁止します</translation>
+ <translation type="unfinished">不適切なオプション: -dnsseed=1 が明示的に指定されましたが、-onlynet は IPv4/IPv6 への接続を禁止します</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <translation type="unfinished">%s=&lt;amount&gt; オプションに対する不正な設定: '%s' (取引の停滞防止のため、最小中継手数料の %s より大きい必要があります)</translation>
+ <translation type="unfinished">%s=&lt;amount&gt; オプションに対する不正な金額: '%s' (取引の停滞防止のため、最小中継手数料の %s より大きい必要があります)</translation>
</message>
<message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
@@ -4336,16 +4384,17 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">未確認の UTXO は利用可能ですが、それらを使用すると取引の連鎖が形成されるので、メモリプールによって拒否されます。</translation>
+ <translation type="unfinished">未承認の UTXO は利用可能ですが、それらを使用すると取引の連鎖が形成されるので、メモリプールによって拒否されます。</translation>
</message>
<message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
The wallet might have been tampered with or created with malicious intent.
</source>
- <translation type="unfinished">記述子ウォレットに予期しないレガシーエントリーが見つかりました。ウォレット%sを読み込んでいます。
+ <translation type="unfinished">ディスクリプターウォレットに予期しないレガシーエントリーが見つかりました。ウォレット%sを読み込んでいます。
-ウォレットが改竄されたか、悪意をもって作成されている可能性があります。</translation>
+ウォレットが改竄されたか、悪意をもって作成されている可能性があります。
+</translation>
</message>
<message>
<source>Unrecognized descriptor found. Loading wallet %s
@@ -4353,17 +4402,13 @@ The wallet might have been tampered with or created with malicious intent.
The wallet might had been created on a newer version.
Please try running the latest software version.
</source>
- <translation type="unfinished">認識できない記述子が見つかりました。ウォレットをロードしています %s
+ <translation type="unfinished">認識できないディスクリプターが見つかりました。ウォレット %s をロードしています
ウォレットが新しいバージョンで作成された可能性があります。
最新のソフトウェア バージョンを実行してみてください。
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">サポートされていないカテゴリ固有のログ レベル -loglevel=%s。 -loglevel=&lt;category&gt;:&lt;loglevel&gt;. が必要です。有効なカテゴリ:%s 。有効なログレベル:%s .</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4389,15 +4434,15 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Could not find asmap file %s</source>
- <translation type="unfinished">Asmapファイル%sが見つかりませんでした</translation>
+ <translation type="unfinished">ASマップファイル%sが見つかりませんでした</translation>
</message>
<message>
<source>Could not parse asmap file %s</source>
- <translation type="unfinished">Asmapファイル%sを解析できませんでした</translation>
+ <translation type="unfinished">ASマップファイル %s を解析できませんでした</translation>
</message>
<message>
<source>Disk space is too low!</source>
- <translation type="unfinished">ディスク容量不足!</translation>
+ <translation type="unfinished">ディスク容量が不足しています!</translation>
</message>
<message>
<source>Do you want to rebuild the block database now?</source>
@@ -4409,7 +4454,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Dump file %s does not exist.</source>
- <translation type="unfinished">ダンプファイル%sは存在しません。</translation>
+ <translation type="unfinished">ダンプファイル %s が存在しません。</translation>
</message>
<message>
<source>Error creating %s</source>
@@ -4437,7 +4482,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Error loading %s: Wallet requires newer version of %s</source>
- <translation type="unfinished">%s の読み込みエラー: より新しいバージョンの %s が必要です</translation>
+ <translation type="unfinished">%s の読み込みエラー: ウォレットは新しいバージョン %s が必要です</translation>
</message>
<message>
<source>Error loading block database</source>
@@ -4449,7 +4494,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Error reading configuration file: %s</source>
- <translation type="unfinished">エラー: 設定ファイルの読み込み: %s</translation>
+ <translation type="unfinished">設定ファイルの読み込みエラー: %s</translation>
</message>
<message>
<source>Error reading from database, shutting down.</source>
@@ -4464,14 +4509,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">エラー: 生成されたscriptpubkeyから宛先を抽出できません</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">¡エラー: watchonly tx を watchonly ウォレットに追加できませんでした</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">エラー: watchonly トランザクションを削除できませんでした</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">エラー: データベースにカーソルを作成できませんでした</translation>
</message>
@@ -4485,15 +4522,15 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">エラー: 新しい watchonly ウォレットを作成できませんでした</translation>
+ <translation type="unfinished">エラー: 新しい監視専用ウォレットを作成できませんでした</translation>
</message>
<message>
<source>Error: Got key that was not hex: %s</source>
- <translation type="unfinished">エラー: hexではない鍵を取得しました: %s</translation>
+ <translation type="unfinished">エラー: 16進ではない鍵を取得しました: %s</translation>
</message>
<message>
<source>Error: Got value that was not hex: %s</source>
- <translation type="unfinished">エラー: hexではない値を取得しました: %s</translation>
+ <translation type="unfinished">エラー: 16進ではない値を取得しました: %s</translation>
</message>
<message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
@@ -4505,11 +4542,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Error: No %s addresses available.</source>
- <translation type="unfinished">エラー: %sアドレスはありません。</translation>
- </message>
- <message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">エラー: 一部の watchonly tx を削除できませんでした</translation>
+ <translation type="unfinished">エラー: %sアドレスは使えません。</translation>
</message>
<message>
<source>Error: This wallet already uses SQLite</source>
@@ -4517,7 +4550,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">エラー: このウォレットはすでに記述子ウォレットです</translation>
+ <translation type="unfinished">エラー: このウォレットはすでにディスクリプターウォレットです</translation>
</message>
<message>
<source>Error: Unable to begin reading all records in the database</source>
@@ -4536,14 +4569,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">エラー: データベース内のすべてのレコードを読み取ることができません</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">エラー:ウォレットのベストブロックロケーターレコードを読み込めません</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">エラー: watchonly アドレス帳データを削除できません</translation>
+ <translation type="unfinished">エラー: 監視専用アドレス帳データを削除できません</translation>
</message>
<message>
<source>Error: Unable to write record to new wallet</source>
<translation type="unfinished">エラー: 新しいウォレットにレコードを書き込めません</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">エラー:解決可能なウォレットのベストブロックロケーターレコードを書き込めません</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">エラー:監視専用ウォレットのベストブロックロケーターレコードを書き込めません</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">ポートのリッスンに失敗しました。必要であれば -listen=0 を指定してください。</translation>
</message>
@@ -4552,6 +4597,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初期化中にウォレットの再スキャンに失敗しました</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">インデックスの開始に失敗しました。シャットダウンします...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">データベースの検証に失敗しました</translation>
</message>
@@ -4561,7 +4610,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Ignoring duplicate -wallet %s.</source>
- <translation type="unfinished">重複するウォレット%sを無視します。</translation>
+ <translation type="unfinished">重複するウォレット -wallet %s を無視します。</translation>
</message>
<message>
<source>Importing…</source>
@@ -4569,7 +4618,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Incorrect or no genesis block found. Wrong datadir for network?</source>
- <translation type="unfinished">ジェネシスブロックが不正であるか、見つかりません。ネットワークの datadir が間違っていませんか?</translation>
+ <translation type="unfinished">ジェネシスブロックが不正であるか、見つかりません。ネットワークに対するデータディレクトリが間違っていませんか?</translation>
</message>
<message>
<source>Initialization sanity check failed. %s is shutting down.</source>
@@ -4581,23 +4630,23 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">ブロック検証用のdbcacheが不足しています</translation>
+ <translation type="unfinished">ブロック検証用のデータベース用キャッシュが不足しています</translation>
</message>
<message>
<source>Insufficient funds</source>
- <translation type="unfinished">残高不足</translation>
+ <translation type="unfinished">残高不足です</translation>
</message>
<message>
<source>Invalid -i2psam address or hostname: '%s'</source>
- <translation type="unfinished">無効な -i2psamアドレス、もしくはホスト名: '%s'</translation>
+ <translation type="unfinished">-i2psam オプションに対する無効なアドレスまたはホスト名: '%s'</translation>
</message>
<message>
<source>Invalid -onion address or hostname: '%s'</source>
- <translation type="unfinished">-onion オプションに対する不正なアドレスまたはホスト名: '%s'</translation>
+ <translation type="unfinished">-onion オプションに対する無効なアドレスまたはホスト名: '%s'</translation>
</message>
<message>
<source>Invalid -proxy address or hostname: '%s'</source>
- <translation type="unfinished">-proxy オプションに対する不正なアドレスまたはホスト名: '%s'</translation>
+ <translation type="unfinished">-proxy オプションに対する無効なアドレスまたはホスト名: '%s'</translation>
</message>
<message>
<source>Invalid P2P permission: '%s'</source>
@@ -4613,7 +4662,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">-%s=&lt;amount&gt; オプションに対する不正な amount: '%s'</translation>
+ <translation type="unfinished">-%s=&lt;amount&gt; オプションに対する不正な設定: '%s'</translation>
</message>
<message>
<source>Invalid netmask specified in -whitelist: '%s'</source>
@@ -4621,7 +4670,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">%sで無効なポートが指定されました: '%s'</translation>
+ <translation type="unfinished">%sに対する無効なポート指定: '%s'</translation>
</message>
<message>
<source>Invalid pre-selected input %s</source>
@@ -4637,7 +4686,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Loading banlist…</source>
- <translation type="unfinished">banリストの読み込み中…</translation>
+ <translation type="unfinished">Banリストの読み込み中…</translation>
</message>
<message>
<source>Loading block index…</source>
@@ -4665,7 +4714,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Not enough file descriptors available.</source>
- <translation type="unfinished">使用可能なファイルディスクリプタが不足しています。</translation>
+ <translation type="unfinished">使用可能なファイルディスクリプターが不足しています。</translation>
</message>
<message>
<source>Not found pre-selected input %s</source>
@@ -4705,7 +4754,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
- <translation type="unfinished">SQLiteDatabase: データベースを検証するプリペアドステートメントの作成に失敗しました: %s</translation>
+ <translation type="unfinished">SQLiteDatabase: データベースを検証するステートメントの準備に失敗しました: %s</translation>
</message>
<message>
<source>SQLiteDatabase: Failed to read database verification error: %s</source>
@@ -4757,7 +4806,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>The transaction amount is too small to pay the fee</source>
- <translation type="unfinished">取引の手数料差引後金額が小さすぎるため、送金できません</translation>
+ <translation type="unfinished">取引金額が小さすぎるので手数料を支払えません</translation>
</message>
<message>
<source>The wallet will avoid paying less than the minimum relay fee.</source>
@@ -4788,12 +4837,8 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">取引のお釣りのアウトプットインデックスが規定の範囲外です</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">トランザクションのmempoolチェーンが長すぎます</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
- <translation type="unfinished">トランザクションは最低ひとつの受取先が必要です</translation>
+ <translation type="unfinished">取引は最低ひとつの受取先が必要です</translation>
</message>
<message>
<source>Transaction needs a change address, but we can't generate it.</source>
@@ -4801,7 +4846,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Transaction too large</source>
- <translation type="unfinished">トランザクションが大きすぎます</translation>
+ <translation type="unfinished">取引が大きすぎます</translation>
</message>
<message>
<source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
@@ -4809,7 +4854,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
- <translation type="unfinished">このコンピュータの %s にバインドすることができません(%s エラーが返却されました)</translation>
+ <translation type="unfinished">このコンピュータの %s にバインドすることができません(%s エラーが返されました)</translation>
</message>
<message>
<source>Unable to bind to %s on this computer. %s is probably already running.</source>
@@ -4841,7 +4886,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Unable to start HTTP server. See debug log for details.</source>
- <translation type="unfinished">HTTPサーバを開始できませんでした。詳細は debug.log を参照してください。</translation>
+ <translation type="unfinished">HTTPサーバを開始できません。詳細は debug.log を参照してください。</translation>
</message>
<message>
<source>Unable to unload the wallet before migrating</source>
@@ -4853,11 +4898,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Unknown address type '%s'</source>
- <translation type="unfinished">未知のアドレス形式 '%s' です</translation>
+ <translation type="unfinished">不明なアドレス形式 '%s' </translation>
</message>
<message>
<source>Unknown change type '%s'</source>
- <translation type="unfinished">未知のおつり用アドレス形式 '%s' です</translation>
+ <translation type="unfinished">不明なお釣りのアドレス形式 '%s' </translation>
</message>
<message>
<source>Unknown network specified in -onlynet: '%s'</source>
@@ -4868,14 +4913,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不明な新ルールがアクティベートされました (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">サポートされていないグローバル ログ レベル -loglevel=%s。有効な値: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">未サポートのログレベル %s=%s。 正しい値は: %s。</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">ウォレットファイルの作成に失敗しました:%s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">%s チェーンでは acceptstalefeeestimates はサポートされていません。</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">サポートされていないログカテゴリ %s=%s 。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">エラー: 監視対象取引%sを監視専用ウォレットに追加できませんでした</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">ユーザエージェントのコメント ( %s ) に安全でない文字が含まれています。</translation>
</message>
@@ -4893,11 +4950,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Settings file could not be read</source>
- <translation type="unfinished">設定ファイルを読めません</translation>
+ <translation type="unfinished">設定ファイルを読めませんでした</translation>
</message>
<message>
<source>Settings file could not be written</source>
- <translation type="unfinished">設定ファイルを書けません</translation>
+ <translation type="unfinished">設定ファイルを書けませんでした</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_ka.ts b/src/qt/locale/bitcoin_ka.ts
index 27e8650986..e15938e277 100644
--- a/src/qt/locale/bitcoin_ka.ts
+++ b/src/qt/locale/bitcoin_ka.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;არჩევა</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">გასაგზავნი მისამართები</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">მიმღები მისამართები</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">ეს არის თქვენი ბიტკოინ-მისამართები გადარიცხვებისათვის. აუცილებლად შეამოწმეთ მითითებული თანხა და მიმღები მისამართი კოინების გადარიცხვამდე.</translation>
</message>
@@ -799,10 +791,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">საკომისიო:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">მტვერი:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">დამატებითი საკომისიო:</translation>
</message>
@@ -887,14 +875,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 დაბლოკილია)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">დიახ</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">არა</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(ნიშნული არ არის)</translation>
</message>
@@ -1104,6 +1084,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>The wallet will also be stored in this directory.</source>
+ <translation type="unfinished">საფულე ასევე შეინახება ამ დირექტორიაში.</translation>
+ </message>
+ <message>
<source>Error: Specified data directory "%1" cannot be created.</source>
<translation type="unfinished">შეცდომა: მითითებულ მონაცემთა დირექტორია „%1“ არ არის შექმნილი.</translation>
</message>
@@ -1228,6 +1212,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;მთავარი</translation>
</message>
<message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">ავტომატურად დაიწყება %1 სისტემაში შესვლის შემდეგ.</translation>
+ </message>
+ <message>
<source>Size of &amp;database cache</source>
<translation type="unfinished">მონაცემთა ბაზის კეშის სი&amp;დიდე</translation>
</message>
@@ -1469,6 +1457,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">მეტი შენატანის ხელმოწერა ვერ მოხერხდა.</translation>
</message>
<message>
+ <source>Signed %1 inputs, but more signatures are still required.</source>
+ <translation type="unfinished">ხელმოწერილია %1 შენატანი, მაგრამ მაინც საჭიროა უფრო მეტი ხელმოწერები.</translation>
+ </message>
+ <message>
<source>Unknown error processing transaction.</source>
<translation type="unfinished">ტრანზაქციის დამუშავებისას მოხდა უცნობი შეცდომა.</translation>
</message>
@@ -1498,6 +1490,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT შენახულია დისკზე.</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">საკუთარი მისამართი</translation>
+ </message>
+ <message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
<translation type="unfinished">ტრანზაქციის საკომისიოს ან მთლიანი ტრანზაქციის თანხის გამოთვლა შეუძლებელია.</translation>
</message>
@@ -1713,7 +1709,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Addresses Rate-Limited</source>
<extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">მისამართების შეფასება შეზღუდულია</translation>
+ <translation type="unfinished">მისამართების განაკვეთი შეზღუდულია</translation>
</message>
<message>
<source>User Agent</source>
@@ -1815,7 +1811,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Unban</source>
- <translation type="unfinished">&amp;ბანის მოხსნა</translation>
+ <translation type="unfinished">&amp;აკრძალვის მოხსნა</translation>
</message>
<message>
<source>Network activity disabled</source>
@@ -2086,10 +2082,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">შეყვანები…</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">მტვერი:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">აირჩიეთ…</translation>
</message>
@@ -2461,7 +2453,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Total debit</source>
- <translation type="unfinished">სულ დებეტი</translation>
+ <translation type="unfinished">დებეტი სულ</translation>
</message>
<message>
<source>Total credit</source>
@@ -2590,10 +2582,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">გაგზავნილია</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">გადახდილია საკუთარი თავისათვის</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">მოპოვებულია</translation>
</message>
@@ -2657,10 +2645,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">გაგზავნილია</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">საკუთარი თავისათვის</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">მოპოვებულია</translation>
</message>
@@ -2690,7 +2674,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Copy transaction &amp;ID</source>
- <translation type="unfinished">ტრანზაქციის დაკოპირება &amp; ID</translation>
+ <translation type="unfinished">ტრანზაქციის დაკოპირება &amp;ID</translation>
</message>
<message>
<source>Copy &amp;raw transaction</source>
diff --git a/src/qt/locale/bitcoin_kk.ts b/src/qt/locale/bitcoin_kk.ts
index dafb5d080a..d40c6e56a1 100644
--- a/src/qt/locale/bitcoin_kk.ts
+++ b/src/qt/locale/bitcoin_kk.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">Т&amp;аңдау</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Жіберуші мекенжайлар</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Қабылдаушы мекенжайлар</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Бұл сіздің төлем жіберетін Bitcoin мекенжайларыңыз. Тиын жібермес бұрын, әрқашан сома мен алушы мекенжайды тексеріңіз.</translation>
</message>
@@ -551,10 +543,6 @@
<translation type="unfinished">Комиссия</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Шаң</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Комиссия алу кейін</translation>
</message>
@@ -575,10 +563,6 @@
<translation type="unfinished">Растық</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">Иа</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(белгі жоқ)</translation>
</message>
@@ -653,7 +637,7 @@
</message>
<message>
<source>Error</source>
- <translation type="unfinished">қате</translation>
+ <translation type="unfinished">Қате</translation>
</message>
<message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
@@ -684,7 +668,7 @@
</message>
<message>
<source>Error</source>
- <translation type="unfinished">қате</translation>
+ <translation type="unfinished">Қате</translation>
</message>
</context>
<context>
@@ -772,10 +756,6 @@
<source>After Fee:</source>
<translation type="unfinished">Комиссия алу кейін</translation>
</message>
- <message>
- <source>Dust:</source>
- <translation type="unfinished">Шаң</translation>
- </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -879,7 +859,7 @@
</message>
<message>
<source>Error</source>
- <translation type="unfinished">қате</translation>
+ <translation type="unfinished">Қате</translation>
</message>
</context>
<context>
diff --git a/src/qt/locale/bitcoin_kk@latin.ts b/src/qt/locale/bitcoin_kk@latin.ts
new file mode 100644
index 0000000000..981b8a191c
--- /dev/null
+++ b/src/qt/locale/bitcoin_kk@latin.ts
@@ -0,0 +1,891 @@
+<TS version="2.1" language="kk@latin">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">Мекенжай немесе белгі өңдеу үшін оң клик</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation type="unfinished">Жаңа мекенжай құру</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Жаңа</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation type="unfinished">Таңдалған мекенжайды жүйенің айырбастау буферіне көшіру</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished">&amp;Көшіру</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation type="unfinished">Ж&amp;абу</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation type="unfinished">Таңдалған мекенжайды тізімнен жою</translation>
+ </message>
+ <message>
+ <source>Enter address or label to search</source>
+ <translation type="unfinished">Іздеу үшін мекенжай немесе белгі енгізіңіз</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Қазіргі қойыншадағы деректерді файлға экспорттау</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Экспорттау</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Жою</translation>
+ </message>
+ <message>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">Тиын жіберуге мекенжай таңдаңыз</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation type="unfinished">Тиын қабылдайтын мекенжай таңдаңыз</translation>
+ </message>
+ <message>
+ <source>C&amp;hoose</source>
+ <translation type="unfinished">Т&amp;аңдау</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
+ <translation type="unfinished">Бұл сіздің төлем жіберетін Bitcoin мекенжайларыңыз. Тиын жібермес бұрын, әрқашан сома мен алушы мекенжайды тексеріңіз.</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Address</source>
+ <translation type="unfinished">&amp;Мекенжайды көшіру</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Label</source>
+ <translation type="unfinished">Белгіні &amp;көшіру</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished">&amp;Өңдеу</translation>
+ </message>
+ <message>
+ <source>Export Address List</source>
+ <translation type="unfinished">Мекенжай тізімін экспорттау</translation>
+ </message>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">Үтірмен бөлінген файл</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
+ <translation type="unfinished">Мекенжай тізімін %1 дегенге сақтағанда, қате пайда болды. Қайталап көріңіз. </translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Экспортталмады</translation>
+ </message>
+</context>
+<context>
+ <name>AddressTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Белгі</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Мекенжай</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(белгі жоқ)</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Passphrase Dialog</source>
+ <translation type="unfinished">Құпиясөйлем диалогі</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation type="unfinished">Құпиясөйлем енгізу</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation type="unfinished">Жаңа құпиясөйлем</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation type="unfinished">Жаңа құпиясөйлемді қайталаңыз</translation>
+ </message>
+ <message>
+ <source>Show passphrase</source>
+ <translation type="unfinished">Құпиясөйлемді көрсету</translation>
+ </message>
+ <message>
+ <source>Encrypt wallet</source>
+ <translation type="unfinished">Әмиянды шифрлау</translation>
+ </message>
+ <message>
+ <source>This operation needs your wallet passphrase to unlock the wallet.</source>
+ <translation type="unfinished">Бұл операцияға әмиянды ашу үшін әмияныңыздың құпиясөйлемі керек.</translation>
+ </message>
+ <message>
+ <source>Unlock wallet</source>
+ <translation type="unfinished">Әмиянды бұғатсыздау</translation>
+ </message>
+ <message>
+ <source>Change passphrase</source>
+ <translation type="unfinished">Құпиясөйлемді өзгерту</translation>
+ </message>
+ <message>
+ <source>Confirm wallet encryption</source>
+ <translation type="unfinished">Әмиян шифрлауды растау</translation>
+ </message>
+ <message>
+ <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
+ <translation type="unfinished">Ескерту: әмияныңызды шифрлап, құпиясөйлеміңізден айырылып қалсаңыз, &lt;b&gt;БАРЛЫҚ BITCOIN-ІҢІЗДЕН ДЕ АЙЫРЫЛАСЫЗ&lt;/b&gt;!</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to encrypt your wallet?</source>
+ <translation type="unfinished">Әмияныңызды шифрлағыңыз келе ме?</translation>
+ </message>
+ <message>
+ <source>Wallet encrypted</source>
+ <translation type="unfinished">Әмиян шифрланды</translation>
+ </message>
+ <message>
+ <source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
+ <translation type="unfinished">Әмиянның жаңа құпиясөйлемін енгізіңіз.&lt;br/&gt;Құпиясөйлеміңіз &lt;b&gt;10+ кездейсоқ таңбадан&lt;/b&gt; немесе &lt;b&gt;8+ сөзден&lt;/b&gt; тұрсын.</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase for the wallet.</source>
+ <translation type="unfinished">Әмияныңыздың ескі құпиясөйлемі мен жаңа құпиясөйлемін енгізіңіз.</translation>
+ </message>
+ <message>
+ <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation type="unfinished">Шифрлау биткоиніңізді компьютер жұқтырған зиянды БЖ-дан толығымен қорғай алмайтынын есіңізде сақтаңыз.</translation>
+ </message>
+ <message>
+ <source>Wallet to be encrypted</source>
+ <translation type="unfinished">Шифланатын әмиян</translation>
+ </message>
+ <message>
+ <source>Your wallet is about to be encrypted. </source>
+ <translation type="unfinished">Әмияныңыз шифрланады.</translation>
+ </message>
+ <message>
+ <source>Your wallet is now encrypted. </source>
+ <translation type="unfinished">Әмияныңыз шифрланды.</translation>
+ </message>
+ <message>
+ <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
+ <translation type="unfinished">МАҢЫЗДЫ: әмиян файлының бұрынғы резервтік көшірмелерінің бәрі жаңа құрылған шифрлы әмиян файлымен ауыстырылуы керек. Қауіпсіздік мақсатында жаңа шифрланған әмиянды қолданып бастағаныңыздан кейін, бұрынғы шифрланбаған әмиян файлының резервтік көшірмелері жарамсыз болып кетеді.</translation>
+ </message>
+ <message>
+ <source>Wallet encryption failed</source>
+ <translation type="unfinished">Әмиян шифланбады</translation>
+ </message>
+ <message>
+ <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
+ <translation type="unfinished">Әмиян ішкі қате кесірінен шифланбады.</translation>
+ </message>
+ <message>
+ <source>The supplied passphrases do not match.</source>
+ <translation type="unfinished">Енгізілген құпиясөйлемдер сай келмейді.</translation>
+ </message>
+ <message>
+ <source>Wallet unlock failed</source>
+ <translation type="unfinished">Әмиян бұғатсызданбады</translation>
+ </message>
+ <message>
+ <source>The passphrase entered for the wallet decryption was incorrect.</source>
+ <translation type="unfinished">Әмиянды шифрсыздау үшін енгізілген құпиясөйлем бұрыс болды.</translation>
+ </message>
+ <message>
+ <source>Wallet passphrase was successfully changed.</source>
+ <translation type="unfinished">Әмиян құпиясөйлемі сәтті өзгертілді.</translation>
+ </message>
+ <message>
+ <source>Warning: The Caps Lock key is on!</source>
+ <translation type="unfinished">Ескерту: Caps Lock пернесі қосулы!</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>IP/Netmask</source>
+ <translation type="unfinished">IP/Субжелі бетпердесі</translation>
+ </message>
+ </context>
+<context>
+ <name>BitcoinApplication</name>
+ <message>
+ <source>Internal error</source>
+ <translation type="unfinished">Ішкі қате</translation>
+ </message>
+ </context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Қате: %1</translation>
+ </message>
+ <message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1 қауіпсіз түрде шығып бітпеді...</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">Сан</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n second(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n minute(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>%1 and %2</source>
+ <translation type="unfinished">%1 немесе %2</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>&amp;Overview</source>
+ <translation type="unfinished">&amp;Шолу</translation>
+ </message>
+ <message>
+ <source>Show general overview of wallet</source>
+ <translation type="unfinished">Негізгі әмиян шолуды көрсету</translation>
+ </message>
+ <message>
+ <source>&amp;Transactions</source>
+ <translation type="unfinished">&amp;Транзакциялар</translation>
+ </message>
+ <message>
+ <source>Browse transaction history</source>
+ <translation type="unfinished">Транзакция тарихын шолу</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished">Ш&amp;ығу</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation type="unfinished">Қосымшадан шығу</translation>
+ </message>
+ <message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">&amp;%1 туралы</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">%1 туралы ақпаратты көрсету</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished">Qt &amp;туралы</translation>
+ </message>
+ <message>
+ <source>Show information about Qt</source>
+ <translation type="unfinished">Qt туралы ақпаратты көрсету</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">%1 конфигурация баптауларын өзгерту</translation>
+ </message>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">Жаңа әмиян құру</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Әмиян:</translation>
+ </message>
+ <message>
+ <source>Network activity disabled.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">Желі белсенділігі өшірулі.</translation>
+ </message>
+ <message>
+ <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
+ <translation type="unfinished">Прокси &lt;b&gt;қосулы&lt;/b&gt;: %1</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation type="unfinished">Bitcoin мекенжайына тиын жіберу</translation>
+ </message>
+ <message>
+ <source>Backup wallet to another location</source>
+ <translation type="unfinished">Басқа локацияға әмиянның резервтік көшірмесін жасау</translation>
+ </message>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">Әмиян шифрлауға қолданылған құпиясөйлемді өзгерту</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation type="unfinished">&amp;Жіберу</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation type="unfinished">&amp;Қабылдау</translation>
+ </message>
+ <message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Баптау…</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp;Әмиянды шифрлау…</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation type="unfinished">Әмияныңызға тиесілі жеке кілттерді шифрлау</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">&amp;Әмиянның резервтік көшірмесін жасау…</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;Құпиясөйлемді өзгерту…</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">Хатқа &amp;қол қою…</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">Хатқа Bitcoin мекенжайларын қосып, олар сізге тиесілі екенін дәлелдеу</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Хат тексеру…</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation type="unfinished">Хат тексеріп, берілген Bitcoin мекенжайлары қосылғанына көз жеткізу</translation>
+ </message>
+ <message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Файлдан PSBT жүктеу…</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">URI &amp;ашу…</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Әмиянды жабу…</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Әмиян құру…</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Барлық әмиянды жабу…</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">Файл</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;Баптау</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">Көмек</translation>
+ </message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">Қойынша құралдар тақтасы</translation>
+ </message>
+ <message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Тақырыптар синхрондалуда (%1%)…</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Желімен синхрондасуда…</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Дискідегі блоктар инедекстелуде...</translation>
+ </message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation type="unfinished">Төлем талап ету (QR кодтары мен биткоин құрады: URI)</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation type="unfinished">Қолданылған жіберу мекенжайлары мен белгілер тізімін көрсету</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation type="unfinished">Қолданылған қабылдау мекенжайлары мен белгілер тізімін көрсету</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>%1 behind</source>
+ <translation type="unfinished">%1 артта</translation>
+ </message>
+ <message>
+ <source>Catching up…</source>
+ <translation type="unfinished">Синхрондауда...</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Қате</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="unfinished">Ескерту</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation type="unfinished">Ақпарат</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation type="unfinished">Жаңартылған</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Әмиян ашу</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Әмиянды жабу</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Барлық әмиянды жабу</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Терезе</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Қате: %1</translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Саны</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">Комиссия</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">Комиссия алу кейін</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">Сан</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">Күні</translation>
+ </message>
+ <message>
+ <source>Confirmations</source>
+ <translation type="unfinished">Растау саны</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">Растық</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(белгі жоқ)</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletController</name>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Әмиянды жабу</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Барлық әмиянды жабу</translation>
+ </message>
+ </context>
+<context>
+ <name>CreateWalletDialog</name>
+ <message>
+ <source>Wallet</source>
+ <translation type="unfinished">Әмиян</translation>
+ </message>
+ </context>
+<context>
+ <name>EditAddressDialog</name>
+ <message>
+ <source>&amp;Label</source>
+ <translation type="unfinished">&amp;Белгі</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">Адрес</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Bitcoin</source>
+ <translation type="unfinished">Биткоин</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n GB of space available</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(%n GB needed for full chain)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(sufficient to restore backups %n day(s) old)</source>
+ <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>%1 will download and store a copy of the Bitcoin block chain.</source>
+ <translation type="unfinished">%1 Bitcoin блокчейнінің көшірмесін жүктеп сақтайды.</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Қате</translation>
+ </message>
+ <message>
+ <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
+ <translation type="unfinished">Бастапқы синхронизация өте қымбат және компьютеріңіздің байқалмаған жабдық мәселелерін ашуы мүмкін. %1 қосылған сайын, жүктеу тоқтатылған жерден бастап жалғасады.</translation>
+ </message>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ <message>
+ <source>Options</source>
+ <translation type="unfinished">Баптау</translation>
+ </message>
+ <message>
+ <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
+ <translation type="unfinished">Проксидің IP мекенжайы (мысалы, IPv4: 127.0.0.1 / IPv6: ::1)</translation>
+ </message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">Әмиян</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">UPnP арқылы порт &amp;сәйкестендіру</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp;Терезе</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Қате</translation>
+ </message>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ <message>
+ <source>Address</source>
+ <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
+ <translation type="unfinished">Мекенжай</translation>
+ </message>
+ </context>
+<context>
+ <name>QRImageWidget</name>
+ <message>
+ <source>Error encoding URI into QR Code.</source>
+ <translation type="unfinished">URI-дің QR кодына кодталу қатесі.</translation>
+ </message>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>&amp;Information</source>
+ <translation type="unfinished">Информация</translation>
+ </message>
+ <message>
+ <source>Number of connections</source>
+ <translation type="unfinished">Қосылымдар саны</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation type="unfinished">Қаріп өлшемін төмендету</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">Пәрмен әмиянсыз орындалуда</translation>
+ </message>
+ </context>
+<context>
+ <name>ReceiveCoinsDialog</name>
+ <message>
+ <source>&amp;Amount:</source>
+ <translation type="unfinished">Саны</translation>
+ </message>
+ <message>
+ <source>Requested payments history</source>
+ <translation type="unfinished">Төлемдер тарихы сұралды</translation>
+ </message>
+ </context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Саны</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Әмиян:</translation>
+ </message>
+ </context>
+<context>
+ <name>RecentRequestsTableModel</name>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">Күні</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Белгі</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(белгі жоқ)</translation>
+ </message>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Саны</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">Комиссия</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">Комиссия алу кейін</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(белгі жоқ)</translation>
+ </message>
+</context>
+<context>
+ <name>SendCoinsEntry</name>
+ <message>
+ <source>A&amp;mount:</source>
+ <translation type="unfinished">Саны</translation>
+ </message>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">Хат &amp;тексеру</translation>
+ </message>
+ <message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">Хат тексерілмеді</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionDesc</name>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">Күні</translation>
+ </message>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">Сан</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">Күні</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Белгі</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(белгі жоқ)</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionView</name>
+ <message>
+ <source>Other</source>
+ <translation type="unfinished">Басқа</translation>
+ </message>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">Үтірмен бөлінген файл</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">Растық</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">Күні</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Белгі</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Мекенжай</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Экспортталмады</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletFrame</name>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">Жаңа әмиян құру</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Қате</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletView</name>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Экспорттау</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Қазіргі қойыншадағы деректерді файлға экспорттау</translation>
+ </message>
+ </context>
+<context>
+ <name>bitcoin-core</name>
+ <message>
+ <source>Transaction amount too small</source>
+ <translation type="unfinished">Транзакция өте кішкентай</translation>
+ </message>
+ <message>
+ <source>Transaction too large</source>
+ <translation type="unfinished">Транзакция өте үлкен</translation>
+ </message>
+ <message>
+ <source>Verifying wallet(s)…</source>
+ <translation type="unfinished">Әмиян(дар) тексерілуде…</translation>
+ </message>
+ </context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_km.ts b/src/qt/locale/bitcoin_km.ts
index 55de3ae8fd..e62aee0aff 100644
--- a/src/qt/locale/bitcoin_km.ts
+++ b/src/qt/locale/bitcoin_km.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">ជ្រើសរើស(&amp;h)</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">អាសយដ្ឋានសម្រាប់ផ្ញើ</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">អាសយដ្ឋានសម្រាប់ទទួល</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">ទាំងនេះ​គឺជាអាសយដ្ឋាន Bitcoin របស់អ្នកសម្រាប់ធ្វើការផ្ញើការបង់ប្រាក់។ តែងតែពិនិត្យមើលចំនួនប្រាក់ និងអាសយដ្ឋានដែលទទួល មុនពេលផ្ញើប្រាក់។</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">មានបញ្ហាក្នុងការព្យាយាម រក្សាទុកបញ្ជីអាសយដ្ឋានដល់ %1។ សូមព្យាយាមម្ដងទៀត។</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">កំពុងផ្ញើអាសយដ្ឋាន%1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">ទទួលអាសយដ្ឋាន - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">ការនាំចេញបានបរាជ័យ</translation>
</message>
@@ -638,6 +638,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">បិទកាបូបអេឡិចត្រូនិចទាំងអស់</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">កាបូបMigrate</translation>
+ </message>
+ <message>
<source>No wallets available</source>
<translation type="unfinished">មិនមានកាបូបអេឡិចត្រូនិច</translation>
</message>
@@ -663,23 +667,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Window</source>
- <translation type="unfinished">វិនដូ(&amp;W)</translation>
- </message>
- <message>
- <source>Main Window</source>
- <translation type="unfinished">វិនដូចម្បង</translation>
- </message>
- <message>
- <source>%1 client</source>
- <translation type="unfinished">%1 អតិថិជន</translation>
+ <translation type="unfinished">&amp;វិនដូ</translation>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">លាក់(&amp;H)</translation>
+ <translation type="unfinished">&amp;លាក់</translation>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">របៀប(&amp;S)</translation>
+ <translation type="unfinished">S&amp;របៀប</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -710,10 +706,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">បើកសកម្មភាពបណ្តាញ</translation>
</message>
<message>
- <source>Error: %1</source>
- <translation type="unfinished">កំហុស៖%1</translation>
- </message>
- <message>
<source>Warning: %1</source>
<translation type="unfinished">ប្រុងប្រយ័ត្នៈ %1</translation>
</message>
@@ -816,10 +808,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">តម្លៃសេវា៖</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">ធូលី៖</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">បន្ទាប់ពីតម្លៃសេវា៖</translation>
</message>
@@ -900,30 +888,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ចម្លងតម្លៃ</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">ចម្លងធូលី</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation type="unfinished">ចម្លងការផ្លាស់ប្តូរ</translation>
- </message>
- <message>
- <source>(%1 locked)</source>
- <translation type="unfinished">(%1បានចាក់សោរ)</translation>
- </message>
- <message>
- <source>yes</source>
- <translation type="unfinished">បាទ ឬ ចាស</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ទេ</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">ស្លាកសញ្ញានេះបង្ហាញពណ៌ក្រហម ប្រសិនបើអ្នកទទួល ទទួលបានចំនួនមួយតិចជាងចំនួនចាប់ផ្តើមបច្ចុប្បន្ន។</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">អាច +/- %1 satoshi(s)ច្រើនក្នុងការបញ្ជូលមួយ។</translation>
</message>
@@ -983,6 +947,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">កាបូបMigrate</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1433,7 +1404,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Window</source>
- <translation type="unfinished">វិនដូ(&amp;W)</translation>
+ <translation type="unfinished">&amp;វិនដូ</translation>
</message>
<message>
<source>&amp;Display</source>
@@ -1608,6 +1579,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT បានរក្សាទុកក្នុងឌីស។</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">អាសយដ្ឋានផ្ទាល់ខ្លួន</translation>
+ </message>
+ <message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
<translation type="unfinished">មិនអាចគណនាកម្រៃប្រត្តិបត្តិការ ឬ ចំនួនប្រត្តិបត្តិការសរុប។</translation>
</message>
@@ -1884,7 +1859,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">ពេលវេលាប្លុកចុងក្រោយ</translation>
+ <translation type="unfinished">ពេវេលាប្លុកជុងក្រោយ</translation>
</message>
<message>
<source>&amp;Network Traffic</source>
@@ -2206,10 +2181,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ធាតុចូល...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">ធូលី៖</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">ជ្រើសរើស…</translation>
</message>
@@ -2262,14 +2233,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">ចម្លងតម្លៃ</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">ចម្លងធូលី</translation>
- </message>
- <message>
- <source>Copy change</source>
- <translation type="unfinished">ចម្លងការផ្លាស់ប្តូរ</translation>
- </message>
- <message>
<source>Sign on device</source>
<extracomment>"device" usually means a hardware wallet.</extracomment>
<translation type="unfinished">ចុះហត្ថលេខាលើឧបករណ៍</translation>
@@ -2716,10 +2679,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">បានបញ្ចូនទៅកាន់</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">បង់ប្រាក់ទៅខ្លួនអ្នក</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">បានរុករករ៉ែ</translation>
</message>
@@ -2787,10 +2746,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">បានបញ្ចូនទៅកាន់</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">ទៅកាន់ខ្លូនអ្នក</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">បានរុករករ៉ែ</translation>
</message>
@@ -3058,10 +3013,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">ចំនួនប្រត្តិបត្តិការ មិនអាចអវិជ្ជមានបានទេ</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">ប្រត្តិបត្តិការមានខ្សែចង្វាក់រងចាំដើម្បីធ្វើការផ្ទៀងផ្ទាត់វែង</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">ប្រត្តិបត្តិការត្រូវមានអ្នកទទួលម្នាក់យ៉ាងតិចបំផុត</translation>
</message>
diff --git a/src/qt/locale/bitcoin_kn.ts b/src/qt/locale/bitcoin_kn.ts
index ea2cf0c50f..4adb852768 100644
--- a/src/qt/locale/bitcoin_kn.ts
+++ b/src/qt/locale/bitcoin_kn.ts
@@ -168,10 +168,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ಬ್ಲಾಕ್ ಡೇಟಾಬೇಸ್ ಭವಿಷ್ಯದಿಂದ ಬಂದಿರುವ ಬ್ಲಾಕ್ ಹೊಂದಿದೆ ಎಂದು ತೋರುತ್ತದೆ. ಇದು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನ ದಿನಾಂಕ ಮತ್ತು ಸಮಯವು ತಪ್ಪಾಗಿರಬಹುದು. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ನ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ ಸರಿಯಾಗಿದ್ದರೆ, ಬ್ಲಾಕ್ ಡೇಟಾಬೇಸ್ ಮಾತ್ರವೇ ಪುನಃ ನಿರ್ಮಿಸಬೇಕು.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">ಬ್ಲಾಕ್ ಸೂಚಿ ಡೇಟಾಬೇಸ್ ಲೆಕ್ಕವಿದೆ, ಯಾವುದೋ ಭವಿಷ್ಯದಲ್ಲಿನ ಬ್ಲಾಕ್ ಸೇರಿದಂತೆ ತೋರುತ್ತದೆ. ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ದಿನಾಂಕ ಮತ್ತು ಸಮಯವು ಸರಿಯಾಗಿ ಹೊಂದಿಕೊಂಡಿರಬಹುದು ಎಂದು ಈ ತಪ್ಪು ಉಂಟಾಗಬಹುದು. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಕಂಪ್ಯೂಟರ್ ದಿನಾಂಕ ಮತ್ತು ಸಮಯ ಸರಿಯಾಗಿದ್ದರೆ ಬ್ಲಾಕ್ ಡೇಟಾಬೇಸ್ನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿರಿ. ಮತ್ತಾಗಲಾಗಿ ನೆರವೇರಿಸಲು, ಕಡಿಮೆ ಆವರಣ ದಿಸೆಯಲ್ಲಿರುವ 'txindex' ತೊಡಿಸನ್ನು ನಿಲ್ಲಿಸಿ. ಈ ತಪ್ಪು ಸಂದೇಶವು ಮುಂದೆ ಪ್ರದರ್ಶಿಸಲ್ಪಡದು.</translation>
- </message>
- <message>
<source>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>
<translation type="unfinished">ಈ ದೋಷ ಕ್ರಿಯೆಗೆ ಕೊನೆಯಾಗಿದ್ದ ಬರ್ಕ್ಲಿ ಡಿಬಿಯುಂಟುವಿನ ಹೊಸ ಸಂಸ್ಕರಣವನ್ನು ಬಳಸಿದ್ದ ಬದಲಾವಣೆಯ ಸಂಗಡ ಈ ವಾಲೆಟ್ ಕ್ರಿಯೆಯನ್ನು ಶುಚಿಗೊಳಿಸಲು ಕೊನೆಗೆ ಆಯ್ಕೆಮಾಡಿದೆಯೇ ಎಂದಾದರೆ, ದಯವಿಟ್ಟು ಈ ವಾಲೆಟ್ ಸೋಫ್ಟ್‌ವೇರ್ ಬಳಸಿದ ಅಂತಿಮ ಬರ್ಷನ್ ಅನ್ನು ಬಳಸಿ.</translation>
</message>
@@ -188,20 +184,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ವಾಲೆಟ್ ಯಶಸ್ವಿಯಾಗಿ ರಚಿಸಲಾಗಿದೆ. ಲೆಗೆಸಿ ವಾಲೆಟ್ ಪ್ರಕಾರ ಅಳಿಸಲ್ಪಡುತ್ತಿದೆ ಮತ್ತು ಭವಿಷ್ಯದಲ್ಲಿ ಲೆಗೆಸಿ ವಾಲೆಟ್ಗಳನ್ನು ರಚಿಸಲೂ, ತೆರೆಯಲೂ ಬೆಂಬಲ ನೀಡಲಾಗುವುದಿಲ್ಲ.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate ಆಯ್ಕೆ ಆಯ್ಕೆಗೆ -blockfilterindex ಅಸಾಧ್ಯವಾಗಿದೆ. -reindex-chainstate ಬಳಸುವಾಗ ತಾತ್ಕಾಲಿಕವಾಗಿ blockfilterindex ಅನ್ನು ನಿಲ್ಲಿಸಿ ಅಥವಾ ಪೂರ್ಣವಾಗಿ ಎಲ್ಲಾ ಸೂಚಕಗಳನ್ನು ಮರುಸ್ಥಾಪಿಸಲು -reindex ಬಳಸಿ.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">ಬೆಳೆದಿನಿಂದಲೂ -coinstatsindex ಸಂಕೇತದೊಂದಿಗೆ -reindex-chainstate ಆಯ್ಕೆ ಹೊಂದಿದರೆ ಹೊಂದಿಕೆಗಳು ಸಂಪರ್ಕಾತ್ಮಕವಲ್ಲ. ದಯವಿಟ್ಟು -reindex-chainstate ಬಳಿಕ ಅದನ್ನು ಬಿಡುಗಡೆಗೊಳಿಸಲು coinstatsindex ಅನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ಅಡಿಮುಟ್ಟಿರಿ ಅಥವಾ -reindex ಬದಲಾಯಿಸಿ ಎಲ್ಲಾ ಸೂಚಕಗಳನ್ನು ಪೂರ್ಣವಾಗಿ ಪುನರ್ ನಿರ್ಮಿಸಿ.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">ಚೆನ್ನಾಗಿಲ್ಲ. -txindex ಅನ್ನು ಬಿಡಿ ಅಥವಾ -reindex-chainstate ಅನ್ನು -reindex ಗೆ ಬದಲಾಯಿಸಿ ಎಂದು ಸೂಚಿಸಲಾಗಿದೆ. ನೀವು -reindex-chainstate ಬಳಸುವ ಸಮಯದಲ್ಲಿ -txindex ಅನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ನಿಲ್ಲಿಸಿ.
- </translation>
- </message>
- <message>
<source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
<translation type="unfinished">ದೋಷ: ವರ್ಣನೆಗಳ ಪುನರ್ವಿನಿಮಯದ ಸಮಯದಲ್ಲಿ ನಕಲಿ ವರ್ಣನೆಗಳು ರಚಿಸಲಾಗಿವೆ. ನಿಮ್ಮ ಬಟ್ಟೆ ಹಾಕಿದ ಕಾರ್ಟೆಜ್ ಹಾಳಾಗಿರಬಹುದು.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ko.ts b/src/qt/locale/bitcoin_ko.ts
index c10422125e..ebf24eb372 100644
--- a/src/qt/locale/bitcoin_ko.ts
+++ b/src/qt/locale/bitcoin_ko.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;선택</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">보내는 주소들</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">받는 주소들</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">비트코인을 보내는 계좌 주소입니다. 코인을 보내기 전에 금액과 받는 주소를 항상 확인하십시오.</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 으로 주소 리스트를 저장하는 동안 오류가 발생했습니다. 다시 시도해 주십시오.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">보내는 주소들 - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">받는 주소들 - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">내보내기 실패</translation>
</message>
@@ -224,6 +224,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">지갑 복호화를 위한 암호가 틀렸습니다.</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">지갑 암호화 해제를 위해 입력된 비밀문구가 정확하지 않습니다. 비밀문구가 공백 문자 (0 바이트)를 포함하고 있습니다. 만약 비밀문구가 25.0 버전 이전의 비트코인 코어 소프트웨어에 의해 설정되었다면, 비밀문구를 첫 공백 문자 이전까지 입력해보세요. 이렇게 해서 성공적으로 입력되었다면, 차후 이런 문제가 발생하지 않도록 비밀문구를 새로이 설정해 주세요.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">지갑 암호가 성공적으로 변경되었습니다.</translation>
</message>
@@ -232,6 +236,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">암호 변경에 실패하였습니다.</translation>
</message>
<message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">지갑 암호화 해제를 위해 입력된 예전 비밀문구가 정확하지 않습니다. 비밀문구가 공백 문자 (0 바이트)를 포함하고 있습니다. 만약 비밀문구가 25.0 버전 이전의 비트코인 코어 소프트웨어에 의해 설정되었다면, 비밀문구를 첫 공백 문자 이전까지 입력해보세요.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">경고: Caps Lock키가 켜져있습니다!</translation>
</message>
@@ -737,7 +745,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">백업된 지갑 불러오기</translation>
+ <translation type="unfinished">백업된 지갑을 불러옵니다.</translation>
</message>
<message>
<source>Restore Wallet</source>
@@ -801,6 +809,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">네트워크 활성화 하기</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">블록 헤더들을 사전 동기화 중 (%1%)...</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">지갑 생성 오류</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">오류: %1</translation>
</message>
@@ -907,10 +923,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">수수료:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">더스트:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">수수료 이후:</translation>
</message>
@@ -999,10 +1011,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">bytes 복사</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">더스트 복사</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">잔돈 복사</translation>
</message>
@@ -1011,18 +1019,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 잠금)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">예</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">아니요</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">수령인이 현재 더스트 임계값보다 작은 양을 수신하면 이 라벨이 빨간색으로 변합니다.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">입력마다 +/- %1 사토시(satoshi)가 바뀔 수 있습니다.</translation>
</message>
@@ -1063,7 +1059,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Can't list signers</source>
<translation type="unfinished">서명자를 나열할 수 없습니다.</translation>
</message>
- </context>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">너무 많은 외부 서명자들이 발견됨</translation>
+ </message>
+</context>
<context>
<name>LoadWalletsActivity</name>
<message>
@@ -1109,7 +1109,27 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
<translation type="unfinished">지갑 복원하기</translation>
</message>
- </context>
+ <message>
+ <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
+ <translation type="unfinished">지갑 복구 중 &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>Restore wallet failed</source>
+ <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
+ <translation type="unfinished">지갑 복구 실패</translation>
+ </message>
+ <message>
+ <source>Restore wallet warning</source>
+ <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
+ <translation type="unfinished">경고 (지갑 복구)</translation>
+ </message>
+ <message>
+ <source>Restore wallet message</source>
+ <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
+ <translation type="unfinished">지갑 복구 관련 메세지</translation>
+ </message>
+</context>
<context>
<name>WalletController</name>
<message>
@@ -1176,14 +1196,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">빈 지갑 만들기</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">scriptPubKey 관리를 위해 디스크립터를 사용하세요.</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">디스크립터 지갑</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Hardware wallet과 같은 외부 서명 장치를 사용합니다. 지갑 기본 설정에서 외부 서명자 스크립트를 먼저 구성하십시오.</translation>
</message>
@@ -1196,10 +1208,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">생성</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">에스큐엘라이트 지원 없이 컴파일 되었습니다. (디스크립터 지갑에 요구됩니다.)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">외부 서명 지원 없이 컴파일됨 (외부 서명에 필요) 개발자 참고 사항 [from:developer] "외부 서명"은 하드웨어 지갑과 같은 장치를 사용하는 것을 의미합니다.</translation>
@@ -1308,6 +1316,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">데이터 디렉토리를 선택하세요</translation>
+ </message>
+ <message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">최소 %1 GB의 데이터가 이 디렉토리에 저장되며 시간이 지남에 따라 증가할 것입니다.</translation>
</message>
@@ -1367,6 +1379,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">초기 동기화는 매우 오래 걸리며 이전에는 본 적 없는 하드웨어 문제를 발생시킬 수 있습니다. %1을 실행할 때마다 중단 된 곳에서 다시 계속 다운로드 됩니다.</translation>
</message>
<message>
+ <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
+ <translation type="unfinished">OK를 클릭하면, %1는 %4가 최초 출시된 %3에 있는 가장 오래된 트랜잭션들부터 시작하여 전체 %4 블록체인 (%2GB)을 내려 받고 처리하기 시작합니다.</translation>
+ </message>
+ <message>
<source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
<translation type="unfinished">블록 체인 저장 영역을 제한하도록 선택한 경우 (블록 정리), 이력 데이터는 계속해서 다운로드 및 처리 되지만, 차후 디스크 용량을 줄이기 위해 삭제됩니다.</translation>
</message>
@@ -1459,7 +1475,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
<translation type="unfinished">알 수 없음. 헤더 동기화 중(%1, %2)...</translation>
</message>
- </context>
+ <message>
+ <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">알려지지 않음. 블록 헤더들을 사전 동기화 중 (%1, %2%)...</translation>
+ </message>
+</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -1503,6 +1523,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">스크립트 인증 쓰레드의 개수(&amp;V)</translation>
</message>
<message>
+ <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
+ <translation type="unfinished">%1가 호환되는 스크립트가 있는 전체 경로 (예시 - C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). 주의: 멀웨어가 당신의 코인들을 훔쳐갈 수도 있습니다!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">프록시 아이피 주소 (예: IPv4:127.0.0.1 / IPv6: ::1)</translation>
</message>
@@ -1728,18 +1752,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Tor onion 서비스를 통해 피어에 도달하려면 별도의 SOCKS &amp; 5 프록시를 사용하십시오.</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">개요 탭의 고정 폭 글꼴:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">%1 포함됨</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">가장 가까운 의미 "1%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">확인(&amp;O)</translation>
</message>
@@ -1961,8 +1973,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT가 디스크에 저장 됨</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* %1을 %2로 보냅니다.</translation>
+ <source>own address</source>
+ <translation type="unfinished">자신의 주소</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2833,10 +2845,6 @@ For more information on using this console, type %6.
<translation type="unfinished">입력...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">더스트:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">선택...</translation>
</message>
@@ -2913,10 +2921,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">bytes 복사</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">더스트 복사</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">잔돈 복사</translation>
</message>
@@ -2947,10 +2951,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">오프라인 %1 지갑 또는 PSBT가 호환되는 하드웨어 지갑과의 사용을 위한 '부분적으로 서명 된 비트 코인 트랜잭션(PSBT)'를 생성합니다.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">'%1' 지갑에서</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1을 '%2'로</translation>
</message>
@@ -3442,10 +3442,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">출력 인덱스</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(인증서가 확인되지 않았습니다)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">판매자</translation>
</message>
@@ -3544,10 +3540,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">받는 주소 :</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">자신에게 지불</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">채굴</translation>
</message>
@@ -3623,10 +3615,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">받는 주소 :</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">자기 거래</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">채굴</translation>
</message>
@@ -3840,6 +3828,11 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">PSBT 복사됨</translation>
</message>
<message>
+ <source>Copied to clipboard</source>
+ <comment>Fee-bump PSBT saved</comment>
+ <translation type="unfinished">클립보드로 복사됨</translation>
+ </message>
+ <message>
<source>Can't sign transaction.</source>
<translation type="unfinished">거래에 서명 할 수 없습니다.</translation>
</message>
@@ -3923,10 +3916,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">MIT 소프트웨어 라이센스에 따라 배포되었습니다. 첨부 파일 %s 또는 %s을 참조하십시오.</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">%s 불러오기 오류! 주소 키는 모두 정확하게 로드되었으나 거래 데이터와 주소록 필드에서 누락이나 오류가 존재할 수 있습니다.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">%s를 읽는데 에러가 생겼습니다. 트랜잭션 데이터가 잘못되었거나 누락되었습니다. 지갑을 다시 스캐닝합니다.</translation>
</message>
@@ -3995,10 +3984,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">블록 데이터베이스에 미래의 블록이 포함되어 있습니다. 이것은 사용자의 컴퓨터의 날짜와 시간이 올바르게 설정되어 있지 않을때 나타날 수 있습니다. 블록 데이터 베이스의 재구성은 사용자의 컴퓨터의 날짜와 시간이 올바르다고 확신할 때에만 하십시오.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">udhdbfjfjdnbdjfjf hdhdbjcn2owkd. jjwbdbdof dkdbdnck wdkdj </translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">거래액이 수수료를 지불하기엔 너무 작습니다</translation>
</message>
@@ -4337,10 +4322,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">거래액은 반드시 0보다 큰 값이어야 합니다.</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">거래가 너무 긴 메모리 풀 체인을 갖고 있습니다</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">거래에는 최소한 한명의 수령인이 있어야 합니다.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ku.ts b/src/qt/locale/bitcoin_ku.ts
index 9f8b5701a8..f8738fd9dc 100644
--- a/src/qt/locale/bitcoin_ku.ts
+++ b/src/qt/locale/bitcoin_ku.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">H&amp;ilbijêre</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Navnîşanên şandinê</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Navnîşanên stendinê</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">ئەمانە ناونیشانی بیتکۆبیتەکانی تۆنە بۆ ناردنی پارەدانەکان. هەمیشە بڕی و ناونیشانی وەرگرەکان بپشکنە پێش ناردنی دراوەکان.</translation>
</message>
@@ -286,7 +278,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>UnitDisplayStatusBarControl</name>
<message>
<source>Unit to show amounts in. Click to select another unit.</source>
- <translation type="unfinished">یەکە بۆ نیشاندانی بڕی کرتە بکە بۆ دیاریکردنی یەکەیەکی تر.</translation>
+ <translation type="unfinished">یەکە بۆ نیشاندانی بڕی لەناو. کرتە بکە بۆ دیاریکردنی یەکەیەکی تر.</translation>
</message>
</context>
<context>
@@ -308,14 +300,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Tarîx</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">بەڵێ</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">نەخێر</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(etîket tune)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ku_IQ.ts b/src/qt/locale/bitcoin_ku_IQ.ts
index 14a254808b..adbdec36fb 100644
--- a/src/qt/locale/bitcoin_ku_IQ.ts
+++ b/src/qt/locale/bitcoin_ku_IQ.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;هەڵبژێرە</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">ناردنی ناونیشانەکان</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">وەرگرتنی ناونیشانەکان</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">ئەمانە ناونیشانی بیتکۆبیتەکانی تۆنە بۆ ناردنی پارەدانەکان. هەمیشە بڕی و ناونیشانی وەرگرەکان بپشکنە پێش ناردنی دراوەکان.</translation>
</message>
@@ -308,14 +300,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">رێکەت</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">بەڵێ</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">نەخێر</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(ناونیشان نییە)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_la.ts b/src/qt/locale/bitcoin_la.ts
index eaf11ada6e..eaf3c35f2d 100644
--- a/src/qt/locale/bitcoin_la.ts
+++ b/src/qt/locale/bitcoin_la.ts
@@ -42,6 +42,10 @@
<translation type="unfinished">&amp;Dele</translation>
</message>
<message>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">Elige quam peram mittere pecuniam</translation>
+ </message>
+ <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Hae sunt inscriptiones mittendi pensitationes. Semper inspice quantitatem et inscriptionem accipiendi antequam nummos mittis.</translation>
</message>
@@ -633,6 +637,13 @@
</message>
</context>
<context>
+ <name>PSBTOperationsDialog</name>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">inscriptio propria</translation>
+ </message>
+ </context>
+<context>
<name>PaymentServer</name>
<message>
<source>Cannot start bitcoin: click-to-pay handler</source>
@@ -1154,10 +1165,6 @@
<translation type="unfinished">Missum ad</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pensitatio ad te ipsum</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Fossa</translation>
</message>
@@ -1217,10 +1224,6 @@
<translation type="unfinished">Missum ad</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Ad te ipsum</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Fossa</translation>
</message>
diff --git a/src/qt/locale/bitcoin_lb.ts b/src/qt/locale/bitcoin_lb.ts
new file mode 100644
index 0000000000..7e0c3b9228
--- /dev/null
+++ b/src/qt/locale/bitcoin_lb.ts
@@ -0,0 +1,197 @@
+<TS version="2.1" language="lb">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">Riets-drécken fir Redaktioun adress oder label</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation type="unfinished">Eng nei Adress erstellen</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Nei</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation type="unfinished">Kopéiert déi aktuell ausgewielte Adress an de System-Zwëschenofklaaf.</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation type="unfinished">Läscht déi aktuell ausgewielte Adress aus der Lëscht.</translation>
+ </message>
+ <message>
+ <source>Enter address or label to search</source>
+ <translation type="unfinished">Gitt d'Adress oder d'Etikett an fir ze sichen.</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Exportéiert déi Dateien op der aktueller Tabell an eng Datei.</translation>
+ </message>
+ <message>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">Wielt déi Adress, wou Dir d'Mënz hinschécken wëllt.</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation type="unfinished">Wielt déi Adress, fir Mënz mat ze erhuelen.</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
+ <translation type="unfinished">Dat sinn är Bitcoin-Adressen fir Bezuelungen ze schécken. Iwwerpréift ëmmer de Betrag an d'Erhaltsadress virum Mënz ze schécken.</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
+Signing is only possible with addresses of the type 'legacy'.</source>
+ <translation type="unfinished">Dat sinn är Bitcoin-Adressen fir Zuelungen ze erhuelen. Benotzt de 'Nei Erhaltsadress erstellen' Knäppchen am 'Erhalts'-Tab, fir nei Adressen ze erstellen.
+D'Signatur ass nëmmen mat Adressen vum Typ 'legacy' méiglech.</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
+ <translation type="unfinished">Et gouf en Feeler beim Versuch, d'Adressenlëscht op %1 ze speichern. Versicht et w.e.g. nach eng Kéier.</translation>
+ </message>
+ </context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
+ <translation type="unfinished">Warnung: Wann Dir Är Portemonnaie verschlësselt an Äert Passwort verléiert, &lt;b&gt;DA VERLÉIERT DIR ALLE ÄRE BITCOINS&lt;/b&gt;!</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to encrypt your wallet?</source>
+ <translation type="unfinished">Sidd Dir sécher, dass Dir Är Portemonnaie verschlësselen wëllt?</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase for the wallet.</source>
+ <translation type="unfinished">Gitt deen alten Passwort an den neien Passwort fir d'Portemonnaie an</translation>
+ </message>
+ <message>
+ <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation type="unfinished">Erënner Iech, dass d'Verschlësselung vun ärer Portemonnaie Är Bitcoins net vollstänneg vir Malware schützen kann, déi Äre Computer infizéiert.</translation>
+ </message>
+ </context>
+<context>
+ <name>QObject</name>
+ <message numerus="yes">
+ <source>%n second(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n minute(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message numerus="yes">
+ <source>%n GB of space available</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(%n GB needed for full chain)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(sufficient to restore backups %n day(s) old)</source>
+ <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionDesc</name>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>WalletView</name>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Exportéiert déi Dateien op der aktueller Tabell an eng Datei.</translation>
+ </message>
+ </context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_lt.ts b/src/qt/locale/bitcoin_lt.ts
index 06dc2f25a5..0df3a165aa 100644
--- a/src/qt/locale/bitcoin_lt.ts
+++ b/src/qt/locale/bitcoin_lt.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">P&amp;asirinkti</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Išsiuntimo adresai</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Gavimo adresai</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Tai yra jūsų Bitcoin adresai išeinantiems mokėjimams. Visada pasitikrinkite sumą ir gavėjo adresą prieš siunčiant lėšas.</translation>
</message>
@@ -710,10 +702,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Mokestis:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Dulkės:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Po mokesčio:</translation>
</message>
@@ -778,10 +766,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Kopijuoti baitus</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopijuoti dulkę</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopijuoti keisti</translation>
</message>
@@ -790,18 +774,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">(%1 užrakinta)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">taip</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ne</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ši etiketė tampa raudona, jei bet kuris gavėjas gauna mažesnę sumą nei dabartinė dulkių slenkstis.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Gali svyruoti nuo +/-%1 satoshi(-ų) vienam įvedimui.</translation>
</message>
@@ -1483,6 +1455,10 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Uždaryti</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">savo adresas</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">Visas kiekis</translation>
</message>
@@ -2077,10 +2053,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Išvalykite visus formos laukus.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Dulkės:</translation>
- </message>
- <message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
<translation type="unfinished">Kai sandorių apimtis yra mažesnė nei erdvės blokuose, kasėjai ir perduodantys mazgai gali užtikrinti minimalų mokestį. Mokėti tik šį minimalų mokestį yra galima, tačiau atkreipkite dėmesį, kad dėl to gali atsirasti niekada nepatvirtinamas sandoris, kai bus daugiau paklausos bitcoin operacijoms, nei tinklas gali apdoroti.</translation>
</message>
@@ -2137,10 +2109,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Kopijuoti baitus</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopijuoti dulkę</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopijuoti keisti</translation>
</message>
@@ -2149,10 +2117,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">%1 (%2 blokai)</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">iš piniginės '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">'%1' į '%2'</translation>
</message>
@@ -2640,10 +2604,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Išsiųsta</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Mokėjimas sau</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Išgauta</translation>
</message>
@@ -2715,10 +2675,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Išsiųsta</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Skirta sau</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Išgauta</translation>
</message>
@@ -2997,10 +2953,6 @@ Pasirašymas galimas tik su 'legacy' tipo adresais.</translation>
<translation type="unfinished">Transakcijos suma negali buti neigiama</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Sandoris turi per ilgą mempool grandinę</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcija privalo turėti bent vieną gavėją</translation>
</message>
diff --git a/src/qt/locale/bitcoin_lv.ts b/src/qt/locale/bitcoin_lv.ts
index e34c833524..6cea8ba1aa 100644
--- a/src/qt/locale/bitcoin_lv.ts
+++ b/src/qt/locale/bitcoin_lv.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">Izvēlēties</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Adrešu nosūtīšana</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adrešu saņemšana</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Šīs ir jūsu Bitcoin adreses, kuras izmantojamas maksājumu veikšanai. Vienmēr pārbaudiet summu un saņēmēja adresi pirms monētu nosūtīšanas.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mg.ts b/src/qt/locale/bitcoin_mg.ts
index 29482e0303..08f3a10ea4 100644
--- a/src/qt/locale/bitcoin_mg.ts
+++ b/src/qt/locale/bitcoin_mg.ts
@@ -34,14 +34,6 @@
<translation type="unfinished">Fidio ny adiresy handraisana vola</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Adiresy fandefasana</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adiresy fandraisana</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ireto ny adiresy Bitcoin natokana handefasanao vola. Hamarino hatrany ny tarehimarika sy ny adiresy handefasana alohan'ny handefa vola.</translation>
</message>
@@ -234,14 +226,6 @@
<source>&amp;Copy address</source>
<translation type="unfinished">&amp;Adikao ny adiresy</translation>
</message>
- <message>
- <source>yes</source>
- <translation type="unfinished">eny</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">tsia</translation>
- </message>
</context>
<context>
<name>CreateWalletActivity</name>
diff --git a/src/qt/locale/bitcoin_mi.ts b/src/qt/locale/bitcoin_mi.ts
new file mode 100644
index 0000000000..8dc535cd68
--- /dev/null
+++ b/src/qt/locale/bitcoin_mi.ts
@@ -0,0 +1,728 @@
+<TS version="2.1" language="mi">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">Tikiake matau ki te whakamāori i te kupu whakamāoritanga:
+Right-click to edit address or label</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation type="unfinished">Whakapūmau he wāhitau hōu</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Hou</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation type="unfinished">Whakakopi te whiriwhiri i te wāhitau kua whiriwhirihia ki te papatohu rorohiko</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished">&amp;Kape</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation type="unfinished">&amp;Kati</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation type="unfinished">Mukua te whiriwhiri i te wāhitau kua whiriwhirihia i te rārangi</translation>
+ </message>
+ <message>
+ <source>Enter address or label to search</source>
+ <translation type="unfinished">Turiwhenua i te wāhitau, ingoa rānei ki te rapu.</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Whakapau kaha te raraunga i te whārangi o nāianei ki tētahi kōnae</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Kaweake</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Whakakore</translation>
+ </message>
+ <message>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">Whiriwhiria te wāhitau hei tuku moni ki.</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation type="unfinished">Whiriwhiria te wāhitau hei whiwhi moni</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
+ <translation type="unfinished">Ko ēnei ngā whakamāoritanga mō ō whakamahi Bitcoin hei tuku moni. Tirohia i te moni me te wāhi whiwhi i mua i te tuku i ngā moni.</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
+Signing is only possible with addresses of the type 'legacy'.</source>
+ <translation type="unfinished">Ko ēnei ngā whakamāoritanga mō ō whakaaetanga Bitcoin hei whiwhi utu. Whakamahi i te pātene 'Waihanga whakaaronga hōu' i te pae whiwhi ki te whakapūmau i ngā whakaaronga hōu.
+Ko te whakakī i ēnei whakaaronga e taea ana anake ki ngā whakararuraru o te momo 'tawhito'.</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Address</source>
+ <translation type="unfinished">&amp;Tārua wāhitau</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Label</source>
+ <translation type="unfinished">Tātari &amp; Tapanga </translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished">&amp;Whakatika</translation>
+ </message>
+ <message>
+ <source>Export Address List</source>
+ <translation type="unfinished">Whakaputu Rārangi Wāhitau</translation>
+ </message>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">Taputapu whakawhiti kōma</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
+ <translation type="unfinished">I whakapā atu i te hapa i te whakaputa i te rārangi wāhitau ki %1. Whakamātau anō, koa.</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Kore te whakapau kore</translation>
+ </message>
+</context>
+<context>
+ <name>AddressTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Tapanga</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Wāhitau</translation>
+ </message>
+ </context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Passphrase Dialog</source>
+ <translation type="unfinished">Whakapātai Kōrero</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation type="unfinished">Whakauru kupu whakapākehā</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation type="unfinished">Tūtohi hōu</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation type="unfinished">Tōaitia anō te kupu whakawhitiwhiti hōu</translation>
+ </message>
+ <message>
+ <source>Encrypt wallet</source>
+ <translation type="unfinished">Whakakino pūtea</translation>
+ </message>
+ <message>
+ <source>This operation needs your wallet passphrase to unlock the wallet.</source>
+ <translation type="unfinished">Kia whakapiri tēnei mahi ki tō whakapuaki moni hei whakawhiti i te whare moni.</translation>
+ </message>
+ <message>
+ <source>Unlock wallet</source>
+ <translation type="unfinished">Whakatangohia te pēke moni</translation>
+ </message>
+ <message>
+ <source>Change passphrase</source>
+ <translation type="unfinished">Whakarerekē kīanga</translation>
+ </message>
+ <message>
+ <source>Confirm wallet encryption</source>
+ <translation type="unfinished">Whakamana te whakakītanga pūtea</translation>
+ </message>
+ <message>
+ <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
+ <translation type="unfinished">Whakatūpato: Ki te whakakino i tō pēke moni me te ngaro i tō kupuhipa, ka &lt;b&gt;NGARO KATOA ŌU PĪNIHA BITCOIN&lt;/b&gt;!</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to encrypt your wallet?</source>
+ <translation type="unfinished">Kei te whakapau kaha koe ki te whakakino i to whare moni?</translation>
+ </message>
+ <message>
+ <source>Wallet encrypted</source>
+ <translation type="unfinished">Whakakorengia te wharetaonga</translation>
+ </message>
+ <message>
+ <source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
+ <translation type="unfinished">Whakauruhia te kīangahipa hou mo te putea. Whakamahia he kupu huna kia tekau, neke atu ranei nga tohu matapōkere 2, 3 waru neke atu ranei nga kupu 3</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase for the wallet.</source>
+ <translation type="unfinished">Whakauru te kupu whakapākehā me te kupu hōu mō te pēke moni.</translation>
+ </message>
+ <message>
+ <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation type="unfinished">Mahara kia whakakorehia te whakakino i ō wharepukapuka kia whakararuraru i ō wharepūkoro.</translation>
+ </message>
+ <message>
+ <source>Wallet to be encrypted</source>
+ <translation type="unfinished">Whakakī i te pēke</translation>
+ </message>
+ <message>
+ <source>Your wallet is about to be encrypted. </source>
+ <translation type="unfinished">Kei te whakakorehia tō pēke moni.</translation>
+ </message>
+ <message>
+ <source>Your wallet is now encrypted. </source>
+ <translation type="unfinished">Kua whakakītia ināianei tō pēke.</translation>
+ </message>
+ <message>
+ <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
+ <translation type="unfinished">HEMENGĀ: Me whakakapi ngā tāruarau i mua i te whakaputa i te kōnae pēke whakamahi kē o tō wharemoni ki te kōnae pēke hōu, whakakapi. Hei ētahi take whakamarumaru, ka whakakore ngā tāruarau i mua i te kōnae pēke kore whakakapi, ka whiwhi whakamahi i te kōnae pēke hōu, whakakapi.</translation>
+ </message>
+ <message>
+ <source>Wallet encryption failed</source>
+ <translation type="unfinished">Kati te whakamātau i te whakakorenga wharetaonga</translation>
+ </message>
+ <message>
+ <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
+ <translation type="unfinished">Kua whakakore te whakakītanga pūtea wharetaonga i te whakakoretanga ā-roto. Kāore i whakakītia tō pūtea wharetaonga.</translation>
+ </message>
+ <message>
+ <source>The supplied passphrases do not match.</source>
+ <translation type="unfinished">Kāore ngā kupu whakapāhohe i te rite.</translation>
+ </message>
+ <message>
+ <source>Wallet unlock failed</source>
+ <translation type="unfinished">Kati te whakakore i te whakatuwhera o te whareparakau</translation>
+ </message>
+ <message>
+ <source>The passphrase entered for the wallet decryption was incorrect.</source>
+ <translation type="unfinished">Ko te kupuhipa i whakauruhia mō te whakapau kōnae whakamāhukihuki, he hē.</translation>
+ </message>
+ <message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">Ko te kupu whakapā atu i whakauruhia mō te whakapau kōnae kore tika. Kei roto i te kupu whakapā he pūāhua kore (hei tauira - he tūmomo kore). Ki te whakapau kōnae te kupu whakapā i te wā i whakatūria ai tēnei whakamahi i mua i te 25.0, whakamātau anō ki te whakapau kōnae ki te whakakore i tēnei raruraru i te wā e whai ake nei.</translation>
+ </message>
+ <message>
+ <source>Wallet passphrase was successfully changed.</source>
+ <translation type="unfinished">Kua whakarerekētia te kupuhipa pūtea.</translation>
+ </message>
+ <message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Kua whakapau kē te whakarerekē i te kupu whakapākehā.</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">Ko te kupuhipa tawhito i whakauruhia mō te whakamāori i te wharetaonga he hē. Kei roto i te kupuhipa tētahi pūāhua kore (hei tauira - he tīmatanga kore). Ki te whakaritea te kupuhipa ki te whakamahi i tētahi wāhanga o tēnei wharepukapuka i mua i te 25.0, whakamātau anō ki te whakamahi anō me ngā pūāhua ki te — engari kāore i whakauruhia — te pūāhua tuatahi kore.</translation>
+ </message>
+ <message>
+ <source>Warning: The Caps Lock key is on!</source>
+ <translation type="unfinished">Whakatūpato: Kei te whakakā te pātuhi Caps Lock!</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>IP/Netmask</source>
+ <translation type="unfinished">IP/NetmaskIP/Netmask</translation>
+ </message>
+ <message>
+ <source>Banned Until</source>
+ <translation type="unfinished">Kati i te wa i whakakore ai</translation>
+ </message>
+</context>
+<context>
+ <name>BitcoinApplication</name>
+ <message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">Settings file %1 me whakapōrearea, me whakararuraru rānei.</translation>
+ </message>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">&lt;text_to_translate&gt;Tūkino whakawhiti&lt;/text_to_translate&gt;</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">I whakararuraru mate. Ka whakakore %1 i te whakararuraru haumaru, ka whakakore hoki.</translation>
+ </message>
+ <message>
+ <source>Internal error</source>
+ <translation type="unfinished">Hapa whaiaro</translation>
+ </message>
+ <message>
+ <source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
+ <translation type="unfinished">Kua puta he hapa ā-roto. Ka whakamātau a %1 ki te whakarite i te whakararuraru i te āhua haere tonu. He hē whakararuraru tēnei e whakapātaitia ana i raro i te whakamārama i raro nei.</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message numerus="yes">
+ <source>%n second(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n minute(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message numerus="yes">
+ <source>%n GB of space available</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(%n GB needed for full chain)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(sufficient to restore backups %n day(s) old)</source>
+ <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ <message>
+ <source>Address</source>
+ <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
+ <translation type="unfinished">Wāhitau</translation>
+ </message>
+ </context>
+<context>
+ <name>RecentRequestsTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Tapanga</translation>
+ </message>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionDesc</name>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Tapanga</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionView</name>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">Taputapu whakawhiti kōma</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Tapanga</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Wāhitau</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Kore te whakapau kore</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletView</name>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Kaweake</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Whakapau kaha te raraunga i te whārangi o nāianei ki tētahi kōnae</translation>
+ </message>
+ </context>
+<context>
+ <name>bitcoin-core</name>
+ <message>
+ <source>Input not found or already spent</source>
+ <translation type="unfinished">Kāore i kitea te urupare, kua whiwhi i mua, kua whiwhi rānei.</translation>
+ </message>
+ <message>
+ <source>Insufficient dbcache for block verification</source>
+ <translation type="unfinished">Kore rawa i te nui te dbcache mō te whakamātau i te paraka</translation>
+ </message>
+ <message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">He iti te whiwhi moni</translation>
+ </message>
+ <message>
+ <source>Invalid -i2psam address or hostname: '%s'</source>
+ <translation type="unfinished">Kore whakaaetanga -i2psam wāhitau rite, ingoa wāhi: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid -onion address or hostname: '%s'</source>
+ <translation type="unfinished">Kore whakaaetanga -onion wāhitau, ingoa ranei: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid -proxy address or hostname: '%s'</source>
+ <translation type="unfinished">Kore whakaaetanga -proxy wāhitau ranei ingoa whare: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid P2P permission: '%s'</source>
+ <translation type="unfinished">Invalid P2P whakaaetanga: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
+ <translation type="unfinished">He whakararuraru te whiwhinga mō %s = &lt;amount&gt;: '%s' (me whakarite i te mea atu i te %s)</translation>
+ </message>
+ <message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Kore whiwhinga mō te %s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Kore whiwhinga mō te -%s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid netmask specified in -whitelist: '%s'</source>
+ <translation type="unfinished">Kua whakapau kaha te netmask kore whaimana i whakarārangi i roto i te -whitelist: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid port specified in %s: '%s'</source>
+ <translation type="unfinished">Kua whakapātaitia te pōti korewhiwhi i roto i %s: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid pre-selected input %s</source>
+ <translation type="unfinished">Kāore i te tika te kōwhiri i tātari i te urupare %s</translation>
+ </message>
+ <message>
+ <source>Listening for incoming connections failed (listen returned error %s)</source>
+ <translation type="unfinished">Whakararuraru ana te whakarongo i ngā hononga e haere mai ana (kua whakahokia te hapa %s)</translation>
+ </message>
+ <message>
+ <source>Loading P2P addresses…</source>
+ <translation type="unfinished">Whakararuraru P2P addresses ...</translation>
+ </message>
+ <message>
+ <source>Loading banlist…</source>
+ <translation type="unfinished">Whakararuraru ana, ka whakapau kaha ki te whakamāori i te kupu whakamāoritanga.</translation>
+ </message>
+ <message>
+ <source>Loading block index…</source>
+ <translation type="unfinished">Whakaritea te rārangi whakaputa...</translation>
+ </message>
+ <message>
+ <source>Loading wallet…</source>
+ <translation type="unfinished">Whakararuraru pūtea...</translation>
+ </message>
+ <message>
+ <source>Missing amount</source>
+ <translation type="unfinished">Te moni i ngaro</translation>
+ </message>
+ <message>
+ <source>Missing solving data for estimating transaction size</source>
+ <translation type="unfinished">Kua ngaro ngā raraunga whakatikatika mō te whakarite i te rahi whakaritenga whakawhiti</translation>
+ </message>
+ <message>
+ <source>Need to specify a port with -whitebind: '%s'</source>
+ <translation type="unfinished">Me whakarite i tētahi pōti me te -whitebind: '%s'</translation>
+ </message>
+ <message>
+ <source>No addresses available</source>
+ <translation type="unfinished">Kāore he wāhitau wātea</translation>
+ </message>
+ <message>
+ <source>Rescanning…</source>
+ <translation type="unfinished">Whakarerekētia...</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
+ <translation type="unfinished">SQLiteDatabase: Kua whakakorehia te whakahaere i te kōrero hei whakamana i te papakupu: %s</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
+ <translation type="unfinished">SQLiteDatabase: Kua whakakorehia te whakarite i te kupu hei whakamāmā i te papakupu: %s</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Failed to read database verification error: %s</source>
+ <translation type="unfinished">SQLiteDatabase: Kua whakapau kaha te pānui i te hapa whakamātau o te papamahi: %s</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
+ <translation type="unfinished">SQLiteDatabase: Tino whakararuraru te tuhinga whakamahi. Tūpono %u, ka whiwhi %u</translation>
+ </message>
+ <message>
+ <source>Section [%s] is not recognized.</source>
+ <translation type="unfinished">Kāore i whakaaetia te wāhanga [%s].</translation>
+ </message>
+ <message>
+ <source>Signing transaction failed</source>
+ <translation type="unfinished">Ko te whakakore i te whakauru i te whakaritenga</translation>
+ </message>
+ <message>
+ <source>Specified -walletdir "%s" does not exist</source>
+ <translation type="unfinished">Kāore i te whiwhi i te -walletdir i whakaritea "%s"</translation>
+ </message>
+ <message>
+ <source>Specified -walletdir "%s" is not a directory</source>
+ <translation type="unfinished">Kāore i te whare tūmatanui te -walletdir i whakaritea "%s"</translation>
+ </message>
+ <message>
+ <source>Specified blocks directory "%s" does not exist.</source>
+ <translation type="unfinished">Kāore te whare pūranga i whakaritea "%s" e whai wāhi.</translation>
+ </message>
+ <message>
+ <source>Specified data directory "%s" does not exist.</source>
+ <translation type="unfinished">Kāore te whare pūranga raraunga i whakaritea "%s" i te whiwhi.</translation>
+ </message>
+ <message>
+ <source>Starting network threads…</source>
+ <translation type="unfinished">Whakamāori i te tekau whakahaere whatunga...</translation>
+ </message>
+ <message>
+ <source>The source code is available from %s.</source>
+ <translation type="unfinished">Ko te kōnae pūnaha e wātea ana i te %s.</translation>
+ </message>
+ <message>
+ <source>The specified config file %s does not exist</source>
+ <translation type="unfinished">Kāore te kōnae whirihoranga i whiwhi i te %s i te wā e whakapau kore ana</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation type="unfinished">Ko te moni whakaritenga he iti rawa hei utu i te utu</translation>
+ </message>
+ <message>
+ <source>The wallet will avoid paying less than the minimum relay fee.</source>
+ <translation type="unfinished">Ka whakakore te pōkeka i te utu iti ake i te utu tawhiti i te iti rawa.</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation type="unfinished">He mea whakamātautau tēnei pūmanawa.</translation>
+ </message>
+ <message>
+ <source>This is the minimum transaction fee you pay on every transaction.</source>
+ <translation type="unfinished">Ko tēnei te utu whakaritenga iti rawa ka whiwhi koe i ia whakaritenga.</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you will pay if you send a transaction.</source>
+ <translation type="unfinished">Ko te utu whakawhiti tāuta tēnei ka utu e whiwhi ana koe ki te tuku i tētahi tāuta.</translation>
+ </message>
+ <message>
+ <source>Transaction amount too small</source>
+ <translation type="unfinished">He iti rawa te moni whakaritenga</translation>
+ </message>
+ <message>
+ <source>Transaction amounts must not be negative</source>
+ <translation type="unfinished">Kāore e whakaaetia ngā moni whakaritenga kia whakararuraru.</translation>
+ </message>
+ <message>
+ <source>Transaction change output index out of range</source>
+ <translation type="unfinished">He whakawhitiwhitinga whakaputanga hōputu whakararuraru te tūnga</translation>
+ </message>
+ <message>
+ <source>Transaction must have at least one recipient</source>
+ <translation type="unfinished">Me whiwhi whakaritenga tātari tētahi whiwhi whakaritenga ki te kaiwhiwhi kotahi i te minimuma</translation>
+ </message>
+ <message>
+ <source>Transaction needs a change address, but we can't generate it.</source>
+ <translation type="unfinished">He hiahia te whakarerekē i te whakaritenga whakaritenga, engari kāore e taea e mātou te whakaputa.</translation>
+ </message>
+ <message>
+ <source>Transaction too large</source>
+ <translation type="unfinished">He whakawhitiwhitinga nui rawa te whakapau kaha</translation>
+ </message>
+ <message>
+ <source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
+ <translation type="unfinished">Kāore e taea te whakararuraru i te mahere mō te -maxsigcachesize: '%s' MiB</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer (bind returned error %s)</source>
+ <translation type="unfinished">Kāore e taea te whakakōtuitui ki %s i tēnei rorohiko (kua whakahoki te whakakōtuitui i te hapa %s)</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation type="unfinished">Kāore e taea te whakakōtuitui ki %s i tēnei rorohiko. E whakapau kē ana te %s e whakahaere ana.</translation>
+ </message>
+ <message>
+ <source>Unable to create the PID file '%s': %s</source>
+ <translation type="unfinished">Kāore e taea te hanga i te kōnae PID '%s': %s</translation>
+ </message>
+ <message>
+ <source>Unable to find UTXO for external input</source>
+ <translation type="unfinished">Kāore i te kite i te UTXO mō te whakauru ā-waho</translation>
+ </message>
+ <message>
+ <source>Unable to generate initial keys</source>
+ <translation type="unfinished">Kāore e taea te whakaputa i ngā kī tīmatanga</translation>
+ </message>
+ <message>
+ <source>Unable to generate keys</source>
+ <translation type="unfinished">Kāore e taea te whakaputa i ngā kī</translation>
+ </message>
+ <message>
+ <source>Unable to open %s for writing</source>
+ <translation type="unfinished">Kāore e taea te whakatuwhera i %s hei tuhi</translation>
+ </message>
+ <message>
+ <source>Unable to parse -maxuploadtarget: '%s'</source>
+ <translation type="unfinished">Kāore e taea te whakamāori i te -maxuploadtarget: '%s'</translation>
+ </message>
+ <message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation type="unfinished">Kāore e taea te whakahohe i te tūmau HTTP. Tirohia te rārangi whakararuraru mō ngā whakamārama.</translation>
+ </message>
+ <message>
+ <source>Unable to unload the wallet before migrating</source>
+ <translation type="unfinished">Kāore e taea te whakakore i te whareparakore i mua i te whakawhiti.</translation>
+ </message>
+ <message>
+ <source>Unknown -blockfilterindex value %s.</source>
+ <translation type="unfinished">-He mea kore te -blockfilterindex whiwhi %s.</translation>
+ </message>
+ <message>
+ <source>Unknown address type '%s'</source>
+ <translation type="unfinished">He aha te momo wāhitau kore mō '%s'</translation>
+ </message>
+ <message>
+ <source>Unknown change type '%s'</source>
+ <translation type="unfinished">He whakararuraru, he momo hēhē '%s'</translation>
+ </message>
+ <message>
+ <source>Unknown network specified in -onlynet: '%s'</source>
+ <translation type="unfinished">He whakamāoritia te tekau whakamāoritanga:
+'Unknown network specified in -onlynet: '%s''</translation>
+ </message>
+ <message>
+ <source>Unknown new rules activated (versionbit %i)</source>
+ <translation type="unfinished">He whakapau kaha hōu kua whakakāhoretia (wāhanga %i)</translation>
+ </message>
+ <message>
+ <source>Unsupported logging category %s=%s.</source>
+ <translation type="unfinished">Kāore i te tautoko te kāwai rorohiko %s=%s</translation>
+ </message>
+ <message>
+ <source>User Agent comment (%s) contains unsafe characters.</source>
+ <translation type="unfinished">Te korero a te kaihoko (%s) e whakararuraru ana i ngā tohu kore whakapau kaha.</translation>
+ </message>
+ <message>
+ <source>Verifying blocks…</source>
+ <translation type="unfinished">Whakamāramatia ngā paraka...</translation>
+ </message>
+ <message>
+ <source>Verifying wallet(s)…</source>
+ <translation type="unfinished">Whakamātau i te wharepukapuka...</translation>
+ </message>
+ <message>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation type="unfinished">Me whakakore i te whare moni: whakamatau i te %s hei whakakore i te whakamutunga</translation>
+ </message>
+ <message>
+ <source>Settings file could not be read</source>
+ <translation type="unfinished">Kāore i taea te pānui i te kōnae tautuhinga</translation>
+ </message>
+ <message>
+ <source>Settings file could not be written</source>
+ <translation type="unfinished">Kāore i taea te tuhi i te kōnae tautuhinga</translation>
+ </message>
+</context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_mk.ts b/src/qt/locale/bitcoin_mk.ts
index 8558fe17ba..9fd41c2646 100644
--- a/src/qt/locale/bitcoin_mk.ts
+++ b/src/qt/locale/bitcoin_mk.ts
@@ -3,15 +3,15 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Десен клик за уредување на адреса или етикета</translation>
+ <translation type="unfinished">Десно притискање за уредување на адреса или етикета</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Креирај нова адреса</translation>
+ <translation type="unfinished">Создај нова адреса</translation>
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">&amp;Нова</translation>
+ <translation type="unfinished">Нова</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
@@ -19,47 +19,265 @@
</message>
<message>
<source>&amp;Copy</source>
- <translation type="unfinished">&amp;Копирај</translation>
+ <translation type="unfinished">Копирај</translation>
</message>
<message>
<source>C&amp;lose</source>
- <translation type="unfinished">З&amp;атвори</translation>
+ <translation type="unfinished">Затвори</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Избриши ја избраната адреса од листата</translation>
+ <translation type="unfinished">Избриши ја избраната адреса од списокот</translation>
+ </message>
+ <message>
+ <source>Enter address or label to search</source>
+ <translation type="unfinished">Пребарувајте по адреса или име</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Експортирај ги податоците од активното јазиче во датотека</translation>
+ <translation type="unfinished">Извези ги податоците од активното јазиче во датотека</translation>
</message>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;Експорт</translation>
+ <translation type="unfinished">Извези</translation>
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">&amp;Избриши</translation>
+ <translation type="unfinished">Избриши</translation>
</message>
- </context>
+ <message>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">Избери адреса на која ќе испратиш монети</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation type="unfinished">Избери адреса за примање монети</translation>
+ </message>
+ <message>
+ <source>C&amp;hoose</source>
+ <translation type="unfinished">Избери</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
+ <translation type="unfinished">Ова се вашите Bitcoin-адреси за испраќање плаќања. Секогаш проверувајте ја количината и адресите за примање пред да испраќате монети.</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
+Signing is only possible with addresses of the type 'legacy'.</source>
+ <translation type="unfinished">Ова се вашите биткоин-адреси за примање плаќања. Користете го копчето „Создавање нови адреси“ во јазичето за примање за да создадете нови адреси. Потпишувањето е можно само со „наследни“ адреси.</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Address</source>
+ <translation type="unfinished">Копирај адреса</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Label</source>
+ <translation type="unfinished">Копирај етикета</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished">Уредувај</translation>
+ </message>
+ <message>
+ <source>Export Address List</source>
+ <translation type="unfinished">Извадете список со адреси</translation>
+ </message>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">Датотека одвоена со запирка</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
+ <translation type="unfinished">Настана грешка при зачувувањето на списокот со адреси на %1. Ве молиме обидете се пак.</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Извозот не успеа</translation>
+ </message>
+</context>
+<context>
+ <name>AddressTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Етикета</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Адреса</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(без етикета)</translation>
+ </message>
+</context>
<context>
<name>AskPassphraseDialog</name>
<message>
+ <source>Passphrase Dialog</source>
+ <translation type="unfinished">Прескокнувачки дијалог</translation>
+ </message>
+ <message>
<source>Enter passphrase</source>
- <translation type="unfinished">Внеси тајна фраза</translation>
+ <translation type="unfinished">Внеси лозинка</translation>
</message>
<message>
<source>New passphrase</source>
- <translation type="unfinished">Нова тајна фраза</translation>
+ <translation type="unfinished">Нова лозинка</translation>
</message>
<message>
<source>Repeat new passphrase</source>
- <translation type="unfinished">Повторете ја новата тајна фраза</translation>
+ <translation type="unfinished">Повтори ја лозинката</translation>
</message>
- </context>
+ <message>
+ <source>Show passphrase</source>
+ <translation type="unfinished">Покажување на лозинката</translation>
+ </message>
+ <message>
+ <source>Encrypt wallet</source>
+ <translation type="unfinished">Шифрирај паричник</translation>
+ </message>
+ <message>
+ <source>This operation needs your wallet passphrase to unlock the wallet.</source>
+ <translation type="unfinished">Операцијава бара лозинка од вашиот паричник за да го отклучи паричникот.</translation>
+ </message>
+ <message>
+ <source>Unlock wallet</source>
+ <translation type="unfinished">Отклучи паричник</translation>
+ </message>
+ <message>
+ <source>Change passphrase</source>
+ <translation type="unfinished">Промени лозинка</translation>
+ </message>
+ <message>
+ <source>Confirm wallet encryption</source>
+ <translation type="unfinished">Потврди шифрирање на паричникот</translation>
+ </message>
+ <message>
+ <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
+ <translation type="unfinished">ВНИМАНИЕ: Ако го шифрирате вашиот паричник и ја изгубите лозинката, &lt;b&gt;ЌЕ ГИ ИЗГУБИТЕ СИТЕ БИТКОИНИ&lt;/b&gt;!</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to encrypt your wallet?</source>
+ <translation type="unfinished">Навистина ли сакате да го шифрирате паричникот?</translation>
+ </message>
+ <message>
+ <source>Wallet encrypted</source>
+ <translation type="unfinished">Паричникот е шифриран</translation>
+ </message>
+ <message>
+ <source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
+ <translation type="unfinished">Внесете нова лозинка за паричникот. &lt;br/&gt;Користете лозинка од &lt;b&gt;десет или повеќе случајни знаци&lt;/b&gt; или &lt;b&gt;осум или повеќе збора&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase for the wallet.</source>
+ <translation type="unfinished">Внесете ја старата и новата лозинка за паричникот.</translation>
+ </message>
+ <message>
+ <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation type="unfinished">Запомнете дека шифрирањето на вашиот паричник не може целосно да ги заштити вашите биткоини од кражба од злонамерен софтвер, заразувајќи го вашиот сметач.</translation>
+ </message>
+ <message>
+ <source>Wallet to be encrypted</source>
+ <translation type="unfinished">Паричник за шифрирање</translation>
+ </message>
+ <message>
+ <source>Your wallet is about to be encrypted. </source>
+ <translation type="unfinished">Вашиот паричник ќе биде шифриран.</translation>
+ </message>
+ <message>
+ <source>Your wallet is now encrypted. </source>
+ <translation type="unfinished">Вашиот паричник сега е шифриран.</translation>
+ </message>
+ <message>
+ <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
+ <translation type="unfinished">ВАЖНО: Сите стари зачувувања што сте ги направиле на вашиот паричник мораат да се заменат со зачувувања на новопримениот шифриран паричник. Од безбедносни причини, претходните нешифрирани зачувувања на паричникот ќе станат неупотребливи веднаш штом ќе почнете да го користите новиот шифриран паричник.</translation>
+ </message>
+ <message>
+ <source>Wallet encryption failed</source>
+ <translation type="unfinished">Шифрирањето беше неуспешно</translation>
+ </message>
+ <message>
+ <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
+ <translation type="unfinished">Шифрирањето на паричникот не успеа поради софтверски проблем. Паричникот не е шифриран.</translation>
+ </message>
+ <message>
+ <source>The supplied passphrases do not match.</source>
+ <translation type="unfinished">Лозинките не се совпаѓаат.</translation>
+ </message>
+ <message>
+ <source>Wallet unlock failed</source>
+ <translation type="unfinished">Отклучувањето беше неуспешно</translation>
+ </message>
+ <message>
+ <source>The passphrase entered for the wallet decryption was incorrect.</source>
+ <translation type="unfinished">Внесената лозинка за дешифрирање на паричникот е неточна.</translation>
+ </message>
+ <message>
+ <source>Wallet passphrase was successfully changed.</source>
+ <translation type="unfinished">Лозинката за паричникот е успешно променета.</translation>
+ </message>
+ <message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Промената на лозинката беше неуспешна</translation>
+ </message>
+ <message>
+ <source>Warning: The Caps Lock key is on!</source>
+ <translation type="unfinished">Внимание: копчето Caps Lock е вклучено!</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>IP/Netmask</source>
+ <translation type="unfinished">IP/Мрежна маска</translation>
+ </message>
+ <message>
+ <source>Banned Until</source>
+ <translation type="unfinished">Блокиран до</translation>
+ </message>
+</context>
+<context>
+ <name>BitcoinApplication</name>
+ <message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">Датотеката со поставки %1 може да е оштетена или неважечка.</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">Настана голема грешка. %1 не може безбедно да продолжи и ќе се затвори.</translation>
+ </message>
+ <message>
+ <source>Internal error</source>
+ <translation type="unfinished">Внатрешна грешка</translation>
+ </message>
+ <message>
+ <source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
+ <translation type="unfinished">Настана внатрешна грешка. %1 ќе се обиде да продолжи безбедно. Ова е неочекувана грешка што може да се пријави како што е опишано подолу.</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
<message>
+ <source>Do you want to reset settings to default values, or to abort without making changes?</source>
+ <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
+ <translation type="unfinished">Сакате ли да ги вратите поставките на нивните изворни вредности или да излезете без да направите никакви промени?</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">Настана голема грешка. Проверете дали датотеката со поставки може да се уредува или пробајте да започнете без поставки.</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Грешка: %1</translation>
+ </message>
+ <message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1не излезе безбедно...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Сума</translation>
</message>
@@ -152,56 +370,197 @@
<name>BitcoinGUI</name>
<message>
<source>&amp;Overview</source>
- <translation type="unfinished">&amp;Преглед</translation>
+ <translation type="unfinished">Преглед</translation>
+ </message>
+ <message>
+ <source>Show general overview of wallet</source>
+ <translation type="unfinished">Прикажи општ преглед на паричникот</translation>
</message>
<message>
<source>&amp;Transactions</source>
- <translation type="unfinished">&amp;Трансакции</translation>
+ <translation type="unfinished">Трансакции</translation>
</message>
<message>
<source>Browse transaction history</source>
- <translation type="unfinished">Преглед на историјата на трансакции</translation>
+ <translation type="unfinished">Разгледај ја историјата на трансакциите</translation>
</message>
<message>
<source>E&amp;xit</source>
- <translation type="unfinished">И&amp;злез</translation>
+ <translation type="unfinished">Излез</translation>
</message>
<message>
<source>Quit application</source>
- <translation type="unfinished">Напушти ја апликацијата</translation>
+ <translation type="unfinished">Излез од примената</translation>
+ </message>
+ <message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">За %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Покажи информација за %1</translation>
</message>
<message>
<source>About &amp;Qt</source>
- <translation type="unfinished">За &amp;Qt</translation>
+ <translation type="unfinished">За Qt</translation>
</message>
<message>
<source>Show information about Qt</source>
<translation type="unfinished">Прикажи информации за Qt</translation>
</message>
<message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Промени поставки за %1</translation>
+ </message>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">Создај нов паричник</translation>
+ </message>
+ <message>
+ <source>&amp;Minimize</source>
+ <translation type="unfinished">Намали</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Паричник</translation>
+ </message>
+ <message>
+ <source>Network activity disabled.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">Мрежата е исклучена</translation>
+ </message>
+ <message>
+ <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
+ <translation type="unfinished">Проксито е &lt;b&gt;дозволено&lt;/b&gt;: %1</translation>
+ </message>
+ <message>
<source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">Испрати биткоини на Биткоин адреса</translation>
+ <translation type="unfinished">Испрати биткоини на биткоин-адреса</translation>
+ </message>
+ <message>
+ <source>Backup wallet to another location</source>
+ <translation type="unfinished">Зачувување на паричникот на друго место</translation>
+ </message>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">Промена на лозинката за паричникот</translation>
</message>
<message>
<source>&amp;Send</source>
- <translation type="unfinished">&amp;Испрати</translation>
+ <translation type="unfinished">Испрати</translation>
</message>
<message>
<source>&amp;Receive</source>
- <translation type="unfinished">&amp;Прими</translation>
+ <translation type="unfinished">Прими</translation>
+ </message>
+ <message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">Поставки...</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">Шифрирај паричник...</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
- <translation type="unfinished">Криптирај ги приватните клучеви кои припаѓаат на твојот паричник</translation>
+ <translation type="unfinished">Шифрирање на личните клучеви што припаѓаат на вашиот паричник</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">Сигурносен паричник...</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;Промени лозинка...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">Потпиши &amp;порака...</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">Напишете пораки со вашата биткоин-адреса за да докажете дека е ваша.</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Потврди порака...</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation type="unfinished">Потврдување на пораките за да се знае дека се напишани со дадените биткоин-адреси.</translation>
+ </message>
+ <message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Вчитај PSBT од датотека…</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Отвори &amp;URI…</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Затвори паричник...</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Создај паричник...</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Затвори ги сите паричници...</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Датотека</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">&amp;Подесувања</translation>
+ <translation type="unfinished">&amp;Поставки</translation>
</message>
<message>
<source>&amp;Help</source>
<translation type="unfinished">&amp;Помош</translation>
</message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">Лента со алатки</translation>
+ </message>
+ <message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Синхронизација на заглавијата (%1 %)...</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Мрежна синхронизација...</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Индексирање на блокови од дискот...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Обработување блокови на дискови...</translation>
+ </message>
+ <message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">Поврзување со врсници...</translation>
+ </message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation type="unfinished">Барање за плаќања (создава QR-кодови и биткоин: URI)</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation type="unfinished">Прикажување на списокот со користени адреси и имиња</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation type="unfinished">Прикажи список на користени адреси и имиња.</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation type="unfinished">&amp;Достапни команди</translation>
+ </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
@@ -212,7 +571,19 @@
</message>
<message>
<source>%1 behind</source>
- <translation type="unfinished">%1 позади</translation>
+ <translation type="unfinished">%1 зад</translation>
+ </message>
+ <message>
+ <source>Catching up…</source>
+ <translation type="unfinished">Стигнување...</translation>
+ </message>
+ <message>
+ <source>Last received block was generated %1 ago.</source>
+ <translation type="unfinished">Последниот примен блок беше создаден пред %1.</translation>
+ </message>
+ <message>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation type="unfinished">Трансакции после тоа сѐ уште нема да бидат видливи.</translation>
</message>
<message>
<source>Error</source>
@@ -220,16 +591,138 @@
</message>
<message>
<source>Warning</source>
- <translation type="unfinished">Предупредување</translation>
+ <translation type="unfinished">Внимание</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation type="unfinished">Информација</translation>
</message>
<message>
<source>Up to date</source>
<translation type="unfinished">Во тек</translation>
</message>
<message>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">Вчитајте делумно потпишана биткоин-трансакција</translation>
+ </message>
+ <message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Вчитајте PSBT од &amp;клипбордот...</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
+ <translation type="unfinished">Вчитајте делумно потпишана биткоин-трансакција од клипбордот</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Прозорец на јазолот</translation>
+ </message>
+ <message>
+ <source>Open node debugging and diagnostic console</source>
+ <translation type="unfinished">Отвори конзола за отстранување на грешки и дијагностика на јазли</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses</source>
+ <translation type="unfinished">&amp;Испраќање на адреси</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses</source>
+ <translation type="unfinished">&amp;Примање на адреси</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI</source>
+ <translation type="unfinished">Отвори биткоин: URI</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <translation type="unfinished">Отвори го паричникот</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Отвори паричник</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Затвори паричник</translation>
+ </message>
+ <message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Обнови паричник...</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Обновување паричник од сигурносна датотека</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Затвори ги сите паричници</translation>
+ </message>
+ <message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation type="unfinished">Прикажи %1 помошна порака за да добиеш список на можни биткоин-команди.</translation>
+ </message>
+ <message>
+ <source>&amp;Mask values</source>
+ <translation type="unfinished">Прикриј ги вредностите</translation>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">Прикриј ги вредностите во разделот Преглед</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Паричник по подразбирање</translation>
+ </message>
+ <message>
+ <source>No wallets available</source>
+ <translation type="unfinished">Нема достапни паричници</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Податоци за паричникот</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Вчитување на сигурносната копија на паричникот</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Обновување на паричникот</translation>
+ </message>
+ <message>
+ <source>Wallet Name</source>
+ <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
+ <translation type="unfinished">Име на паричникот</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation type="unfinished">&amp;Прозорец</translation>
</message>
+ <message>
+ <source>Zoom</source>
+ <translation type="unfinished">Зголеми</translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished">Главен прозорец</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation type="unfinished">%1 клиент</translation>
+ </message>
+ <message>
+ <source>&amp;Hide</source>
+ <translation type="unfinished">&amp;Скриј</translation>
+ </message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">&amp;Покажи</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -240,6 +733,34 @@
</translation>
</message>
<message>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">Допрете за повеќе дејства.</translation>
+ </message>
+ <message>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">Исклучи ја мрежната активност</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">Исклучи ја мрежната активност</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">Вклучи ја мрежната активност</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Грешка: %1</translation>
+ </message>
+ <message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">Внимание: %1</translation>
+ </message>
+ <message>
<source>Date: %1
</source>
<translation type="unfinished">Дата: %1
@@ -252,6 +773,12 @@
</translation>
</message>
<message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">Паричник: %1
+</translation>
+ </message>
+ <message>
<source>Type: %1
</source>
<translation type="unfinished">Тип: %1
@@ -269,10 +796,57 @@
<translation type="unfinished">Адреса: %1
</translation>
</message>
- </context>
+ <message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">Испратена трансакција</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation type="unfinished">Дојдовна трансакција</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
+ <translation type="unfinished">Создавањето на HD-клуч е &lt;b&gt;вклучено&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">Создавањето на HD-клуч е &lt;b&gt;исклучено&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">Личниот клуч е &lt;b&gt;исклучен&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
+ <translation type="unfinished">Паричникот е &lt;b&gt;шифриран&lt;/b&gt; и &lt;b&gt;отклучен&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">Паричникот е &lt;b&gt;шифриран&lt;/b&gt; и &lt;b&gt;заклучен&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Original message:</source>
+ <translation type="unfinished">Изворна порака:</translation>
+ </message>
+</context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation type="unfinished">Ставка за прикажување суми. Притиснете за да изберете друга единица.</translation>
+ </message>
+</context>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation type="unfinished">Избор на монети</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">Количество:</translation>
+ </message>
+ <message>
<source>Bytes:</source>
<translation type="unfinished">Бајти:</translation>
</message>
@@ -285,10 +859,6 @@
<translation type="unfinished">Провизија:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Прашина:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">После Провизија:</translation>
</message>
@@ -297,6 +867,18 @@
<translation type="unfinished">Кусур:</translation>
</message>
<message>
+ <source>(un)select all</source>
+ <translation type="unfinished">(од)означи сѐ</translation>
+ </message>
+ <message>
+ <source>Tree mode</source>
+ <translation type="unfinished">Дрвовиден режим</translation>
+ </message>
+ <message>
+ <source>List mode</source>
+ <translation type="unfinished">список Режим</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Сума</translation>
</message>
@@ -304,10 +886,49 @@
<source>Date</source>
<translation type="unfinished">Дата</translation>
</message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(без етикета)</translation>
+ </message>
+ </context>
+<context>
+ <name>OpenWalletActivity</name>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Паричник по подразбирање</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
+ <translation type="unfinished">Отвори паричник</translation>
+ </message>
+ </context>
+<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Обновување на паричникот</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletController</name>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Затвори паричник</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Затвори ги сите паричници</translation>
+ </message>
</context>
<context>
<name>CreateWalletDialog</name>
<message>
+ <source>Wallet Name</source>
+ <translation type="unfinished">Име на паричникот</translation>
+ </message>
+ <message>
<source>Wallet</source>
<translation type="unfinished">Паричник</translation>
</message>
@@ -423,6 +1044,10 @@
<context>
<name>OverviewPage</name>
<message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">Само гледање</translation>
+ </message>
+ <message>
<source>Total:</source>
<translation type="unfinished">Вкупно:</translation>
</message>
@@ -435,6 +1060,11 @@
<translation type="unfinished">Испратени</translation>
</message>
<message>
+ <source>Address</source>
+ <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
+ <translation type="unfinished">Адреса</translation>
+ </message>
+ <message>
<source>Network</source>
<extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
<translation type="unfinished">Мрежа</translation>
@@ -463,9 +1093,21 @@
<translation type="unfinished">Верзија</translation>
</message>
<message>
+ <source>Node window</source>
+ <translation type="unfinished">Прозорец на јазолот</translation>
+ </message>
+ <message>
<source>&amp;Console</source>
<translation type="unfinished">&amp;Конзола</translation>
</message>
+ <message>
+ <source>Yes</source>
+ <translation type="unfinished">Да</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation type="unfinished">Не</translation>
+ </message>
</context>
<context>
<name>ReceiveCoinsDialog</name>
@@ -493,14 +1135,26 @@
<context>
<name>ReceiveRequestDialog</name>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">Адреса:</translation>
+ </message>
+ <message>
<source>Amount:</source>
<translation type="unfinished">Сума:</translation>
</message>
<message>
+ <source>Label:</source>
+ <translation type="unfinished">Етикета:</translation>
+ </message>
+ <message>
<source>Message:</source>
<translation type="unfinished">Порака:</translation>
</message>
<message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Паричник</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">Копирај &amp;URI</translation>
</message>
@@ -515,10 +1169,26 @@
<source>Date</source>
<translation type="unfinished">Дата</translation>
</message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Етикета</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(без етикета)</translation>
+ </message>
</context>
<context>
<name>SendCoinsDialog</name>
<message>
+ <source>Send Coins</source>
+ <translation type="unfinished">Испраќање</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">Количество:</translation>
+ </message>
+ <message>
<source>Bytes:</source>
<translation type="unfinished">Бајти:</translation>
</message>
@@ -538,10 +1208,6 @@
<source>Change:</source>
<translation type="unfinished">Кусур:</translation>
</message>
- <message>
- <source>Dust:</source>
- <translation type="unfinished">Прашина:</translation>
- </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -550,7 +1216,11 @@
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(без етикета)</translation>
+ </message>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -591,30 +1261,114 @@
<source>Date</source>
<translation type="unfinished">Дата</translation>
</message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Етикета</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">Примено</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(без етикета)</translation>
+ </message>
+ <message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">Вид трансакција:</translation>
+ </message>
</context>
<context>
<name>TransactionView</name>
<message>
+ <source>This month</source>
+ <translation type="unfinished">Овој месец</translation>
+ </message>
+ <message>
+ <source>Last month</source>
+ <translation type="unfinished">Претходниот месец</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">Оваа година</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">Примено</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation type="unfinished">Други</translation>
+ </message>
+ <message>
+ <source>Min amount</source>
+ <translation type="unfinished">Минимална сума</translation>
+ </message>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">Датотека одвоена со запирка</translation>
+ </message>
+ <message>
<source>Date</source>
<translation type="unfinished">Дата</translation>
</message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Етикета</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Адреса</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Извозот не успеа</translation>
+ </message>
</context>
<context>
<name>WalletFrame</name>
<message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">Создај нов паричник</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">Грешка</translation>
</message>
</context>
<context>
+ <name>WalletModel</name>
+ <message>
+ <source>Send Coins</source>
+ <translation type="unfinished">Испраќање</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">Паричник по подразбирање</translation>
+ </message>
+</context>
+<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;Експорт</translation>
+ <translation type="unfinished">Извези</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Експортирај ги податоците од активното јазиче во датотека</translation>
+ <translation type="unfinished">Извези ги податоците од активното јазиче во датотека</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Податоци за паричникот</translation>
+ </message>
+ </context>
+<context>
+ <name>bitcoin-core</name>
+ <message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">Недоволно средства</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_ml.ts b/src/qt/locale/bitcoin_ml.ts
index 944081fed2..2bb0d996df 100644
--- a/src/qt/locale/bitcoin_ml.ts
+++ b/src/qt/locale/bitcoin_ml.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">തി&amp;രഞ്ഞെടുക്കുക</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">അയക്കേണ്ട വിലാസങ്ങൾ</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">സ്വീകരിക്കുന്ന വിലാസങ്ങൾ</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">പൈസ അയയ്ക്കുന്നതിനുള്ള നിങ്ങളുടെ ബിറ്റ് കോയിൻ വിലാസങ്ങളാണ് ഇവ. നാണയങ്ങൾ അയയ്ക്കുന്നതിനുമുമ്പ് എല്ലായ്പ്പോഴും തുകയും സ്വീകരിക്കുന്ന വിലാസവും പരിശോധിക്കുക.</translation>
</message>
@@ -92,6 +84,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">കയറ്റുമതി വിലാസങ്ങൾ </translation>
</message>
<message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">കോമയാൽ വേർതിരിച്ച ഫയൽ (* .csv)</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">കയറ്റുമതി പരാജയപ്പെട്ടു</translation>
</message>
@@ -214,10 +211,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">വാലറ്റ് ഡീക്രിപ്ഷനായി നൽകിയ പാസ്‌ഫ്രേസ് തെറ്റാണ്.</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">വാലറ്റ് ഡീക്രിപ്ഷനായി നൽകിയ പാസ്ഫ്രെയ്സ് തെറ്റാണ്. അതിൽ ഒരു ശൂന്യ പ്രതീകം അടങ്ങിയിരിക്കുന്നു (അതായത് - ഒരു സീറോ ബൈറ്റ്). 25.0-ന് മുമ്പ് ഈ സോഫ്‌റ്റ്‌വെയറിൻ്റെ ഒരു പതിപ്പ് ഉപയോഗിച്ചാണ് പാസ്‌ഫ്രെയ്‌സ് സജ്ജീകരിച്ചതെങ്കിൽ, ആദ്യത്തെ അസാധുവായ പ്രതീകം വരെയുള്ള - എന്നാൽ ഉൾപ്പെടുത്താതെയുള്ള പ്രതീകങ്ങൾ മാത്രം ഉപയോഗിച്ച് വീണ്ടും ശ്രമിക്കുക. ഇത് വിജയകരമാണെങ്കിൽ, ഭാവിയിൽ ഈ പ്രശ്‌നം ഒഴിവാക്കുന്നതിന് ദയവായി ഒരു പുതിയ പാസ്‌ഫ്രെയ്‌സ് സജ്ജീകരിക്കുക.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">വാലറ്റ് പാസ്‌ഫ്രെയ്‌സ് വിജയകരമായി മാറ്റി.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">പാസ്‌ഫ്രെയ്‌സ് മാറ്റം പരാജയപ്പെട്ടു</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">വാലറ്റ് ഡീക്രിപ്‌ഷനായി നൽകിയ പഴയ പാസ്‌ഫ്രെയ്‌സ് തെറ്റാണ്. അതിൽ ഒരു ശൂന്യ പ്രതീകം അടങ്ങിയിരിക്കുന്നു (അതായത് - ഒരു സീറോ ബൈറ്റ്). 25.0-ന് മുമ്പ് ഈ സോഫ്‌റ്റ്‌വെയറിൻ്റെ ഒരു പതിപ്പ് ഉപയോഗിച്ചാണ് പാസ്‌ഫ്രെയ്‌സ് സജ്ജീകരിച്ചതെങ്കിൽ, ആദ്യത്തെ അസാധുവായ പ്രതീകം വരെയുള്ള - എന്നാൽ ഉൾപ്പെടുത്താതെയുള്ള പ്രതീകങ്ങൾ മാത്രം ഉപയോഗിച്ച് വീണ്ടും ശ്രമിക്കുക.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">മുന്നറിയിപ്പ്: ക്യാപ്‌സ് ലോക്ക് കീ ഓണാണ്!</translation>
</message>
@@ -236,6 +245,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">ക്രമീകരണങ്ങൾ ഫയൽ %1 കേടായതോ അസാധുവായതോ ആയിരിക്കാം.</translation>
+ </message>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">റൺവേ ഒഴിവാക്കൽ പിശക്</translation>
+ </message>
+ <message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
<translation type="unfinished">മാരകമായ ഒരു പിശക് സംഭവിച്ചു. %1 ന് മേലിൽ സുരക്ഷിതമായി തുടരാനാകില്ല, ഒപ്പം ഉപേക്ഷിക്കുകയും ചെയ്യും.</translation>
</message>
@@ -259,6 +276,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Enter a Bitcoin address (e.g. %1)</source>
<translation type="unfinished">ഒരു ബിറ്റ്കോയിൻ വിലാസം നൽകുക(e.g. %1)</translation>
</message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
+ <translation type="unfinished">അകത്തേക്കു വരുന്ന</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">പുറത്തേക് പോകുന്ന </translation>
+ </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
@@ -354,7 +381,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet:</source>
- <translation type="unfinished">വാലറ്റ്:</translation>
+ <translation type="unfinished">പണസഞ്ചി </translation>
</message>
<message>
<source>Network activity disabled.</source>
@@ -367,7 +394,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
- <translation type="unfinished">ഒരു ബിറ്റ്കോയിൻ വിലാസത്തിലേക്ക് നാണയങ്ങൾ അയയ്ക്കുക</translation>
+ <translation type="unfinished">ഒരു ബിറ്റ്‌കോയിൻ വിലാസത്തിലേക് പണം അയക്കുക </translation>
</message>
<message>
<source>Backup wallet to another location</source>
@@ -386,6 +413,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;സ്വീകരിക്കുക</translation>
</message>
<message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">ഇഷ്‌ടമുള്ളത്‌ തിരഞ്ഞെടുക്കല്‍</translation>
+ </message>
+ <message>
<source>Encrypt the private keys that belong to your wallet</source>
<translation type="unfinished">നിങ്ങളുടെ വാലറ്റിന്റെ സ്വകാര്യ കീകൾ എൻ‌ക്രിപ്റ്റ് ചെയ്യുക</translation>
</message>
@@ -525,6 +556,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">വാലറ്റ് ഒന്നും ലഭ്യം അല്ല </translation>
</message>
<message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">വാലറ്റ് പുനഃസ്ഥാപിക്കുക</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">വാലറ്റ് പേര്</translation>
@@ -653,10 +689,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ഫീസ്‌ / പ്രതിഫലം :</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">പൊടി:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">ഫീസ് കഴിഞ്ഞ്:</translation>
</message>
@@ -721,10 +753,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ബൈറ്റ്സ് പകർത്തു</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">ഡസ്ട് പകർത്തു</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">ചേഞ്ച് പകർത്തു</translation>
</message>
@@ -733,18 +761,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 ലോക്ക് ആക്കിയിരിക്കുന്നു)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">അതെ / ശരി</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ഇല്ല</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">ഏതെങ്കിലും സ്വീകർത്താവിന് നിലവിലെ ഡസ്ട് പരിധിയേക്കാൾ ചെറിയ തുക ലഭിക്കുകയാണെങ്കിൽ ഈ ലേബൽ ചുവപ്പായി മാറുന്നു.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">ഒരു ഇൻപുട്ടിന് +/-%1 സതോഷി(കൾ) വ്യത്യാസം ഉണ്ടാകാം.</translation>
</message>
@@ -790,6 +806,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">വാലറ്റ് പുനഃസ്ഥാപിക്കുക</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -969,6 +993,26 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>OptionsDialog</name>
<message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation type="unfinished">(0 = ഓട്ടോ, &lt;0 = അത്രയും കോറുകൾ സൗജന്യമായി വിടുക)</translation>
+ </message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">വാലറ്റ്</translation>
+ </message>
+ <message>
+ <source>Expert</source>
+ <translation type="unfinished">വിദഗ്ധൻ</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">&amp;പോർട്ട്:</translation>
+ </message>
+ <message>
+ <source>Tor</source>
+ <translation type="unfinished">ടോർ</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation type="unfinished">&amp;ജാലകം </translation>
</message>
@@ -988,6 +1032,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ലഭ്യമായ</translation>
</message>
<message>
+ <source>Pending:</source>
+ <translation type="unfinished">തീരുമാനിക്കപ്പെടാത്ത</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation type="unfinished">മിച്ചം ഉള്ള തുക </translation>
+ </message>
+ <message>
+ <source>Total:</source>
+ <translation type="unfinished">മൊത്തം</translation>
+ </message>
+ <message>
+ <source>Your current total balance</source>
+ <translation type="unfinished">നിങ്ങളുടെ നിലവിൽ ഉള്ള മുഴുവൻ തുക </translation>
+ </message>
+ <message>
<source>Spendable:</source>
<translation type="unfinished">വിനിയോഗിക്കാവുന്നത് / ചെലവാക്കാവുന്നത് </translation>
</message>
@@ -999,13 +1059,29 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>PSBTOperationsDialog</name>
<message>
+ <source>Save…</source>
+ <translation type="unfinished">സൂക്ഷിക്കുക</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished">അവസാനിപ്പിക്കുക</translation>
+ </message>
+ <message>
<source>Signed transaction successfully. Transaction is ready to broadcast.</source>
<translation type="unfinished">ഇടപാട് വിജയകരമായി ഒപ്പിട്ടു. ഇടപാട് പ്രക്ഷേപണത്തിന് തയ്യാറാണ്</translation>
</message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">മുഴുവന്‍ തുക </translation>
+ </message>
</context>
<context>
<name>PaymentServer</name>
<message>
+ <source>Payment request error</source>
+ <translation type="unfinished">പണം അഭ്യര്‍ത്ഥന പിശക്‌</translation>
+ </message>
+ <message>
<source>URI handling</source>
<translation type="unfinished">യു‌ആർ‌ഐ കൈകാര്യം ചെയ്യൽ</translation>
</message>
@@ -1035,6 +1111,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">പിംഗ് </translation>
</message>
<message>
+ <source>Age</source>
+ <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
+ <translation type="unfinished">പ്രായം</translation>
+ </message>
+ <message>
<source>Sent</source>
<extracomment>Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</extracomment>
<translation type="unfinished">അയക്കുക </translation>
@@ -1049,10 +1130,61 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
<translation type="unfinished">വിലാസം</translation>
</message>
+ <message>
+ <source>Type</source>
+ <extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
+ <translation type="unfinished">തരം</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
+ <translation type="unfinished">ശൃംഖല</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An Inbound Connection from a Peer.</extracomment>
+ <translation type="unfinished">അകത്തേക്കു വരുന്ന</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">പുറത്തേക് പോകുന്ന </translation>
+ </message>
+</context>
+<context>
+ <name>QRImageWidget</name>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">ചിത്രം സൂക്ഷിക്കുക</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">ചിത്രം പകര്‍ത്തുക</translation>
+ </message>
</context>
<context>
<name>RPCConsole</name>
<message>
+ <source>&amp;Information</source>
+ <translation type="unfinished">അറിയിപ്പ്</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="unfinished">പൊതുവായ</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">ശൃംഖല</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">നാമപദം</translation>
+ </message>
+ <message>
+ <source>Wallet: </source>
+ <translation type="unfinished">പണസഞ്ചി</translation>
+ </message>
+ <message>
<source>Received</source>
<translation type="unfinished">ലഭിച്ചവ </translation>
</message>
@@ -1094,6 +1226,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Wallet:</source>
<translation type="unfinished">വാലറ്റ്:</translation>
</message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">ചിത്രം സൂക്ഷിക്കുക</translation>
+ </message>
</context>
<context>
<name>RecentRequestsTableModel</name>
@@ -1137,10 +1273,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">മാറ്റം</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">പൊടി:</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">നിര്‍ദ്ധിഷ്‌ടസംഖ്യ / അളവ് പകർത്തുക</translation>
</message>
@@ -1161,13 +1293,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ബൈറ്റ്സ് പകർത്തു</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">ഡസ്ട് പകർത്തു</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">ചേഞ്ച് പകർത്തു</translation>
</message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">മുഴുവന്‍ തുക </translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -1228,6 +1360,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">തീയതി </translation>
</message>
<message>
+ <source>Type</source>
+ <translation type="unfinished">തരം</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">ലേബൽ</translation>
</message>
@@ -1239,6 +1375,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>TransactionView</name>
<message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">കോമയാൽ വേർതിരിച്ച ഫയൽ (* .csv)</translation>
+ </message>
+ <message>
<source>Confirmed</source>
<translation type="unfinished">സ്ഥിതീകരിച്ചു</translation>
</message>
@@ -1247,6 +1388,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">തീയതി </translation>
</message>
<message>
+ <source>Type</source>
+ <translation type="unfinished">തരം</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">ലേബൽ</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mn.ts b/src/qt/locale/bitcoin_mn.ts
index d6c18c0df6..222018e036 100644
--- a/src/qt/locale/bitcoin_mn.ts
+++ b/src/qt/locale/bitcoin_mn.ts
@@ -54,14 +54,6 @@
<translation type="unfinished">С&amp;онго</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Илгээх хаягууд</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Хүлээн авах хаяг</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Эдгээр Биткойн хаягууд нь илгээх хаягууд. Хүлээн авах хаяг болон тоо хэмжээг илгээхээсээ өмнө сайн нягталж үзэж байна уу</translation>
</message>
@@ -956,10 +948,6 @@
<translation type="unfinished">Явуулсан хаяг</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Ѳѳрлүүгээ хийсэн тѳлбѳр</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Олборлогдсон</translation>
</message>
@@ -1023,10 +1011,6 @@
<translation type="unfinished">Явуулсан хаяг</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Ѳѳрлүүгээ</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Олборлогдсон</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mr.ts b/src/qt/locale/bitcoin_mr.ts
index f6aa22c712..7e9d3055dc 100644
--- a/src/qt/locale/bitcoin_mr.ts
+++ b/src/qt/locale/bitcoin_mr.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;निवडा</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">प्रेषक पत्ते</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">स्वीकृती पत्ते</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">पैसे पाठविण्यासाठीचे हे तुमचे बिटकॉईन पत्त्ते आहेत. नाणी पाठविण्यापूर्वी नेहमी रक्कम आणि प्राप्त होणारा पत्ता तपासून पहा.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mr_IN.ts b/src/qt/locale/bitcoin_mr_IN.ts
index 18d08c2816..b8ae2fa29b 100644
--- a/src/qt/locale/bitcoin_mr_IN.ts
+++ b/src/qt/locale/bitcoin_mr_IN.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;निवडा</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">प्रेषक पत्ते</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">स्वीकृती पत्ते</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">पैसे पाठविण्यासाठीचे हे तुमचे बिटकॉईन पत्त्ते आहेत. नाणी पाठविण्यापूर्वी नेहमी रक्कम आणि प्राप्त होणारा पत्ता तपासून पहा.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ms.ts b/src/qt/locale/bitcoin_ms.ts
index 645528d491..9d20510264 100644
--- a/src/qt/locale/bitcoin_ms.ts
+++ b/src/qt/locale/bitcoin_ms.ts
@@ -60,14 +60,6 @@ Alihkan fail data ke dalam tab semasa</translation>
<translation type="unfinished">&amp;Pilih</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">alamat-alamat penghantaran</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">alamat-alamat penerimaan</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ini adalah alamat Bitcoin anda untuk pembayaran. Periksa jumlah dan alamat penerima sebelum membuat penghantaran koin sentiasa.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_mt.ts b/src/qt/locale/bitcoin_mt.ts
new file mode 100644
index 0000000000..e26087fe80
--- /dev/null
+++ b/src/qt/locale/bitcoin_mt.ts
@@ -0,0 +1,1082 @@
+<TS version="2.1" language="mt">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Right-click to edit address or label</source>
+ <translation type="unfinished">Ikklikkja bil-lemin tal-maws biex teditja l-indirizz jew it-tikketta</translation>
+ </message>
+ <message>
+ <source>Create a new address</source>
+ <translation type="unfinished">Oħloq indirizz ġdid</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">&amp;Ġdid</translation>
+ </message>
+ <message>
+ <source>Copy the currently selected address to the system clipboard</source>
+ <translation type="unfinished">Ikkopja l-indirizz magħżul bħalissa fil-clipboard tas-sistema</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished">&amp;Kopja</translation>
+ </message>
+ <message>
+ <source>C&amp;lose</source>
+ <translation type="unfinished">Qrib</translation>
+ </message>
+ <message>
+ <source>Delete the currently selected address from the list</source>
+ <translation type="unfinished">Ħassar l-indirizz magħżul bħalissa mil-lista</translation>
+ </message>
+ <message>
+ <source>Enter address or label to search</source>
+ <translation type="unfinished">Daħħal l-indirizz jew it-tikketta biex tfittex</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Esporta d-dejta fit-tab kurrenti għal fajl</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Esportazzjoni</translation>
+ </message>
+ <message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Ħassar</translation>
+ </message>
+ <message>
+ <source>Choose the address to send coins to</source>
+ <translation type="unfinished">Agħżel l-indirizz fejn tibgħat il-muniti</translation>
+ </message>
+ <message>
+ <source>Choose the address to receive coins with</source>
+ <translation type="unfinished">Agħżel l-indirizz fejn tirċievi l-muniti</translation>
+ </message>
+ <message>
+ <source>C&amp;hoose</source>
+ <translation type="unfinished">Agħżel</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
+ <translation type="unfinished">Dawn huma l-indirizzi Bitcoin tiegħek biex tibgħat il-ħlasijiet. Dejjem iċċekkja l-ammont u l-indirizz li tirċievi qabel ma tibgħat muniti.</translation>
+ </message>
+ <message>
+ <source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
+Signing is only possible with addresses of the type 'legacy'.</source>
+ <translation type="unfinished">Dawn huma l-indirizzi Bitcoin tiegħek biex tirċievi ħlasijiet. Uża l-buttuna 'Oħloq indirizz riċevitur ġdid' fit-tab tar-riċeviment biex toħloq indirizzi ġodda.
+L-iffirmar huwa possibbli biss b'indirizzi tat-tip 'legacy'.</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Address</source>
+ <translation type="unfinished">&amp;Kopja l-Indirizz</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Label</source>
+ <translation type="unfinished">Kopja &amp; Tikketta</translation>
+ </message>
+ <message>
+ <source>&amp;Edit</source>
+ <translation type="unfinished">&amp;Editja</translation>
+ </message>
+ <message>
+ <source>Export Address List</source>
+ <translation type="unfinished">Lista ta' Indirizzi ta' Esportazzjoni</translation>
+ </message>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">Fajl separat bil-virgola</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
+ <translation type="unfinished">Kien hemm żball meta ppruvaw issalva l-lista tal-indirizzi f'%1. Jekk jogħġbok erġa pprova.</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">L-esportazzjoni falliet</translation>
+ </message>
+</context>
+<context>
+ <name>AddressTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Tikketta</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Indirizz</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(l-ebda tikketta)</translation>
+ </message>
+</context>
+<context>
+ <name>AskPassphraseDialog</name>
+ <message>
+ <source>Passphrase Dialog</source>
+ <translation type="unfinished">Passphrase Djalogu</translation>
+ </message>
+ <message>
+ <source>Enter passphrase</source>
+ <translation type="unfinished">Daħħal passphrase</translation>
+ </message>
+ <message>
+ <source>New passphrase</source>
+ <translation type="unfinished">Passphrase ġdida</translation>
+ </message>
+ <message>
+ <source>Repeat new passphrase</source>
+ <translation type="unfinished">Irrepeti passphrase ġdida</translation>
+ </message>
+ <message>
+ <source>Show passphrase</source>
+ <translation type="unfinished">Uri passphrase</translation>
+ </message>
+ <message>
+ <source>Encrypt wallet</source>
+ <translation type="unfinished">Kriptaġġ kartiera</translation>
+ </message>
+ <message>
+ <source>This operation needs your wallet passphrase to unlock the wallet.</source>
+ <translation type="unfinished">Din l-operazzjoni teħtieġ passphrase tal-kartiera tiegħek biex tiftaħ il-kartiera.</translation>
+ </message>
+ <message>
+ <source>Unlock wallet</source>
+ <translation type="unfinished">Nisfruttaw il-kartiera</translation>
+ </message>
+ <message>
+ <source>Change passphrase</source>
+ <translation type="unfinished">Ibdel passphrase</translation>
+ </message>
+ <message>
+ <source>Confirm wallet encryption</source>
+ <translation type="unfinished">Ikkonferma l-kriptaġġ tal-kartiera</translation>
+ </message>
+ <message>
+ <source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
+ <translation type="unfinished">Twissija: Jekk tikkodifika l-kartiera tiegħek u titlef il-passphrase tiegħek, int se &lt;b&gt;TILEF IL-BITCOINS KOLLHA TIEGĦEK&lt;/b&gt;!</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to encrypt your wallet?</source>
+ <translation type="unfinished">Int żgur li tixtieq tikkodifika l-kartiera tiegħek?</translation>
+ </message>
+ <message>
+ <source>Wallet encrypted</source>
+ <translation type="unfinished">Kartiera encrypted</translation>
+ </message>
+ <message>
+ <source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
+ <translation type="unfinished">Daħħal il-passphrase l-ġdida għall-kartiera.&lt;br/&gt;Jekk jogħġbok uża passphrase ta' &lt;b&gt;għaxar karattri jew aktar każwali&lt;/b&gt;, jew &lt;b&gt; tmien kelmiet jew aktar&lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase for the wallet.</source>
+ <translation type="unfinished">Daħħal il-passphrase l-antika u l-passphrase ġdida għall-kartiera.</translation>
+ </message>
+ <message>
+ <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation type="unfinished">Ftakar li l-kriptaġġ tal-kartiera tiegħek ma jistax jipproteġi bis-sħiħ il-bitcoins tiegħek milli jinsterqu minn malware li jinfetta l-kompjuter tiegħek.</translation>
+ </message>
+ <message>
+ <source>Wallet to be encrypted</source>
+ <translation type="unfinished">Kartiera għandha tiġi encrypted</translation>
+ </message>
+ <message>
+ <source>Your wallet is about to be encrypted. </source>
+ <translation type="unfinished">Il-kartiera tiegħek waslet biex tiġi encrypted.</translation>
+ </message>
+ <message>
+ <source>Your wallet is now encrypted. </source>
+ <translation type="unfinished">Il-kartiera tiegħek issa hija kriptata.</translation>
+ </message>
+ <message>
+ <source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
+ <translation type="unfinished">IMPORTANTI: Kwalunkwe backups preċedenti li għamilt tal-fajl tal-kartiera tiegħek għandhom jiġu sostitwiti bil-fajl tal-kartiera iġġenerat ġdid u kriptat. Għal raġunijiet ta' sigurtà, backups preċedenti tal-fajl tal-kartiera mhux kriptat se jsiru inutli hekk kif tibda tuża l-kartiera l-ġdida u kriptata.</translation>
+ </message>
+ <message>
+ <source>Wallet encryption failed</source>
+ <translation type="unfinished">Il-kriptaġġ tal-kartiera falla</translation>
+ </message>
+ <message>
+ <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
+ <translation type="unfinished">Il-kriptaġġ tal-kartiera falla minħabba żball intern. Il-kartiera tiegħek ma kinitx encrypted.</translation>
+ </message>
+ <message>
+ <source>The supplied passphrases do not match.</source>
+ <translation type="unfinished">Il-passphrases fornuti ma jaqblux.</translation>
+ </message>
+ <message>
+ <source>Wallet unlock failed</source>
+ <translation type="unfinished">Il-ftuħ tal-kartiera falla</translation>
+ </message>
+ <message>
+ <source>The passphrase entered for the wallet decryption was incorrect.</source>
+ <translation type="unfinished">Il-passphrase mdaħħla għad-deċifrar tal-kartiera ma kinitx korretta.</translation>
+ </message>
+ <message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">Il-passphrase mdaħħla għad-decryption tal-kartiera mhix korretta. Fiha karattru null (jiġifieri - byte żero). Jekk il-passphrase ġiet issettjata b'verżjoni ta' dan is-software qabel 25.0, jekk jogħġbok erġa' pprova bil-karattri biss sa — iżda mhux inkluż — l-ewwel karattru null. Jekk dan jirnexxi, jekk jogħġbok waqqaf passphrase ġdida biex tevita din il-kwistjoni fil-futur.</translation>
+ </message>
+ <message>
+ <source>Wallet passphrase was successfully changed.</source>
+ <translation type="unfinished">Il-passphrase tal-kartiera nbidlet b'suċċess.</translation>
+ </message>
+ <message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Il-bidla fil-passphrase falliet</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">Il-passphrase l-antika mdaħħla għad-decryption tal-kartiera mhix korretta. Fiha karattru null (jiġifieri - byte żero). Jekk il-passphrase ġiet issettjata b'verżjoni ta' dan is-software qabel 25.0, jekk jogħġbok erġa' pprova bil-karattri biss sa — iżda mhux inkluż — l-ewwel karattru null.</translation>
+ </message>
+ <message>
+ <source>Warning: The Caps Lock key is on!</source>
+ <translation type="unfinished">Twissija: Iċ-ċavetta Caps Lock hija mixgħula!</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>Banned Until</source>
+ <translation type="unfinished">Ipprojbit Sa</translation>
+ </message>
+</context>
+<context>
+ <name>BitcoinApplication</name>
+ <message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">Il-fajl tas-settings %1jista' jkun korrott jew invalidu.</translation>
+ </message>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Eċċezzjoni maħruba</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">Sar żball fatali. %1ma tistax tkompli b'mod sigur u se tieqaf.</translation>
+ </message>
+ <message>
+ <source>Internal error</source>
+ <translation type="unfinished">Żball intern</translation>
+ </message>
+ <message>
+ <source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
+ <translation type="unfinished">Sar żball intern. %1se jipprova jkompli mingħajr periklu. Dan huwa bug mhux mistenni li jista 'jiġi rrappurtat kif deskritt hawn taħt.</translation>
+ </message>
+</context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Do you want to reset settings to default values, or to abort without making changes?</source>
+ <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
+ <translation type="unfinished">Trid tirrisettja s-settings għal valuri awtomatiċi, jew taborta mingħajr ma tagħmel bidliet?</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">Sar żball fatali. Iċċekkja li l-fajl tas-settings jista' jinkiteb, jew ipprova taħdem b'-nosettings.</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Żball:%1</translation>
+ </message>
+ <message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1għadu ma ħariġx b'mod sikur...</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n second(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n minute(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>&amp;Overview</source>
+ <translation type="unfinished">&amp;Ħarsa ġenerali</translation>
+ </message>
+ <message>
+ <source>Show general overview of wallet</source>
+ <translation type="unfinished">Uri ħarsa ġenerali ġenerali tal-kartiera</translation>
+ </message>
+ <message>
+ <source>&amp;Transactions</source>
+ <translation type="unfinished">&amp;Transazzjonijiet</translation>
+ </message>
+ <message>
+ <source>Browse transaction history</source>
+ <translation type="unfinished">Fittex l-istorja tat-tranżazzjonijiet</translation>
+ </message>
+ <message>
+ <source>E&amp;xit</source>
+ <translation type="unfinished">Ħruġ</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation type="unfinished">Nieqaf applikazzjoni</translation>
+ </message>
+ <message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">&amp;Dwar%1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Uri informazzjoni dwar%1</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished">Dwar &amp;Qt</translation>
+ </message>
+ <message>
+ <source>Show information about Qt</source>
+ <translation type="unfinished">Uri informazzjoni dwar Qt</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Immodifika l-għażliet tal-konfigurazzjoni għal%1</translation>
+ </message>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">Oħloq kartiera ġdida</translation>
+ </message>
+ <message>
+ <source>&amp;Minimize</source>
+ <translation type="unfinished">&amp;Imminimizza</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Kartiera:</translation>
+ </message>
+ <message>
+ <source>Network activity disabled.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">Attività tan-netwerk diżattivata.</translation>
+ </message>
+ <message>
+ <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
+ <translation type="unfinished">Proxy huwa &lt;b&gt;attivat&lt;/b&gt;:%1</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation type="unfinished">Ibgħat muniti f'indirizz Bitcoin</translation>
+ </message>
+ <message>
+ <source>Backup wallet to another location</source>
+ <translation type="unfinished">Kartiera backup għal post ieħor</translation>
+ </message>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">Ibdel il-passphrase użata għall-kriptaġġ tal-kartiera</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation type="unfinished">&amp;Ibgħat</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation type="unfinished">&amp;Irċievi</translation>
+ </message>
+ <message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Għażliet...</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">&amp;Encrypt Wallet...</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation type="unfinished">Kriptaġġ iċ-ċwievet privati li jappartjenu għall-kartiera tiegħek</translation>
+ </message>
+ <message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">Kartiera &amp;Backup...</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">&amp;Ibdel il-passphrase...</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">Iffirma &amp;messaġġ...</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">Iffirma messaġġi bl-indirizzi Bitcoin tiegħek biex tipprova li inti stess</translation>
+ </message>
+ <message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">&amp;Ivverifika l-messaġġ...</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation type="unfinished">Ivverifika l-messaġġi biex tiżgura li ġew iffirmati b'indirizzi Bitcoin speċifikati</translation>
+ </message>
+ <message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">&amp;Tagħbija PSBT mill-fajl...</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Iftaħ &amp;URI...</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">Agħlaq Kartiera...</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">Oħloq Kartiera...</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">Agħlaq il-Kartieri Kollha...</translation>
+ </message>
+ <message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Fajl</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;Għajnuna</translation>
+ </message>
+ <message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Tissinkronizza l-headers (%1%)...</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Sinkronizzazzjoni man-netwerk...</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Indiċjar ta' blokki fuq disk...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Ipproċessa blokki fuq disk...</translation>
+ </message>
+ <message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">Konnessjoni ma' sħabhom...</translation>
+ </message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation type="unfinished">Itlob ħlasijiet (jiġġenera kodiċijiet QR u bitcoin: URIs)</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation type="unfinished">Uri l-lista tal-indirizzi u t-tikketti li jintbagħtu użati</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation type="unfinished">Uri l-lista ta' indirizzi u tikketti riċevituri użati</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation type="unfinished">&amp; Għażliet tal-linja tal-kmand</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform>Blokk(i) ipproċessat%n tal-istorja tat-tranżazzjonijiet.</numerusform>
+ <numerusform>Blokk(i) ipproċessat%n tal-istorja tat-tranżazzjonijiet.</numerusform>
+ <numerusform>Blokk(i) ipproċessat%n tal-istorja tat-tranżazzjonijiet.</numerusform>
+ <numerusform>Blokk(i) ipproċessat%ntal-istorja tat-tranżazzjonijiet.</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>%1 behind</source>
+ <translation type="unfinished">%1wara</translation>
+ </message>
+ <message>
+ <source>Catching up…</source>
+ <translation type="unfinished">Ilaħħqu...</translation>
+ </message>
+ <message>
+ <source>Last received block was generated %1 ago.</source>
+ <translation type="unfinished">L-aħħar blokk riċevut ġie ġġenerat %1ilu.</translation>
+ </message>
+ <message>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation type="unfinished">Transazzjonijiet wara dan għadhom mhux se jkunu viżibbli.</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Żball</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="unfinished">Twissija</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation type="unfinished">Informazzjoni</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation type="unfinished">Aġġornat</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">Tagħbija Transazzjoni Bitcoin iffirmata parzjalment</translation>
+ </message>
+ <message>
+ <source>Load PSBT from &amp;clipboard…</source>
+ <translation type="unfinished">Tagħbija PSBT minn &amp;clipboard...</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
+ <translation type="unfinished">Tagħbija Transazzjoni Bitcoin iffirmata parzjalment mill-clipboard</translation>
+ </message>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Tieqa tan-node</translation>
+ </message>
+ <message>
+ <source>Open node debugging and diagnostic console</source>
+ <translation type="unfinished">Iftaħ node debugging u console dijanjostika</translation>
+ </message>
+ <message>
+ <source>&amp;Sending addresses</source>
+ <translation type="unfinished">&amp; Tibgħat indirizzi</translation>
+ </message>
+ <message>
+ <source>&amp;Receiving addresses</source>
+ <translation type="unfinished">&amp;Riċeviment indirizzi</translation>
+ </message>
+ <message>
+ <source>Open a bitcoin: URI</source>
+ <translation type="unfinished">Iftaħ bitcoin: URI</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <translation type="unfinished">Iftaħ Kartiera</translation>
+ </message>
+ <message>
+ <source>Open a wallet</source>
+ <translation type="unfinished">Iftaħ kartiera</translation>
+ </message>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Agħlaq il-kartiera</translation>
+ </message>
+ <message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Irrestawra l-Kartiera...</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Irrestawra kartiera minn fajl backup</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Agħlaq il-kartieri kollha</translation>
+ </message>
+ <message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation type="unfinished">Uri %1l-messaġġ ta 'għajnuna biex tikseb lista b'għażliet possibbli tal-linja tal-kmand Bitcoin</translation>
+ </message>
+ <message>
+ <source>&amp;Mask values</source>
+ <translation type="unfinished">&amp;Valuri tal-maskra</translation>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">Maskra l-valuri fit-tab Ħarsa ġenerali</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">kartiera default</translation>
+ </message>
+ <message>
+ <source>No wallets available</source>
+ <translation type="unfinished">Ebda kartieri disponibbli</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Dejta tal-Kartiera</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Tagħbija Backup tal-Kartiera</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Irrestawra Kartiera</translation>
+ </message>
+ <message>
+ <source>Wallet Name</source>
+ <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
+ <translation type="unfinished">Isem tal-Kartiera</translation>
+ </message>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp; Tieqa</translation>
+ </message>
+ <message>
+ <source>Main Window</source>
+ <translation type="unfinished">Tieqa Prinċipali</translation>
+ </message>
+ <message>
+ <source>%1 client</source>
+ <translation type="unfinished">%1klijent</translation>
+ </message>
+ <message>
+ <source>&amp;Hide</source>
+ <translation type="unfinished">&amp;Aħbi</translation>
+ </message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">Uri</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">
+ <numerusform>%nkonnessjoni(jiet) attiva(i) man-netwerk Bitcoin.</numerusform>
+ <numerusform>%nkonnessjoni(jiet) attiva(i) man-netwerk Bitcoin.</numerusform>
+ <numerusform>%nkonnessjoni(jiet) attiva(i) man-netwerk Bitcoin.</numerusform>
+ <numerusform>%nkonnessjoni(jiet) attiva(i) man-netwerk Bitcoin.</numerusform>
+ </translation>
+ </message>
+ <message>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">Ikklikkja għal aktar azzjonijiet.</translation>
+ </message>
+ <message>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">Uri tab Peers</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">Iddiżattiva l-attività tan-netwerk</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">Ippermetti l-attività tan-netwerk</translation>
+ </message>
+ <message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Intestaturi ta' qabel is-sinkronizzazzjoni (%1%)...</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Żball:%1</translation>
+ </message>
+ <message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">Twissija:%1</translation>
+ </message>
+ <message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">Data:%1
+</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation type="unfinished">Ammont:%1
+</translation>
+ </message>
+ <message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">Kartiera:%1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation type="unfinished">Tip:%1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation type="unfinished">Tikketta:%1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation type="unfinished">Indirizz:%1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">Transazzjoni mibgħuta</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation type="unfinished">Transazzjoni deħlin</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
+ <translation type="unfinished">Il-ġenerazzjoni taċ-ċavetta HD hija &lt;b&gt;ppermettiet&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">HD key ġenerazzjoni hija&lt;b&gt;b'diżabilità&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">Ċavetta privata&lt;b&gt;b'diżabilità&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
+ <translation type="unfinished">Kartiera hija&lt;b&gt;encrypted&lt;/b&gt;u bħalissa&lt;b&gt;jinfetaħ&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">Kartiera hija&lt;b&gt;encrypted&lt;/b&gt;u bħalissa&lt;b&gt;msakkra&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Original message:</source>
+ <translation type="unfinished">Messaġġ oriġinali:</translation>
+ </message>
+</context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation type="unfinished">Unità biex turi l-ammonti pulzieri Ikklikkja biex tagħżel unità oħra.</translation>
+ </message>
+</context>
+<context>
+ <name>CoinControlDialog</name>
+ <message>
+ <source>Coin Selection</source>
+ <translation type="unfinished">Għażla tal-Muniti</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">Kwantità:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Ammont:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">Tariffa:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">Wara Ħlas:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">Bidla:</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(l-ebda tikketta)</translation>
+ </message>
+ </context>
+<context>
+ <name>OpenWalletActivity</name>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">kartiera default</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
+ <translation type="unfinished">Iftaħ Kartiera</translation>
+ </message>
+ </context>
+<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Irrestawra Kartiera</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletController</name>
+ <message>
+ <source>Close wallet</source>
+ <translation type="unfinished">Agħlaq il-kartiera</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Agħlaq il-kartieri kollha</translation>
+ </message>
+ </context>
+<context>
+ <name>CreateWalletDialog</name>
+ <message>
+ <source>Wallet Name</source>
+ <translation type="unfinished">Isem tal-Kartiera</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message numerus="yes">
+ <source>%n GB of space available</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(%n GB needed for full chain)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(sufficient to restore backups %n day(s) old)</source>
+ <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Żball</translation>
+ </message>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ <message>
+ <source>&amp;Window</source>
+ <translation type="unfinished">&amp; Tieqa</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Żball</translation>
+ </message>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ <message>
+ <source>Address</source>
+ <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
+ <translation type="unfinished">Indirizz</translation>
+ </message>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>Node window</source>
+ <translation type="unfinished">Tieqa tan-node</translation>
+ </message>
+ </context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Ammont:</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Kartiera:</translation>
+ </message>
+ </context>
+<context>
+ <name>RecentRequestsTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Tikketta</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(l-ebda tikketta)</translation>
+ </message>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">Kwantità:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">Ammont:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">Tariffa:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">Wara Ħlas:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">Bidla:</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(l-ebda tikketta)</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionDesc</name>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Tikketta</translation>
+ </message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(l-ebda tikketta)</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionView</name>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">Fajl separat bil-virgola</translation>
+ </message>
+ <message>
+ <source>Label</source>
+ <translation type="unfinished">Tikketta</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">Indirizz</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">L-esportazzjoni falliet</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletFrame</name>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">Oħloq kartiera ġdida</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Żball</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletModel</name>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">kartiera default</translation>
+ </message>
+</context>
+<context>
+ <name>WalletView</name>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">&amp;Esportazzjoni</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Esporta d-dejta fit-tab kurrenti għal fajl</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Dejta tal-Kartiera</translation>
+ </message>
+ </context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_my.ts b/src/qt/locale/bitcoin_my.ts
index 54711d381f..0e546f3741 100644
--- a/src/qt/locale/bitcoin_my.ts
+++ b/src/qt/locale/bitcoin_my.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">​ရွေးပါ</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">လိပ်စာပေးပို့နေသည်</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">လိပ်စာလက်ခံရရှိသည်</translation>
- </message>
- <message>
<source>&amp;Edit</source>
<translation type="unfinished">&amp;ပြင်ဆင်</translation>
</message>
@@ -174,14 +166,6 @@
<source>Date</source>
<translation type="unfinished">နေ့စွဲ</translation>
</message>
- <message>
- <source>yes</source>
- <translation type="unfinished">ဟုတ်တယ်</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">မဟုတ်ဘူး</translation>
- </message>
</context>
<context>
<name>Intro</name>
diff --git a/src/qt/locale/bitcoin_nb.ts b/src/qt/locale/bitcoin_nb.ts
index bb0ed7a135..015496d587 100644
--- a/src/qt/locale/bitcoin_nb.ts
+++ b/src/qt/locale/bitcoin_nb.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Velg</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Avsender adresser</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Mottager adresser</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Dette er dine Bitcoin adresser for å sende å sende betalinger. Husk å sjekke beløp og mottager adresser før du sender mynter.</translation>
</message>
@@ -856,10 +848,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Gebyr:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Støv:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Totalt:</translation>
</message>
@@ -944,10 +932,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopiér bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiér støv</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopier veksel</translation>
</message>
@@ -956,18 +940,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 låst)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ja</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">nei</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Denne merkelappen blir rød hvis en mottaker får mindre enn gjeldende støvterskel.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Kan variere +/- %1 satoshi(er) per input.</translation>
</message>
@@ -1117,14 +1089,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Lag Tom Lommebok</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Bruk deskriptorer for scriptPubKey styring</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Deskriptor lommebok</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Bruk en ekstern undertegningsenhet, som en fysisk lommebok. Konfigurer det eksterne undertegningskriptet i lommebokinnstillingene først.</translation>
</message>
@@ -1137,10 +1101,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Opprett</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Kompilert uten sqlite støtte (kreves for deskriptor lommebok)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Kompilert uten støtte for ekstern undertegning (kreves for ekstern undertegning)</translation>
@@ -1604,14 +1564,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Bruk separate SOCKS&amp;5 proxy for å nå peers via Tor onion tjenester:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">Innebygd "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">nærmeste treff "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Avbryt</translation>
</message>
@@ -1829,8 +1781,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT lagret til disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Sender %1 til %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">egen adresse</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2647,10 +2599,6 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Inputs...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Støv:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Velg...</translation>
</message>
@@ -2715,10 +2663,6 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Kopiér bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiér støv</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopier veksel</translation>
</message>
@@ -3212,10 +3156,6 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Outputindeks</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(sertifikatet ble ikke bekreftet)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Forretningsdrivende</translation>
</message>
@@ -3306,10 +3246,6 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Sendt til</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Betaling til deg selv</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Utvunnet</translation>
</message>
@@ -3381,10 +3317,6 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<translation type="unfinished">Sendt til</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Til deg selv</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Utvunnet</translation>
</message>
@@ -3660,10 +3592,6 @@ Gå til Fil &gt; Åpne lommebok for å laste en lommebok.
<translation type="unfinished">Lisensiert MIT. Se tilhørende fil %s eller %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Feil under lesing av %s! Alle nøkler har blitt lest rett, men transaksjonsdata eller adressebokoppføringer kan mangle eller være uriktige.</translation>
- </message>
- <message>
<source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
<translation type="unfinished">Feil: Dumpfil formatoppføring stemmer ikke. Fikk "%s", forventet "format".</translation>
</message>
@@ -4079,10 +4007,6 @@ Mangler løsningsdata for å estimere transaksjonsstørrelse</translation>
<translation type="unfinished">Transaksjonsbeløpet kan ikke være negativt</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transaksjonen har for lang minnepoolkjede</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transaksjonen må ha minst én mottaker</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ne.ts b/src/qt/locale/bitcoin_ne.ts
index 10e8b8202f..c54fb40a37 100644
--- a/src/qt/locale/bitcoin_ne.ts
+++ b/src/qt/locale/bitcoin_ne.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">छनौट गर्नुहोस्...</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">पठाउने ठेगानाहरू</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">प्राप्त गर्ने ठेगानाहरू...</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">यी भुक्तानी गर्नका लागि तपाइका बिट्कोइन ठेगानाहरू हुन्। सिक्काहरू पठाउनुअघि रकम र प्राप्त गर्ने ठेगाना जाँच गर्नुहोस।</translation>
</message>
@@ -96,6 +88,14 @@
<translation type="unfinished">ठेगाना सुची %1मा बचत गर्ने प्रयासमा त्रुटि भएको छ। कृपया पुनः प्रयास गर्नुहोस।</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">ठेगानाहरू पठाउँदै - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">ठेगानाहरू प्राप्त गर्दै - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">निर्यात असफल</translation>
</message>
@@ -110,7 +110,11 @@
<source>Address</source>
<translation type="unfinished">ठेगाना</translation>
</message>
- </context>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(लेबल छैन)</translation>
+ </message>
+</context>
<context>
<name>AskPassphraseDialog</name>
<message>
@@ -138,6 +142,10 @@
<translation type="unfinished">वालेट इन्क्रिप्ट गर्नुहोस् </translation>
</message>
<message>
+ <source>This operation needs your wallet passphrase to unlock the wallet.</source>
+ <translation type="unfinished">यो अपरेसनलाई वालेट अनलक गर्न तपाईंको वालेट पासफ्रेज चाहिन्छ।</translation>
+ </message>
+ <message>
<source>Unlock wallet</source>
<translation type="unfinished">वालेट अनलक गर्नुहोस्</translation>
</message>
@@ -158,6 +166,26 @@
<translation type="unfinished">वालेट इन्क्रिप्ट भयो</translation>
</message>
<message>
+ <source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
+ <translation type="unfinished">वालेटको लागि नयाँ पासफ्रेज प्रविष्ट गर्नुहोस्। &lt;br/&gt;कृपया पासफ्रेज प्रयोग गर्नुहोस् &lt;b&gt;दस वा बढी अनियमित वर्णहरू &lt;/b&gt;, वा &lt;b&gt;आठ वा बढी शब्दहरू &lt;/b&gt;.</translation>
+ </message>
+ <message>
+ <source>Enter the old passphrase and new passphrase for the wallet.</source>
+ <translation type="unfinished">वालेटको लागि पुरानो पासफ्रेज र नयाँ पासफ्रेज प्रविष्ट गर्नुहोस्।</translation>
+ </message>
+ <message>
+ <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation type="unfinished">याद गर्नुहोस् कि तपाईको वालेट इन्क्रिप्ट गर्नाले तपाईको बिटकोइनलाई तपाईको कम्प्युटरमा मालवेयरले चोरी हुनबाट पूर्णतया सुरक्षित गर्न सक्दैन।</translation>
+ </message>
+ <message>
+ <source>Wallet to be encrypted</source>
+ <translation type="unfinished">वालेट इन्क्रिप्ट गर्न</translation>
+ </message>
+ <message>
+ <source>Your wallet is about to be encrypted. </source>
+ <translation type="unfinished">तपाईंको वालेट इन्क्रिप्ट हुन लागेको छ।</translation>
+ </message>
+ <message>
<source>Your wallet is now encrypted. </source>
<translation type="unfinished">अब वालेट इन्क्रिप्ट भएको छ।</translation>
</message>
@@ -166,10 +194,30 @@
<translation type="unfinished">वालेट इन्क्रिप्सन असफल </translation>
</message>
<message>
+ <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
+ <translation type="unfinished">आन्तरिक त्रुटिका कारण वालेट इन्क्रिप्सन असफल भयो। तपाईंको वालेट इन्क्रिप्ट गरिएको थिएन।</translation>
+ </message>
+ <message>
+ <source>The supplied passphrases do not match.</source>
+ <translation type="unfinished">प्रदान गरिएका पासफ्रेजहरू मेल खाँदैनन्।</translation>
+ </message>
+ <message>
<source>Wallet unlock failed</source>
<translation type="unfinished">वालेट अनलक असफल </translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption was incorrect.</source>
+ <translation type="unfinished">वालेट डिक्रिप्शनको लागि प्रविष्ट गरिएको पासफ्रेज गलत थियो।</translation>
+ </message>
+ <message>
+ <source>Wallet passphrase was successfully changed.</source>
+ <translation type="unfinished">वालेट पासफ्रेज सफलतापूर्वक परिवर्तन गरियो।</translation>
+ </message>
+ <message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">पासफ्रेज परिवर्तन असफल भयो</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">चेतावनी: क्याप्स लक कीप्याड अन छ!</translation>
</message>
@@ -188,10 +236,18 @@
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">सेटिङ फाइल %1 भ्रष्ट वा अवैध हुन सक्छ।</translation>
+ </message>
+ <message>
<source>Runaway exception</source>
<translation type="unfinished">रनअवे अपवाद</translation>
</message>
<message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">एउटा घातक त्रुटि भयो। %1 अब सुरक्षित रूपमा जारी राख्न सक्दैन र छोड्नेछ।</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">आन्तरिक दोष</translation>
</message>
@@ -199,6 +255,19 @@
<context>
<name>QObject</name>
<message>
+ <source>Do you want to reset settings to default values, or to abort without making changes?</source>
+ <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
+ <translation type="unfinished">के तपाइँ पूर्वनिर्धारित मानहरूमा सेटिङहरू रिसेट गर्न चाहनुहुन्छ, वा परिवर्तन नगरी रद्द गर्न चाहनुहुन्छ?</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">त्रुटि: %1</translation>
+ </message>
+ <message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1अझै सुरक्षित बाहिर निस्किएन...</translation>
+ </message>
+ <message>
<source>unknown</source>
<translation type="unfinished">थाहा नभयेको</translation>
</message>
@@ -390,6 +459,10 @@
<source>&amp;Help</source>
<translation type="unfinished">&amp;मद्दत</translation>
</message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">ट्याबहरू उपकरणपट्टी</translation>
+ </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
@@ -422,6 +495,10 @@
<numerusform />
</translation>
</message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">त्रुटि: %1</translation>
+ </message>
</context>
<context>
<name>CoinControlDialog</name>
@@ -442,12 +519,8 @@
<translation type="unfinished">पुष्टि भयो</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">हो</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">होइन</translation>
+ <source>(no label)</source>
+ <translation type="unfinished">(लेबल छैन)</translation>
</message>
</context>
<context>
@@ -469,7 +542,7 @@
</message>
<message>
<source>&amp;Address</source>
- <translation type="unfinished">&amp;ठेगाना </translation>
+ <translation type="unfinished">&amp;ठेगाना</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
@@ -539,7 +612,7 @@
</message>
<message>
<source>Unknown…</source>
- <translation type="unfinished">थाहा नभाको</translation>
+ <translation type="unfinished">थाहा नभाको...</translation>
</message>
<message>
<source>calculating…</source>
@@ -656,7 +729,7 @@
</message>
<message>
<source>Close</source>
- <translation type="unfinished">बन्द गर्नुहोस् </translation>
+ <translation type="unfinished">बन्द गर्नुहोस्</translation>
</message>
</context>
<context>
@@ -731,6 +804,10 @@
<source>Label</source>
<translation type="unfinished">लेबल</translation>
</message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(लेबल छैन)</translation>
+ </message>
</context>
<context>
<name>SendCoinsDialog</name>
@@ -745,7 +822,11 @@
<numerusform />
</translation>
</message>
- </context>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(लेबल छैन)</translation>
+ </message>
+</context>
<context>
<name>SendCoinsEntry</name>
<message>
@@ -820,6 +901,10 @@
<source>Label</source>
<translation type="unfinished">लेबल</translation>
</message>
+ <message>
+ <source>(no label)</source>
+ <translation type="unfinished">(लेबल छैन)</translation>
+ </message>
</context>
<context>
<name>TransactionView</name>
diff --git a/src/qt/locale/bitcoin_nl.ts b/src/qt/locale/bitcoin_nl.ts
index bee5febb2a..e0e3e3a138 100644
--- a/src/qt/locale/bitcoin_nl.ts
+++ b/src/qt/locale/bitcoin_nl.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">K&amp;iezen</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Verzendadressen</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Ontvangstadressen</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Dit zijn uw Bitcoin adressen om betalingen mee te verzenden. Controleer altijd het bedrag en het ontvangstadres voordat u uw bitcoins verzendt.</translation>
</message>
@@ -102,6 +94,14 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Een fout is opgetreden tijdens het opslaan van deze adreslijst naar %1. Probeer nogmaals.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Verzendadressen - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Ontvangstadressen - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Exporteren Mislukt</translation>
</message>
@@ -701,6 +701,14 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Sluit alle portemonnees</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Wallet migreren</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Een wallet migreren</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Toon het %1 hulpbericht om een lijst te krijgen met mogelijke Bitcoin commandoregelopties</translation>
</message>
@@ -789,6 +797,14 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Blokhoofden synchroniseren (%1%)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Fout bij wallet maken</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Kan geen nieuwe wallet maken, de software werd gecompileerd zonder sqlite-ondersteuning (nodig voor descriptor wallets)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Fout: %1</translation>
</message>
@@ -873,10 +889,6 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Vergoeding:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Stof:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Naheffing:</translation>
</message>
@@ -965,10 +977,6 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Kopieer bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopieër stof</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopieer wijziging</translation>
</message>
@@ -977,18 +985,6 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">(%1 geblokkeerd)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ja</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">nee</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Dit label wordt rood, als een ontvanger een bedrag van minder dan de huidige dust drempel gekregen heeft.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Kan per input +/- %1 satoshi(s) variëren.</translation>
</message>
@@ -1048,6 +1044,57 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Wallet migreren</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Weet je zeker dat je wil migreren van wallet &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">De wallet migreren converteert deze wallet naar één of meerdere descriptor wallets. Er moet een nieuwe wallet backup gemaakt worden.
+Indien deze wallet alleen lezen scripts bevat, wordt er een nieuwe wallet gemaakt die deze alleen lezen scripts bevat.
+Indien deze wallet oplosbare maar ongemonitorde scripts bevat, wordt er een andere en nieuwe wallet gemaakt die deze scripts bevat.
+
+Het migratieproces maakt voorafgaand aan het migreren een backup van de wallet. Dit backupbestand krijgt de naam &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak en is te vinden in de map van deze wallet. In het geval van een onjuiste migratie, kan de backup hersteld worden met de "Wallet Herstellen" functie.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Wallet migreren</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migreren wallet &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">De wallet '%1' werd succesvol gemigreerd.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Alleen lezen scripts zijn gemigreerd naar een nieuwe wallet met de naam '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Oplosbare maar ongemonitorde scripts zijn gemigreerd naar een nieuwe wallet met de naam '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migreren mislukt</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migreren succesvol</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1059,12 +1106,12 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
</message>
<message>
<source>default wallet</source>
- <translation type="unfinished">standaard wallet</translation>
+ <translation type="unfinished">standaard portemonnee</translation>
</message>
<message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Wallet openen</translation>
+ <translation type="unfinished">Portemonnee Openen</translation>
</message>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1104,7 +1151,7 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<name>WalletController</name>
<message>
<source>Close wallet</source>
- <translation type="unfinished">Wallet sluiten</translation>
+ <translation type="unfinished">Portemonnee Sluiten</translation>
</message>
<message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
@@ -1116,7 +1163,7 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
</message>
<message>
<source>Close all wallets</source>
- <translation type="unfinished">Alle wallets sluiten</translation>
+ <translation type="unfinished">Sluit alle portemonnees</translation>
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
@@ -1130,6 +1177,14 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Wallet aanmaken</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Je bent één stap verwijderd van het maken van je nieuwe wallet!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Voer aub een naam in en activeer, indien gewenst, geavanceerde opties</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Walletnaam</translation>
</message>
@@ -1162,14 +1217,6 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Lege wallet aanmaken</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Gebruik descriptors voor scriptPubKey-beheer</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Descriptorwallet</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Gebruik een externe signing device zoals een hardware wallet. Configureer eerst het externe signer script in de wallet voorkeuren.</translation>
</message>
@@ -1182,10 +1229,6 @@ Ondertekenen is alleen mogelijk met adressen van het type 'legacy'.</translation
<translation type="unfinished">Creëer</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Gecompileerd zonder sqlite-ondersteuning (nodig voor descriptor wallets)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Gecompileerd zonder ondersteuning voor externe ondertekenaars (vereist voor extern ondertekenen)</translation>
@@ -1720,18 +1763,6 @@ Ongebruikte mempool geheugen is gedeeld voor deze cache.</translation>
<translation type="unfinished">Gebruik afzonderlijke SOCKS &amp; 5-proxy om peers te bereiken via Tor Onion-services:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Monospaced lettertype in het Overzicht tab:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">ingebed "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">best overeenkomende "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Oké</translation>
</message>
@@ -1973,8 +2004,12 @@ Ongebruikte mempool geheugen is gedeeld voor deze cache.</translation>
<translation type="unfinished">PSBT opgeslagen op de schijf</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">Verstuur %1 naar %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Verzenden %1 van %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">eigen adres</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2222,6 +2257,18 @@ Als je deze fout ziet zou je de aanbieder moeten verzoeken om een BIP21-compatib
<translation type="unfinished">Selecteer een peer om gedetailleerde informatie te bekijken.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">De transport layer versie: %1</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">De BIP324 sessie ID string in hex, indien aanwezig.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">Sessie ID</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Versie</translation>
</message>
@@ -2431,6 +2478,21 @@ Als je deze fout ziet zou je de aanbieder moeten verzoeken om een BIP21-compatib
<translation type="unfinished">Uitgaand adres verkrijgen: Kort levend, voor opvragen van adressen</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">detecteren: Peer kan v1 of v2 zijn</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: onversleuteld, platte tekst transportprotocol</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 versleuteld transportprotocol</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">we selecteerden de peer voor relayen met hoge bandbreedte</translation>
</message>
@@ -2807,10 +2869,6 @@ Voor meer informatie over het gebruik van deze console, type %6.
<translation type="unfinished">Wis alle velden op het formulier.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Stof:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Kies...</translation>
</message>
@@ -2887,10 +2945,6 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">Kopieer bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopieër stof</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopieer wijziging</translation>
</message>
@@ -2921,10 +2975,6 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">Creëert een Gedeeltelijk Getekende Bitcoin Transactie (PSBT) om te gebruiken met b.v. een offline %1 wallet, of een PSBT-compatibele hardware wallet.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">van wallet '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 naar %2</translation>
</message>
@@ -2982,6 +3032,10 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">Controleer aub je transactievoorstel. Dit zal een Gedeeltelijk Getekende Bitcoin Transactie (PSBT) produceren die je kan opslaan of kopiëren en vervolgens ondertekenen met bijv. een offline %1 wallet, of een PSBT-combatibele hardware wallet.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 van wallet '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Wilt u deze transactie aanmaken?</translation>
@@ -3422,8 +3476,8 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">Transactie virtuele grootte</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certificaat kon niet worden geverifieerd)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Certificaat kon niet worden geverifieerd)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3512,10 +3566,6 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">Verzonden aan</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Betaling aan uzelf</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Gedolven</translation>
</message>
@@ -3591,10 +3641,6 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
<translation type="unfinished">Verzonden aan</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Aan uzelf</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Gedolven</translation>
</message>
@@ -3686,7 +3732,7 @@ Notitie: Omdat de vergoeding per byte wordt gerekend, zal een vergoeding van "10
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Exporteren mislukt</translation>
+ <translation type="unfinished">Exporteren Mislukt</translation>
</message>
<message>
<source>There was an error trying to save the transaction history to %1.</source>
@@ -3721,7 +3767,7 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
</message>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Nieuwe wallet aanmaken</translation>
+ <translation type="unfinished">Nieuwe wallet creëren</translation>
</message>
<message>
<source>Error</source>
@@ -3814,7 +3860,7 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
</message>
<message>
<source>default wallet</source>
- <translation type="unfinished">standaard wallet</translation>
+ <translation type="unfinished">standaard portemonnee</translation>
</message>
</context>
<context>
@@ -3868,6 +3914,10 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">%s beschadigd. Probeer de wallet tool bitcoin-wallet voor herstel of een backup terug te zetten.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s kon de momentopnamestatus -assumeutxo niet valideren. Dit duidt op een hardwareprobleem, een fout in de software of een slechte softwarewijziging waardoor een ongeldige momentopname kon worden geladen. Als gevolg hiervan wordt het node afgesloten en stopt het met het gebruik van elke status die op de momentopname is gebouwd, waardoor de ketenhoogte wordt gereset van %d naar %d. Bij de volgende herstart hervat het node de synchronisatie vanaf %d zonder momentopnamegegevens te gebruiken. Rapporteer dit incident aan %s, inclusief hoe u aan de momentopname bent gekomen. De kettingstatus van de ongeldige momentopname is op schijf achtergelaten voor het geval dit nuttig is bij het diagnosticeren van het probleem dat deze fout heeft veroorzaakt.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s verzoekt om te luisteren op poort %u. Deze poort wordt als "slecht" beschouwd en het is daarom onwaarschijnlijk dat Bitcoin Core peers er verbinding mee maken. Zie doc/p2p-bad-ports.md voor details en een volledige lijst.</translation>
</message>
@@ -3896,10 +3946,6 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">Fout bij het laden van portemonnee. Portemonnee vereist dat blokken worden gedownload en de software ondersteunt momenteel het laden van portemonnees terwijl blokken niet in de juiste volgorde worden gedownload bij gebruik van assumeutxo momentopnames. Portemonnee zou met succes moeten kunnen worden geladen nadat de synchronisatie de hoogte %s heeft bereikt</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Waarschuwing: Fout bij het lezen van %s! Alle sleutels zijn in goede orde uitgelezen, maar transactiedata of adresboeklemma's zouden kunnen ontbreken of fouten bevatten.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Fout bij het lezen van %s! Transactiegegevens kunnen ontbreken of onjuist zijn. Wallet opnieuw scannen.</translation>
</message>
@@ -3968,6 +4014,10 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">Prune: laatste wallet synchronisatie gaat verder terug dan de pruned gegevens. Je moet herindexeren met -reindex (de hele blokketen opnieuw downloaden in geval van een pruned node)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Hernoemen van '%s' -&gt; '%s' mislukt. U moet dit oplossen door de ongeldige snapshot-map %shandmatig te verplaatsen of te verwijderen, anders zult u bij de volgende keer opstarten dezelfde fout opnieuw tegenkomen.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: Onbekende sqlite wallet schema versie %d. Alleen versie %d wordt ondersteund.</translation>
</message>
@@ -3976,10 +4026,6 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">De blokdatabase bevat een blok dat lijkt uit de toekomst te komen. Dit kan gebeuren omdat de datum en tijd van uw computer niet goed staat. Herbouw de blokdatabase pas nadat u de datum en tijd van uw computer correct heeft ingesteld.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">De blokindex db bevat een legacy 'txindex'. Om de bezette schijfruimte vrij te maken, voert u een volledige -reindex uit, anders negeert u deze fout. Deze foutmelding wordt niet meer weergegeven.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Het transactiebedrag is te klein om te versturen nadat de transactievergoeding in mindering is gebracht</translation>
</message>
@@ -4016,6 +4062,10 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">Onbekend walletbestandsformaat "%s" opgegeven. Kies aub voor "bdb" of "sqlite".</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Niet-ondersteund categoriespecifiek logboekniveau %1$s=%2$s. Verwacht %1$s=&lt;category&gt;:&lt;loglevel&gt;. Geldige categorieën: %3$s. Geldige logniveaus: %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Niet ondersteund chainstate databaseformaat gevonden. Herstart aub met -reindex-chainstate. Dit zal de chainstate database opnieuw opbouwen.</translation>
</message>
@@ -4024,6 +4074,10 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">Wallet succesvol aangemaakt. Het oude wallettype wordt uitgefaseerd en ondersteuning voor het maken en openen van verouderde wallets zal in de toekomst komen te vervallen.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Wallet succesvol aangemaakt. Het oude wallettype wordt uitgefaseerd en ondersteuning voor het maken en openen van verouderde wallets zal in de toekomst komen te vervallen. Oude wallettypes kan gemigreerd worden naar een descriptor wallet met migratewallet.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Waarschuwing: Dumpbestand walletformaat "%s" komt niet overeen met het op de command line gespecificeerde formaat "%s".</translation>
</message>
@@ -4072,30 +4126,10 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">Mag niet schrijven naar gegevensmap '%s'; controleer bestandsrechten.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">De -txindex upgrade die door een eerdere versie is gestart, kan niet worden voltooid. Herstart opnieuw met de vorige versie of voer een volledige -reindex uit.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s kon de momentopnamestatus -assumeutxo niet valideren. Dit duidt op een hardwareprobleem, een fout in de software of een slechte softwarewijziging waardoor een ongeldige momentopname kon worden geladen. Als gevolg hiervan wordt het node afgesloten en stopt het met het gebruik van elke status die op de momentopname is gebouwd, waardoor de ketenhoogte wordt gereset van %d naar %d. Bij de volgende herstart hervat het node de synchronisatie vanaf %d zonder momentopnamegegevens te gebruiken. Rapporteer dit incident aan %s, inclusief hoe u aan de momentopname bent gekomen. De kettingstatus van de ongeldige momentopname is op schijf achtergelaten voor het geval dit nuttig is bij het diagnosticeren van het probleem dat deze fout heeft veroorzaakt.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s is erg hoog ingesteld! Dergelijke hoge vergoedingen kunnen worden betaald voor een enkele transactie.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate optie is niet compatibel met -blockfilterindex. Schakel -blockfilterindex tijdelijk uit aub en gebruik -reindex-chainstate, of vervang -reindex-chainstate met -reindex om alle indices volledig opnieuw op te bouwen.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate optie is niet compatibel met -coinstatsindex. Schakel -coinstatsindex tijdelijk uit aub en gebruik -reindex-chainstate, of vervang -reindex-chainstate met -reindex om alle indices volledig opnieuw op te bouwen.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate optie is niet compatibel met -txindex. Schakel -txindex tijdelijk uit aub en gebruik -reindex-chainstate, of vervang -reindex-chainstate met -reindex om alle indices volledig opnieuw op te bouwen.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Kan geen specifieke verbindingen verstrekken en addrman tegelijkertijd uitgaande verbindingen laten vinden.</translation>
</message>
@@ -4104,6 +4138,10 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">Fout bij laden %s: Externe signer wallet wordt geladen zonder gecompileerde ondersteuning voor externe signers</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Fout bij het lezen van %s! Alle sleutels zijn in goede orde uitgelezen, maar transactiedata of adresboek metagegevens zouden kunnen ontbreken of fouten bevatten.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Fout: adresboekgegevens in portemonnee kunnen niet worden geïdentificeerd als behorend tot gemigreerde portemonnees</translation>
</message>
@@ -4116,6 +4154,10 @@ Ga naar Bestand &gt; Wallet openen om een wallet te laden.
<translation type="unfinished">Fout: Transactie %s in portemonnee kan niet worden geïdentificeerd als behorend bij gemigreerde portemonnees</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Berekenen van bump fees mislukt, omdat onbevestigde UTXO's afhankelijk zijn van een enorm cluster onbevestigde transacties.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Kan de naam van het ongeldige peers.dat bestand niet hernoemen. Verplaats of verwijder het en probeer het opnieuw.</translation>
</message>
@@ -4288,14 +4330,6 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Fout: Kan de bestemming niet extraheren uit de gegenereerde scriptpubkey</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Fout: kon alleen-bekijkbaar transactie niet toevoegen aan alleen-bekijkbaar portemonnee</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Fout: Kan alleen-bekijkbare transacties niet verwijderen</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">Fout: Kan geen cursor in de database maken</translation>
</message>
@@ -4332,10 +4366,6 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Fout: Geen %s adressen beschikbaar</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Fout: niet alle alleen-bekijkbare transacties konden worden verwijderd</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Fout: deze portemonnee gebruikt al SQLite</translation>
</message>
@@ -4360,6 +4390,10 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Fout: Kan niet alle records in de database lezen</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Fout: Onleesbare beste block locatie aanduiding in wallet</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Fout: kan alleen-bekijkbaar adresboekgegevens niet verwijderen</translation>
</message>
@@ -4368,6 +4402,14 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Fout: Kan record niet naar nieuwe wallet schrijven</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Fout: Kan beste block locatie aanduiding niet opslaan in wallet</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Fout: Kan beste block locatie aanduiding niet opslaan in alleen lezen wallet</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Mislukt om op welke poort dan ook te luisteren. Gebruik -listen=0 as u dit wilt.</translation>
</message>
@@ -4376,6 +4418,10 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Herscannen van de wallet tijdens initialisatie mislukt</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Kan de indexen niet starten, wordt afgesloten..</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Mislukt om de databank te controleren</translation>
</message>
@@ -4612,10 +4658,6 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Transactie change output is buiten bereik</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transactie heeft een te lange mempoolketen</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transactie moet ten minste één ontvanger hebben</translation>
</message>
@@ -4692,14 +4734,26 @@ Kan mislukte migratie niet opschonen</translation>
<translation type="unfinished">Onbekende nieuwe regels geactiveerd (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Niet ondersteund globaal logboekregistratieniveau -loglevel=%s. Geldige waarden: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Niet-ondersteund globaal logniveau %s=%s. Geldige waarden: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Walletbestand maken mislukt: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates worden niet ondersteund in de %s keten.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Niet-ondersteunde logcategorie %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Fout: Kon alleen lezen tx %s niet toevoegen aan alleen lezen wallet</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">User Agentcommentaar (%s) bevat onveilige karakters.</translation>
</message>
@@ -4717,11 +4771,11 @@ Kan mislukte migratie niet opschonen</translation>
</message>
<message>
<source>Settings file could not be read</source>
- <translation type="unfinished">Instellingen bestand kon niet worden gelezen</translation>
+ <translation type="unfinished">Instellingen bestand kan niet gelezen worden</translation>
</message>
<message>
<source>Settings file could not be written</source>
- <translation type="unfinished">Instellingen bestand kon niet worden geschreven</translation>
+ <translation type="unfinished">Instelling bestand kan niet opgeschreven worden</translation>
</message>
</context>
</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_no.ts b/src/qt/locale/bitcoin_no.ts
index bfd524d525..de2afe47b9 100644
--- a/src/qt/locale/bitcoin_no.ts
+++ b/src/qt/locale/bitcoin_no.ts
@@ -55,14 +55,6 @@
<translation type="unfinished">Velg adressen du vil motta mynter med </translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Sender adresser </translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Mottar adresser </translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Dette er dine Bitcoin adresser for å sende betalinger.Alltid sjekk mengden og mottaker adressen før du sender mynter. </translation>
</message>
diff --git a/src/qt/locale/bitcoin_pa.ts b/src/qt/locale/bitcoin_pa.ts
index 299b6f5915..5ca8207abd 100644
--- a/src/qt/locale/bitcoin_pa.ts
+++ b/src/qt/locale/bitcoin_pa.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">ਚੁਣੋ </translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">ਪ੍ਰਾਪਤ ਕਰਨ ਵਾਲੇ ਪਤੇ </translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">ਆਉਣ ਵਾਲੇ ਪਤੇ </translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">ਇਹ ਭੁਗਤਾਨ ਭੇਜਣ ਲਈ ਤੁਹਾਡੇ ਬਿਟਕੋਇਨ ਪਤੇ ਹਨ। ਸਿੱਕੇ ਭੇਜਣ ਤੋਂ ਪਹਿਲਾਂ ਹਮੇਸ਼ਾਂ ਰਕਮ ਅਤੇ ਪ੍ਰਾਪਤ ਕਰਨ ਵਾਲੇ ਪਤੇ ਦੀ ਜਾਂਚ ਕਰੋ।</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pam.ts b/src/qt/locale/bitcoin_pam.ts
index 72391391bd..e5675cda24 100644
--- a/src/qt/locale/bitcoin_pam.ts
+++ b/src/qt/locale/bitcoin_pam.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">I-right click ban alilan ing address o libel</translation>
+ <translation type="unfinished">I-right click ban alilan ing address o label</translation>
</message>
<message>
<source>Create a new address</source>
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Kopyan me ing salukuyan at makipiling address keng system clipboard</translation>
+ <translation type="unfinished">Kopyan me ing makalage address king system clipboard</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -27,11 +27,19 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Ilako ya ing kasalungsungan makapiling address keng listahan</translation>
+ <translation type="unfinished">Ilako me ing kasalungsungang makalage address king listaan</translation>
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">Magpalub kang address o label para pantunan</translation>
+ <translation type="unfinished">Mangana kang address o label ban panintunan</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Export me ing data king tab a ini anting metung a file</translation>
+ </message>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">I&amp;Export</translation>
</message>
<message>
<source>&amp;Delete</source>
@@ -39,27 +47,19 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Pilinan ing address a magpadalang coins kang</translation>
+ <translation type="unfinished">Mamili kang address a mamarlang coins</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">Pilinan ing address a tumanggap coins a atin</translation>
+ <translation type="unfinished">Mamili kang address a tumanggap coins</translation>
</message>
<message>
<source>C&amp;hoose</source>
<translation type="unfinished">P&amp;ilinan</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Address king pamag-Send</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Address king pamag-Tanggap</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Reni reng kekang Bitcoin address king pamagpadalang kabayaran. Lawan mulang masalese reng alaga ampo ing address na ning tumanggap bayu ka magpadalang barya.</translation>
+ <translation type="unfinished">Oreni ring Bitcoin address mu king pamamarla karing bayad. Lawan mong masalese ring ulaga ra ampon ing address na ning mananggapan bayad bayu ka mamarla.</translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -542,6 +542,13 @@
</message>
</context>
<context>
+ <name>PSBTOperationsDialog</name>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">sariling address</translation>
+ </message>
+ </context>
+<context>
<name>PeerTableModel</name>
<message>
<source>Type</source>
@@ -969,10 +976,6 @@
<translation type="unfinished">Mipadala kang</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Kabayaran keka</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Me-mina</translation>
</message>
@@ -1032,10 +1035,6 @@
<translation type="unfinished">Mipadala kang</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Keng sarili mu</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Me-mina</translation>
</message>
@@ -1083,6 +1082,17 @@
</message>
</context>
<context>
+ <name>WalletView</name>
+ <message>
+ <source>&amp;Export</source>
+ <translation type="unfinished">I&amp;Export</translation>
+ </message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Export me ing data king tab a ini anting metung a file</translation>
+ </message>
+ </context>
+<context>
<name>bitcoin-core</name>
<message>
<source>Corrupted block database detected</source>
diff --git a/src/qt/locale/bitcoin_pl.ts b/src/qt/locale/bitcoin_pl.ts
index b10d068403..f1aab64ad2 100644
--- a/src/qt/locale/bitcoin_pl.ts
+++ b/src/qt/locale/bitcoin_pl.ts
@@ -46,60 +46,22 @@
<translation type="unfinished">&amp;Usuń</translation>
</message>
<message>
- <source>Choose the address to send coins to</source>
- <translation type="unfinished">Wybierz adres, na który chcesz wysyłać monety</translation>
- </message>
- <message>
- <source>Choose the address to receive coins with</source>
- <translation type="unfinished">Wybierz adres, na który chcesz otrzymywać monety</translation>
- </message>
- <message>
<source>C&amp;hoose</source>
<translation type="unfinished">Wybierz</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">&amp;Adresy wysyłania8f0451c0-ec7d-4357-a370-eff72fb0685f</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Odbierające adresy</translation>
- </message>
- <message>
- <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Tutaj znajdują się adresy Bitcoin na które wysyłasz płatności. Zawsze sprawdzaj ilość i adres odbiorcy przed wysyłką monet. </translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">To są twoje adresy Bitcoin do otrzymywania płatności. Użyj przycisku 'Utwórz nowy adres odbioru' na karcie odbioru, aby utworzyć nowe adresy.
Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
</message>
<message>
- <source>&amp;Copy Address</source>
- <translation type="unfinished">Kopiuj adres</translation>
- </message>
- <message>
- <source>Copy &amp;Label</source>
- <translation type="unfinished">Kopiuj etykietę</translation>
- </message>
- <message>
- <source>&amp;Edit</source>
- <translation type="unfinished">&amp;Edytuj</translation>
- </message>
- <message>
- <source>Export Address List</source>
- <translation type="unfinished">Eksportuj listę adresów </translation>
- </message>
- <message>
- <source>Comma separated file</source>
- <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Plik *.CSV rozdzielany pzrecinkami</translation>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Wysyłające adresy - %1</translation>
</message>
<message>
- <source>There was an error trying to save the address list to %1. Please try again.</source>
- <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
- <translation type="unfinished">Wystąpił błąd podczas próby zapisu listy adresów do %1. Proszę spróbować ponownie.</translation>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Odbierające adresy - %1</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -148,14 +110,6 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Zaszyfruj portfel </translation>
</message>
<message>
- <source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">Ta operacja wymaga hasła do portfela aby odblokować portfel. </translation>
- </message>
- <message>
- <source>Unlock wallet</source>
- <translation type="unfinished">Odblokuj portfel</translation>
- </message>
- <message>
<source>Change passphrase</source>
<translation type="unfinished">Zmień hasło </translation>
</message>
@@ -165,7 +119,7 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
</message>
<message>
<source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">Ostrzeżenie: Jeśli zaszyfrujesz swój portfel i zgubisz hasło - &lt;b&gt;STRACISZ WSZYSTKIE SWOJE BITCONY&lt;/b&gt;!</translation>
+ <translation type="unfinished">hasłoOstrzeżenie: Jeśli zaszyfrujesz swój portfel i zgubisz hasło - &lt;b&gt;STRACISZ WSZYSTKIE SWOJE BITCONY&lt;/b&gt;!</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
@@ -232,6 +186,14 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Hasło do portfela zostało pomyślnie zmienione.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Zmiana hasła nie powiodła się</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">Stare hasło wprowadzone do odszyfrowania portfela jest niepoprawne. Zawiera znak null (tj. zerowy bajt). Jeśli hasło zostało ustawione za pomocą wersji tego oprogramowania wcześniejszej niż 25.0, spróbuj ponownie używając tylko znaków do — ale nie włącznie — pierwszego znaku null.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Uwaga: klawisz Caps Lock jest włączony!</translation>
</message>
@@ -696,6 +658,14 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Zamknij wszystkie portfele</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Przenieś Portfel</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Przenieś portfel</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Pokaż pomoc %1 aby zobaczyć listę wszystkich opcji lnii poleceń.</translation>
</message>
@@ -789,6 +759,14 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Synchronizuję nagłówki (%1%)…</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Błąd podczas tworzenia portfela</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Nie można stworzyć nowego protfela, program skompilowano bez wsparcia sqlite (wymaganego dla deskryptorów potfeli)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Błąd: %1</translation>
</message>
@@ -895,10 +873,6 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Opłata:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Pył:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Po opłacie:</translation>
</message>
@@ -987,10 +961,6 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Skopiuj ilość bajtów</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiuj pył</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Skopiuj resztę</translation>
</message>
@@ -999,18 +969,6 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">(%1 zablokowane)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">tak</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">nie</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ta etykieta staje się czerwona jeżeli którykolwiek odbiorca otrzymuje kwotę mniejszą niż obecny próg pyłu.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Waha się +/- %1 satoshi na wejście.</translation>
</message>
@@ -1070,6 +1028,49 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Przenieś portfel</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Na pewno chcesz przenieść portfel &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Migracja portfela przekonwertuje ten portfel na jeden lub więcej portfeli opisowych. Należy utworzyć nową kopię zapasową portfela.
+Jeśli ten portfel zawiera jakiekolwiek skrypty tylko do odczytu, zostanie utworzony nowy portfel, który zawiera te skrypty tylko do odczytu.
+Jeśli ten portfel zawiera jakiekolwiek skrypty rozwiązywalne, ale nie obserwowane, zostanie utworzony inny i nowy portfel, który zawiera te skrypty.
+
+Proces migracji utworzy kopię zapasową portfela przed migracją. Plik kopii zapasowej będzie nosił nazwę &lt;nazwa portfela&gt;-&lt;znacznik czasu&gt;.legacy.bak i można go znaleźć w katalogu tego portfela. W przypadku nieprawidłowej migracji kopię zapasową można przywrócić za pomocą funkcji "Przywróć portfel".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Przenieś Portfel</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Przenoszenie portfela &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Portfel '%1' został poprawnie przeniesiony.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Przeniesienie nie powiodło się</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Przeniesienie powiodło się</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1152,6 +1153,10 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Stwórz potrfel</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Jesteś jeden krok od stworzenia swojego nowego portfela!</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Nazwa portfela</translation>
</message>
@@ -1188,14 +1193,6 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Stwórz czysty portfel</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Użyj deskryptorów do zarządzania scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Portfel deskryptora</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Użyj zewnętrznego urządzenia podpisującego, takiego jak portfel sprzętowy. Najpierw skonfiguruj zewnętrzny skrypt podpisujący w preferencjach portfela.</translation>
</message>
@@ -1208,10 +1205,6 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Stwórz</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Skompilowano bez wsparcia sqlite (wymaganego dla deskryptorów potfeli)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Skompilowany bez obsługi podpisywania zewnętrznego (wymagany do podpisywania zewnętrzengo)</translation>
@@ -1322,6 +1315,10 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
</translation>
</message>
<message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">Wybierz folder danych</translation>
+ </message>
+ <message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">Co najmniej %1 GB danych, zostanie zapisane w tym katalogu, dane te będą przyrastały w czasie.</translation>
</message>
@@ -1531,6 +1528,10 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Liczba wątków &amp;weryfikacji skryptu</translation>
</message>
<message>
+ <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
+ <translation type="unfinished">Pełna ścieżka do skryptu zgodnego z %1 (np. C:\Downloads\hwi.exe lub /Users/you/Downloads/hwi.py). Uwaga: złośliwe oprogramowanie może ukraść Twoje monety!</translation>
+ </message>
+ <message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
<translation type="unfinished">Adres IP serwera proxy (np. IPv4: 127.0.0.1 / IPv6: ::1)</translation>
</message>
@@ -1755,14 +1756,6 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">Użyj oddzielnego proxy SOCKS&amp;5 aby osiągnąć węzły w ukrytych usługach Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Czcionka o stałej szerokości w zakładce Przegląd:</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">najbliższy pasujący "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Anuluj</translation>
</message>
@@ -1996,10 +1989,14 @@ Podpisywanie jest możliwe tylko z adresami typu 'legacy'.</translation>
<translation type="unfinished">PSBT zapisane na dysk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
+ <source>Sends %1 to %2</source>
<translation type="unfinished">Wysyłanie %1 do %2</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">własny adres</translation>
+ </message>
+ <message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
<translation type="unfinished">Nie można obliczyć opłaty za transakcję lub łącznej kwoty transakcji.</translation>
</message>
@@ -2264,6 +2261,10 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP
<translation type="unfinished">Wybierz węzeł żeby zobaczyć szczegóły.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Wersja warstwy transportowej: %1</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Wersja</translation>
</message>
@@ -2489,6 +2490,21 @@ Jeśli pojawia się ten błąd, poproś sprzedawcę o podanie URI zgodnego z BIP
<translation type="unfinished">Pobieranie adresu wychodzącego: krótkotrwałe, do pozyskiwania adresów</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">Wykrywanie: węzeł może używać v1 lub v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: nieszyfrowany, tekstowy protokół transportowy</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: Szyfrowany protokół transportowy BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">wybraliśmy peera dla przekaźnika o dużej przepustowości</translation>
</message>
@@ -2881,10 +2897,6 @@ Korzystanie z opłaty domyślnej może skutkować wysłaniem transakcji, która
<translation type="unfinished">Wejścia…</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Pył:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Wybierz...</translation>
</message>
@@ -2961,10 +2973,6 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za
<translation type="unfinished">Skopiuj ilość bajtów</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiuj pył</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Skopiuj resztę</translation>
</message>
@@ -2995,10 +3003,6 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za
<translation type="unfinished">Tworzy częściowo podpisaną transakcję (ang. PSBT) używaną np. offline z portfelem %1 lub z innym portfelem zgodnym z PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">z portfela '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 do '%2'8f0451c0-ec7d-4357-a370-eff72fb0685f</translation>
</message>
@@ -3056,6 +3060,10 @@ Uwaga: Ponieważ opłata jest naliczana za każdy bajt, opłata "100 satoshi za
<translation type="unfinished">Proszę przejrzeć propozycję transakcji. Zostanie utworzona częściowo podpisana transakcja (ang. PSBT), którą można skopiować, a następnie podpisać np. offline z portfelem %1 lub z innym portfelem zgodnym z PSBT.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 z portfela '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Czy chcesz utworzyć tę transakcję?</translation>
@@ -3515,8 +3523,8 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw
<translation type="unfinished">Indeks wyjściowy</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certyfikat nie został zweryfikowany)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Certyfikat nie został zweryfikowany)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3617,10 +3625,6 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw
<translation type="unfinished">Wysłane do</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Płatność do siebie</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Wydobyto</translation>
</message>
@@ -3696,10 +3700,6 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw
<translation type="unfinished">Wysłane do</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Do siebie</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Wydobyto</translation>
</message>
@@ -3733,7 +3733,7 @@ Zwróć uwagę, że poprawnie zweryfikowana wiadomość potwierdza to, że nadaw
</message>
<message>
<source>Copy transaction &amp;ID</source>
- <translation type="unfinished">Skopiuj &amp;ID transakcji</translation>
+ <translation type="unfinished">transakcjaSkopiuj &amp;ID transakcji</translation>
</message>
<message>
<source>Copy &amp;raw transaction</source>
@@ -3992,10 +3992,6 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Rozprowadzane na licencji MIT, zobacz dołączony plik %s lub %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Błąd odczytu %s! Wszystkie klucze zostały odczytane poprawnie, ale może brakować danych transakcji lub wpisów w książce adresowej, lub mogą one być nieprawidłowe.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Błąd odczytu 1%s! Może brakować danych transakcji lub mogą być one nieprawidłowe. Ponowne skanowanie portfela.</translation>
</message>
@@ -4064,10 +4060,6 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Baza bloków zawiera blok, który wydaje się pochodzić z przyszłości. Może to wynikać z nieprawidłowego ustawienia daty i godziny Twojego komputera. Bazę danych bloków dobuduj tylko, jeśli masz pewność, że data i godzina twojego komputera są poprawne</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">Baza danych indeksu bloku zawiera odziedziczony „txindex”. Aby wyczyścić zajęte miejsce na dysku, uruchom pełną indeksację, w przeciwnym razie zignoruj ten błąd. Ten komunikat o błędzie nie zostanie ponownie wyświetlony.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Zbyt niska kwota transakcji do wysłania po odjęciu opłaty</translation>
</message>
@@ -4140,18 +4132,6 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Nie mogę zapisać do katalogu danych '%s'; sprawdź uprawnienia.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Opcja -reindex-chainstate nie jest kompatybilna z -blockfilterindex. Proszę tymczasowo wyłączyć opcję blockfilterindex podczas używania -reindex-chainstate lub zastąpić -reindex-chainstate opcją -reindex, aby w pełni przebudować wszystkie indeksy.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Opcja -reindex-chainstate nie jest kompatybilna z -coinstatsindex. Proszę tymczasowo wyłączyć opcję coinstatsindex podczas używania -reindex-chainstate lub zastąpić -reindex-chainstate opcją -reindex, aby w pełni przebudować wszystkie indeksy.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Opcja -reindex-chainstate nie jest kompatybilna z -txindex. Proszę tymczasowo wyłączyć opcję txindex podczas używania -reindex-chainstate lub zastąpić -reindex-chainstate opcją -reindex, aby w pełni przebudować wszystkie indeksy.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Nie można jednocześnie określić konkretnych połączeń oraz pozwolić procesowi addrman na wyszukiwanie wychodzących połączeń.</translation>
</message>
@@ -4485,10 +4465,6 @@ Przejdź do Plik &gt; Otwórz Portfel aby wgrać portfel.
<translation type="unfinished">Indeks wyjścia reszty z transakcji poza zakresem</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakcja posiada zbyt długi łańcuch pamięci</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcja wymaga co najmniej jednego odbiorcy</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pt.ts b/src/qt/locale/bitcoin_pt.ts
index 2c8c574ad1..7de05fc230 100644
--- a/src/qt/locale/bitcoin_pt.ts
+++ b/src/qt/locale/bitcoin_pt.ts
@@ -39,7 +39,7 @@
</message>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;Exportar</translation>
+ <translation type="unfinished">e exportar</translation>
</message>
<message>
<source>&amp;Delete</source>
@@ -58,14 +58,6 @@
<translation type="unfinished">Escol&amp;her</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Endereços de envio</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Endereços de receção</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Estes são os seus endereços Bitcoin para enviar pagamentos. Verifique sempre o valor e o endereço de receção antes de enviar moedas.</translation>
</message>
@@ -102,6 +94,14 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">Ocorreu um erro ao tentar guardar a lista de endereços para %1. Por favor, tente novamente.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Enviando endereços - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Recebendo endereços - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Exportação Falhou</translation>
</message>
@@ -303,6 +303,18 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">desconhecido</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Embutido "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fonte padrão do sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizado...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Quantia</translation>
</message>
@@ -692,6 +704,14 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">Fechar todas carteiras.</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar carteira</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrar uma carteira</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Mostrar a mensagem de ajuda %1 para obter uma lista com possíveis opções a usar na linha de comandos.</translation>
</message>
@@ -788,6 +808,14 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">A pré-sincronizar cabeçalhos (%1%)…</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Erro ao criar a carteira</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Não foi possível criar uma nova carteira, o programa foi compilado sem suporte a sqlite (necessário para carteiras com descritores)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Erro: %1</translation>
</message>
@@ -890,10 +918,6 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">Taxa:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Lixo:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Depois da taxa:</translation>
</message>
@@ -982,10 +1006,6 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar pó</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar troco</translation>
</message>
@@ -994,18 +1014,6 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">(%1 bloqueado)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">sim</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">não</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Esta etiqueta fica vermelha se qualquer destinatário recebe um valor menor que o limite de dinheiro.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Pode variar +/- %1 satoshi(s) por input.</translation>
</message>
@@ -1065,6 +1073,53 @@ Assinar só é possível com endereços do tipo "legado".</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrar carteira</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Tem certeza que deseja migrar a carteira &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">A migração irá converter esta carteira em uma ou mais carteiras com descritores. Será necessário realizar um novo backup da carteira.
+Se esta carteira contiver scripts watchonly, uma carteira nova será criada contendo estes scripts watchonly.
+Se esta carteira contiver algum script solucionável, mas não monitorado, uma carteira nova e diferente será criada contendo esses scripts.
+
+O processo de migração criará um backup da carteira antes da migração. Este arquivo de backup será nomeado &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak e pode ser encontrado no diretório desta carteira. No caso de uma migração incorreta, o backup pode ser restaurado com a funcionalidade “Restaurar Carteira”.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar carteira</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrando Carteira &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">A carteira '%1' foi migrada com sucesso.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Os guiões solucionáveis mas não observados foram migrados para uma nova pasta chamada '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Falha na migração</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Êxito na migração</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1147,6 +1202,14 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">Criar Carteira</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Você está a um passo de criar a sua nova carteira!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Forneça um nome e, se desejar, ative quaisquer opções avançadas</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Nome da Carteira</translation>
</message>
@@ -1183,14 +1246,6 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">Fazer Carteira em Branco</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Use descritores para o gerenciamento de chaves públicas de script</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Carteira de descritor</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Utilize um dispositivo de assinatura externo tal com uma carteira de hardware. Configure primeiro o script de assinatura nas preferências da carteira.</translation>
</message>
@@ -1203,10 +1258,6 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">Criar</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilado sem suporte para sqlite (requerido para carteiras de descritor)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Compilado sem suporte de assinatura externa. (necessário para assinatura externa)</translation>
@@ -1534,6 +1585,10 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">Minimize em vez de sair da aplicação quando a janela é fechada. Quando esta opção é ativada, a aplicação apenas será encerrada quando escolher Sair no menu.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fonte no painel de visualização:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Opções configuradas nessa caixa de diálogo serão sobrescritas pela linhas de comando: </translation>
</message>
@@ -1754,18 +1809,6 @@ Assinar só é possível com endereços do tipo "legado".</translation>
<translation type="unfinished">Use um proxy SOCKS5 separado para alcançar pares por meio dos serviços Tor onion:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fonte no painel de visualização:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">embutido "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">resultado mais aproximado "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Cancelar</translation>
</message>
@@ -2000,10 +2043,14 @@ ID transação: %1</translation>
<translation type="unfinished">PSBT salva no disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
+ <source>Sends %1 to %2</source>
<translation type="unfinished">Envia %1 para %2</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">endereço próprio</translation>
+ </message>
+ <message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
<translation type="unfinished">Incapaz de calcular a taxa de transação ou o valor total da transação.</translation>
</message>
@@ -2268,6 +2315,22 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">Selecione um par para ver informação detalhada.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versão da camada de transporte: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Transporte</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">A string do ID da sessão BIP324 em hexadecimal, se houver.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">ID de sessão</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Versão</translation>
</message>
@@ -2464,6 +2527,21 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">Entrando: iniciado por par</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">detectando: o par pode ser v1 ou v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocolo de transporte de texto simples não criptografado</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: protocolo de transporte criptografado BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">selecionámos o par para uma retransmissão de alta banda larga</translation>
</message>
@@ -2518,6 +2596,10 @@ Se está a receber este erro, deverá pedir ao comerciante para fornecer um URI
<translation type="unfinished">A executar o comando sem qualquer carteira</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Janela do nó - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">A executar o comando utilizando a carteira "%1"</translation>
</message>
@@ -2868,10 +2950,6 @@ Para mais informação acerca da utilização desta consola, escreva %6.
<translation type="unfinished">Entradas...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Lixo:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Escolher…</translation>
</message>
@@ -2948,10 +3026,6 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar pó</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiar troco</translation>
</message>
@@ -2982,10 +3056,6 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Cria uma transação de Bitcoin parcialmente assinada (PSBT)(sigla em inglês) para ser usada por exemplo com uma carteira %1 offline ou uma carteira de hardware compatível com PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">da carteira '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 a '%2'</translation>
</message>
@@ -3043,6 +3113,10 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Por favor, reveja sua proposta de transação. Isto irá produzir uma Transação de Bitcoin parcialmente assinada (PSBT, sigla em inglês) a qual você pode salvar ou copiar e então assinar com por exemplo uma carteira %1 offiline ou uma PSBT compatível com carteira de hardware.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 da pasta "%2</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Deseja criar esta transação?</translation>
@@ -3503,8 +3577,9 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Índex de saída</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished"> (O certificado não foi verificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">
+%1 (O certificado não foi verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3605,10 +3680,6 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Enviado para</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pagamento para si mesmo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minada</translation>
</message>
@@ -3684,10 +3755,6 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Enviado para</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Para si mesmo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minada</translation>
</message>
@@ -3922,7 +3989,7 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;Exportar</translation>
+ <translation type="unfinished">e exportar</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -3969,6 +4036,10 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
<translation type="unfinished">%s corrompido. Tente usar a ferramenta de carteira bitcoin-wallet para salvar ou restaurar um backup.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s falhou ao validar o estado da cópia -assumeutxo. Isso indica um problema de hardware, um bug no software ou uma modificação incorreta do software que permitiu o carregamento de uma cópia inválida. Como resultado disso, o nó será desligado e parará de usar qualquer estado criado na cópia, redefinindo a altura da corrente de %d para %d. Na próxima reinicialização, o nó retomará a sincronização de%d sem usar nenhum dado da cópia. Por favor, reporte este incidente para %s, incluindo como você obteve a cópia. A cópia inválida do estado de cadeia será deixada no disco caso sirva para diagnosticar o problema que causou esse erro.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">1%s solicitação para escutar na porta 2%u. Esta porta é considerada "ruim" e, portanto, é improvável que qualquer ponto se conecte-se a ela. Consulte doc/p2p-bad-ports.md para obter detalhes e uma lista completa.</translation>
</message>
@@ -3993,10 +4064,6 @@ Ir para o arquivo &gt; Abrir carteira para carregar a carteira
<translation type="unfinished">Erro ao carregar a carteira. A carteira requer que os blocos sejam baixados e o software atualmente não suporta o carregamento de carteiras enquanto os blocos estão sendo baixados fora de ordem ao usar instantâneos assumeutxo. A carteira deve ser carregada com êxito após a sincronização do nó atingir o patamar 1%s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Erro ao ler %s! Todas as chaves foram lidas corretamente, mas os dados de transação ou as entradas no livro de endereços podem não existir ou estarem incorretos.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Erro ao ler %s! Dados de transações podem estar incorretos ou faltando. Reescaneando a carteira.</translation>
</message>
@@ -4042,6 +4109,10 @@ deve ser fornecido.</translation>
<translation type="unfinished">Poda: a última sincronização da carteira vai além dos dados podados. Precisa de -reindex (descarregar novamente a cadeia de blocos completa em caso de nó podado)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Falha ao renomear '%s' -&gt; '%s'. Você deve resolver este problema manualmente movendo ou removendo o diretório de cópia inválido %s, caso contrário o mesmo erro ocorrerá novamente na próxima inicialização.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: Versão %d do esquema de carteira sqlite desconhecido. Apenas a versão %d é suportada</translation>
</message>
@@ -4050,10 +4121,6 @@ deve ser fornecido.</translation>
<translation type="unfinished">A base de dados de blocos contém um bloco que aparenta ser do futuro. Isto pode ser causado por uma data incorreta definida no seu computador. Reconstrua apenas a base de dados de blocos caso tenha a certeza de que a data e hora do seu computador estão corretos.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">O banco de dados de índices de bloco contém um 'txindex' antigo. Faça um -reindex completo para liberar espaço em disco, se desejar. Este erro não será exibido novamente.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">O montante da transação é demasiado baixo após a dedução da taxa</translation>
</message>
@@ -4086,6 +4153,10 @@ deve ser fornecido.</translation>
<translation type="unfinished">Não é possível reproduzir os blocos. Terá de reconstruir a base de dados utilizando -reindex-chainstate.</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Categoria especificada no nível de log não suportada %1$s=%2$s. Esperado %1$s=&lt;category&gt;:&lt;loglevel&gt;. Categorias validas: %3$s. Níveis de log válidos: %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Formato de banco de dados incompatível na chainstate. Por favor reinicie com a opção "-reindex-chainstate". Isto irá recriar o banco de dados da chainstate.</translation>
</message>
@@ -4094,6 +4165,10 @@ deve ser fornecido.</translation>
<translation type="unfinished">Carteira criada com sucesso. As carteiras antigas estão sendo descontinuadas e o suporte para a criação de abertura de carteiras antigas será removido no futuro.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Carteira carregada com sucesso. As carteiras legadas estão sendo descontinuadas e o suporte para a criação e abertura de carteiras legadas será removido no futuro. Carteiras legadas podem ser migradas para uma carteira com descritor com a ferramenta migratewallet. </translation>
+ </message>
+ <message>
<source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
<translation type="unfinished">Aviso: chaves privadas detetadas na carteira {%s} com chaves privadas desativadas</translation>
</message>
@@ -4138,22 +4213,6 @@ deve ser fornecido.</translation>
<translation type="unfinished">Não foi possível escrever na pasta de dados '%s': verifique as permissões.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">O processo de atualização do -txindex iniciado por uma versão anterior não foi concluído. Reinicie com a versão antiga ou faça um -reindex completo.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">a opção "-reindex-chainstate" não é compatível com "-blockfilterindex". Por favor, desabilite temporariamente a opção "blockfilterindex" enquanto utilizar a opção "-reindex-chainstate", ou troque "-reindex-chainstate" por "-reindex" para recriar completamente todos os índices. </translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">a opção "-reindex-chainstate" não é compatível com a opção "-coinstatsindex". Por favor desative temporariamente a opção "coinstatsindex" enquanto estiver utilizando "-reindex-chainstate", ou troque "-reindex-chainstate" por "-reindex" para recriar completamente todos os índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">a opção "-reindex-chainstate" não é compatível com a opção "-coinstatsindex". Por favor desative temporariamente a opção "coinstatsindex" enquanto estiver utilizando "-reindex-chainstate", ou troque "-reindex-chainstate" por "-reindex" para recriar completamente todos os índices.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Não é possível fornecer conexões específicas e ter addrman procurando conexões ao mesmo tempo.</translation>
</message>
@@ -4162,6 +4221,10 @@ deve ser fornecido.</translation>
<translation type="unfinished">Erro ao abrir %s: Carteira com assinador externo. Não foi compilado suporte para assinadores externos</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Erro ao ler arquivo %s! Todas as chaves foram lidas corretamente, mas os dados de transação ou os metadados de endereço podem estar incorretos ou faltando.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Erro: Os dados do livro de endereços da carteira não puderam ser identificados por pertencerem a carteiras migradas</translation>
</message>
@@ -4174,6 +4237,10 @@ deve ser fornecido.</translation>
<translation type="unfinished">Erro: A transação %s na carteira não pôde ser identificada por pertencer a carteiras migradas</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Falha ao calcular as taxas de colisão porque os UTXOs não confirmados dependem de um enorme conjunto de transações não confirmadas.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Impossível renomear o arquivo peers.dat (inválido). Por favor mova-o ou delete-o e tente novamente.</translation>
</message>
@@ -4202,10 +4269,6 @@ Por favor tente atualizar o software para a última versão.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Categoria especificada no nível de log não suportada "-loglevel=%s". Esperado "-loglevel=&lt;category&gt;:&lt;loglevel&gt;. Categorias validas: %s. Níveis de log válidos: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4254,6 +4317,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Arquivo de despejo %s não existe</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erro durante commiting db txn para a remoção das transações da carteira.</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Erro a criar %s</translation>
</message>
@@ -4298,12 +4365,8 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Erro ao ler o registo seguinte da base de dados da carteira</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Erro: impossível adicionar tx apenas-visualização para carteira apenas-visualização</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Erro: Impossível excluir transações apenas-visualização </translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erro durante o início db txn para a remoção das transações da carteira.</translation>
</message>
<message>
<source>Error: Disk space is low for %s</source>
@@ -4334,10 +4397,6 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Erro: Não existem %s endereços disponíveis.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Erro: Nem todos os txs apenas-visualização foram excluídos</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Erro: Essa carteira já utiliza o SQLite</translation>
</message>
@@ -4362,6 +4421,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Error: Não é possivel ler todos os registros no banco de dados</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Erro: Não foi possível ler o melhor registo de localização de bloqueio da pasta</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Erro: Impossível remover dados somente-visualização do Livro de Endereços </translation>
</message>
@@ -4370,6 +4433,22 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Erro: Não foi possível escrever registro para a nova carteira</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Erro: Não foi possível escrever o registo do melhor localizador de bloqueio da pasta solvível</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Erro: Não é possível escrever o registo do melhor localizador de blocos da pasta watchonly</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Erro: falha na cópia da agenda de endereços para a carteira %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Erro: a transação do banco de dados não pode ser executada para a carteira %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Falhou a escutar em qualquer porta. Use -listen=0 se quiser isto.</translation>
</message>
@@ -4378,10 +4457,18 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Reexaminação da carteira falhou durante a inicialização</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Falha ao iniciar índices, desligando..</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Falha ao verificar base de dados</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Falha ao remover a transação: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">A variação da taxa (%s) é menor que a mínima variação de taxa (%s) configurada.</translation>
</message>
@@ -4572,6 +4659,10 @@ A pasta de blocos especificados "%s" não existe.</translation>
<translation type="unfinished">Esta é a taxa de transação que irá pagar se enviar uma transação.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">A transação %s não pertence a esta carteira.</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Quantia da transação é muito baixa</translation>
</message>
@@ -4584,10 +4675,6 @@ A pasta de blocos especificados "%s" não existe.</translation>
<translation type="unfinished">Endereço de troco da transação fora da faixa</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">A transação é muito grande de uma cadeia do banco de memória</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">A transação dever pelo menos um destinatário</translation>
</message>
@@ -4664,14 +4751,30 @@ A pasta de blocos especificados "%s" não existe.</translation>
<translation type="unfinished">Ativadas novas regras desconhecidas (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Nível de log global inválido "-loglevel=%s". Valores válidos: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Nível de registo global não suportado %s=%s. Valores válidos: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">falha na criação do ficheiro da pasta: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates não é suportado na cadeia %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Categoria de registos desconhecida %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Erro: Não foi possível adicionar tx %s de vigilância à pasta de vigilância</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Erro: Impossível excluir transações apenas-visualização.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Comentário no User Agent (%s) contém caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_pt@qtfiletype.ts b/src/qt/locale/bitcoin_pt@qtfiletype.ts
deleted file mode 100644
index d45049760e..0000000000
--- a/src/qt/locale/bitcoin_pt@qtfiletype.ts
+++ /dev/null
@@ -1,250 +0,0 @@
-<TS version="2.1" language="pt@qtfiletype">
-<context>
- <name>QObject</name>
- <message numerus="yes">
- <source>%n second(s)</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- <message numerus="yes">
- <source>%n minute(s)</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- </context>
-<context>
- <name>BitcoinGUI</name>
- <message numerus="yes">
- <source>Processed %n block(s) of transaction history.</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network.</source>
- <extracomment>A substring of the tooltip.</extracomment>
- <translation type="unfinished">
- <numerusform>%n conexão ativa na rede Bitcoin.</numerusform>
- <numerusform>%n conexões ativas na rede Bitcoin.</numerusform>
- </translation>
- </message>
- </context>
-<context>
- <name>Intro</name>
- <message numerus="yes">
- <source>%n GB of space available</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- <message numerus="yes">
- <source>(of %n GB needed)</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- <message numerus="yes">
- <source>(%n GB needed for full chain)</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- <message numerus="yes">
- <source>(sufficient to restore backups %n day(s) old)</source>
- <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- </context>
-<context>
- <name>PeerTableModel</name>
- <message>
- <source>Age</source>
- <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">Tempo</translation>
- </message>
- </context>
-<context>
- <name>RPCConsole</name>
- <message>
- <source>Welcome to the %1 RPC console.
-Use up and down arrows to navigate history, and %2 to clear screen.
-Use %3 and %4 to increase or decrease the font size.
-Type %5 for an overview of available commands.
-For more information on using this console, type %6.
-
-%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
- <extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
- <translation type="unfinished">Bem vindo ao %1 console de RPC.
-Utilize as setas para cima e para baixo para navegar no histórico, e %2 para limpar a tela.
-Utilize %3 e %4 para aumentar ou diminuir a tamanho da fonte.
-Digite %5 para ver os comandos disponíveis.
-Para mais informações sobre a utilização desse console. digite %6.
-
-%7 AVISO: Scammers estão ativamente influenciando usuário a digitarem comandos aqui e roubando os conteúdos de suas carteiras; Não use este terminal sem pleno conhecimento dos efeitos de cada comando.%8</translation>
- </message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- </context>
-<context>
- <name>TransactionDesc</name>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation type="unfinished">
- <numerusform />
- <numerusform />
- </translation>
- </message>
- </context>
-<context>
- <name>bitcoin-core</name>
- <message>
- <source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">Erro: Não foi possível produzir descritores para esta carteira antiga. Certifique-se que a carteira foi desbloqueada antes</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s falhou ao validar o estado da cópia -assumeutxo. Isso indica um problema de hardware, um bug no software ou uma modificação incorreta do software que permitiu o carregamento de uma cópia inválida. Como resultado disso, o nó será desligado e parará de usar qualquer estado criado na cópia, redefinindo a altura da corrente de %d para %d. Na próxima reinicialização, o nó retomará a sincronização de%d sem usar nenhum dado da cópia. Por favor, reporte este incidente para %s, incluindo como você obteve a cópia. A cópia inválida do estado de cadeia foi deixado no disco caso sirva para diagnosticar o problema que causou esse erro.</translation>
- </message>
- <message>
- <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
- <translation type="unfinished">%s está muito alto! Essa quantia poderia ser paga em uma única transação.</translation>
- </message>
- <message>
- <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
- <translation type="unfinished">Falha na estimativa de taxa. Fallbackfee desativada. Espere alguns blocos ou ative %s.</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <translation type="unfinished">Montante inválido para %s=&lt;amount&gt;: '%s' (precisa ser pelo menos a taxa de minrelay de %s para prevenir que a transação nunca seja confirmada)</translation>
- </message>
- <message>
- <source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
- <translation type="unfinished">Conexões de saída limitadas a rede CJDNS (-onlynet=cjdns), mas -cjdnsreachable não foi configurado</translation>
- </message>
- <message>
- <source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
- <translation type="unfinished">Conexões de saída limitadas a rede i2p (-onlynet=i2p), mas -i2psam não foi configurado</translation>
- </message>
- <message>
- <source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">O tamanho das entradas excede o peso máximo. Por favor, tente enviar uma quantia menor ou consolidar manualmente os UTXOs da sua carteira</translation>
- </message>
- <message>
- <source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
- <translation type="unfinished">O montante total das moedas pré-selecionadas não cobre a meta da transação. Permita que outras entradas sejam selecionadas automaticamente ou inclua mais moedas manualmente</translation>
- </message>
- <message>
- <source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
- <translation type="unfinished">A transação requer um destino com montante diferente de 0, uma taxa diferente de 0 ou uma entrada pré-selecionada</translation>
- </message>
- <message>
- <source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
- <translation type="unfinished">Falha ao validar cópia do UTXO. Reinicie para retomar normalmente o download inicial de blocos ou tente carregar uma cópia diferente.</translation>
- </message>
- <message>
- <source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">UTXOs não confirmados estão disponíveis, mas gastá-los gera uma cadeia de transações que será rejeitada pela mempool</translation>
- </message>
- <message>
- <source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
-
-The wallet might have been tampered with or created with malicious intent.
-</source>
- <translation type="unfinished">Entrada antiga e inesperada foi encontrada na carteira do descritor. Carregando carteira %s
-
-A carteira pode ter sido adulterada ou criada com intenção maliciosa.
-</translation>
- </message>
- <message>
- <source>Block verification was interrupted</source>
- <translation type="unfinished">A verificação dos blocos foi interrompida</translation>
- </message>
- <message>
- <source>Error reading configuration file: %s</source>
- <translation type="unfinished">Erro ao ler o arquivo de configuração: %s</translation>
- </message>
- <message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Erro: não é possível extrair a destinação do scriptpubkey gerado</translation>
- </message>
- <message>
- <source>Insufficient dbcache for block verification</source>
- <translation type="unfinished">Dbcache insuficiente para verificação de bloco</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
- <translation type="unfinished">Valor inválido para %s=&lt;amount&gt;: '%s' (precisa ser no mínimo %s)</translation>
- </message>
- <message>
- <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
- <translation type="unfinished">Valor inválido para %s=&lt;amount&gt;: '%s'</translation>
- </message>
- <message>
- <source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">Porta inválida especificada em %s: '%s'</translation>
- </message>
- <message>
- <source>Invalid pre-selected input %s</source>
- <translation type="unfinished">Entrada pré-selecionada inválida %s</translation>
- </message>
- <message>
- <source>Not found pre-selected input %s</source>
- <translation type="unfinished">Entrada pré-selecionada não encontrada %s</translation>
- </message>
- <message>
- <source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">Não há solução para entrada pré-selecionada %s</translation>
- </message>
- <message>
- <source>Specified data directory "%s" does not exist.</source>
- <translation type="unfinished">O diretório de dados especificado "%s" não existe.</translation>
- </message>
- </context>
-</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_pt_BR.ts b/src/qt/locale/bitcoin_pt_BR.ts
index bea48adaca..33a9c23d75 100644
--- a/src/qt/locale/bitcoin_pt_BR.ts
+++ b/src/qt/locale/bitcoin_pt_BR.ts
@@ -7,7 +7,7 @@
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Criar um novo endereço</translation>
+ <translation type="unfinished">Criar um novo endereço.</translation>
</message>
<message>
<source>&amp;New</source>
@@ -43,7 +43,7 @@
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">E&amp;xcluir</translation>
+ <translation type="unfinished">&amp;Excluir</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
@@ -58,16 +58,8 @@
<translation type="unfinished">E&amp;scolher</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Endereços de envio</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Endereço de recebimento</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">Estes são seus endereços para enviar pagamentos. Sempre confira o valor e o endereço do destinatário antes de enviar moedas.</translation>
+ <translation type="unfinished">Estes são os seus endereços para enviar pagamentos. Sempre confira o valor e o endereço do destinatário antes de enviar bitcoins.</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
@@ -102,6 +94,14 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Erro ao salvar a lista de endereço para %1. Tente novamente.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Enviando endereços - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Recebendo endereços - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Falha na exportação</translation>
</message>
@@ -299,6 +299,18 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">desconhecido</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Embutido "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Fonte padrão do sistema "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Personalizado...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Quantia</translation>
</message>
@@ -664,6 +676,14 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Fechar todas as carteiras</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar carteira</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrar uma carteira</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Mostrar a mensagem de ajuda do %1 para obter uma lista com possíveis opções de linha de comando Bitcoin</translation>
</message>
@@ -755,6 +775,14 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Pré-Sincronizando cabeçalhos (%1%)...</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Erro ao criar a carteira</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Não foi possível criar uma nova carteira, o programa foi compilado sem suporte a sqlite (necessário para carteiras com descritores)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Erro: %1</translation>
</message>
@@ -857,10 +885,6 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Taxa:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Poeira:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Depois da taxa:</translation>
</message>
@@ -941,30 +965,14 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar poeira</translation>
- </message>
- <message>
<source>Copy change</source>
- <translation type="unfinished">Copiar alteração</translation>
+ <translation type="unfinished">Copiar troco</translation>
</message>
<message>
<source>(%1 locked)</source>
<translation type="unfinished">(%1 bloqueada)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">sim</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">não</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Este texto fica vermelho se qualquer destinatário receber uma quantidade menor que o limite atual para poeira.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Pode variar +/- %1 satoshi(s) por entrada</translation>
</message>
@@ -1024,6 +1032,53 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrar carteira</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Tem certeza que deseja migrar a carteira &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">A migração irá converter esta carteira em uma ou mais carteiras com descritores. Será necessário realizar um novo backup da carteira.
+Se esta carteira contiver scripts watchonly, uma carteira nova será criada contendo estes scripts watchonly.
+Se esta carteira contiver algum script solucionável, mas não monitorado, uma carteira nova e diferente será criada contendo esses scripts.
+
+O processo de migração criará um backup da carteira antes da migração. Este arquivo de backup será nomeado &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak e pode ser encontrado no diretório desta carteira. No caso de uma migração incorreta, o backup pode ser restaurado com a funcionalidade “Restaurar Carteira”.</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrar Carteira</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrando Carteira &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">A carteira '%1' foi migrada com sucesso.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Os guiões solucionáveis mas não observados foram migrados para uma nova pasta chamada '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Falha na migração</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Êxito na migração</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1106,6 +1161,14 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Criar Carteira</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Você está a um passo de criar a sua nova carteira!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Forneça um nome e, se desejar, ative quaisquer opções avançadas</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Nome da Carteira</translation>
</message>
@@ -1142,21 +1205,9 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Criar Carteira Vazia</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Utilize os descritores para gerenciamento do scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Carteira descritora.</translation>
- </message>
- <message>
<source>Create</source>
<translation type="unfinished">Criar</translation>
</message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilado sem suporte a sqlite (requerido para carteiras descritoras)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1480,6 +1531,10 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Minimizar em vez de fechar o programa quando a janela for fechada. Quando essa opção estiver ativa, o programa só será fechado somente pela opção Sair no menu Arquivo.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Fonte no painel de visualização:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Opções configuradas nessa caixa de diálogo serão sobrescritas pela linhas de comando: </translation>
</message>
@@ -1672,10 +1727,6 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Use um proxy SOCKS&amp;5 separado para alcançar os nós via serviços Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Fonte no painel de visualização:</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Cancelar</translation>
</message>
@@ -1895,8 +1946,12 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">PSBT salvo no disco.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Envia %1 para %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Envia %1 para %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">endereço próprio</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2149,6 +2204,22 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Selecione um nó para ver informações detalhadas.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Versão da camada de transporte: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Transporte</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">A string do ID da sessão BIP324 em hexadecimal, se houver.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">ID de sessão</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Versão</translation>
</message>
@@ -2307,6 +2378,21 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Saída:</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">detectando: o par pode ser v1 ou v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: protocolo de transporte de texto simples não criptografado</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: protocolo de transporte criptografado BIP324</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">&amp;Copiar endereço</translation>
@@ -2361,6 +2447,10 @@ Só é possível assinar com endereços do tipo 'legado'.</translation>
<translation type="unfinished">Control+P</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Janela do nó - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Executando comando usando a carteira "%1"</translation>
</message>
@@ -2695,10 +2785,6 @@ Para mais informações sobre a utilização desse console. digite %6.
<translation type="unfinished">Entradas...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Poeira:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Escolher...</translation>
</message>
@@ -2775,12 +2861,8 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Copiar bytes</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiar poeira</translation>
- </message>
- <message>
<source>Copy change</source>
- <translation type="unfinished">Copiar alteração</translation>
+ <translation type="unfinished">Copiar troco</translation>
</message>
<message>
<source>%1 (%2 blocks)</source>
@@ -2795,10 +2877,6 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Cria uma Transação de Bitcoin Parcialmente Assinada (PSBT) para usar com, por exemplo, uma carteira %1 offline ou uma carteira física compatível com PSBTs.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">da carteira '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 para '%2'</translation>
</message>
@@ -2837,6 +2915,10 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Por favor, revise a transação. Será produzido uma Transação de Bitcoin Parcialmente Assinada (PSBT) que você pode copiar e assinar com, por exemplo, uma carteira %1 offline, ou uma carteira física compatível com PSBTs.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 da pasta "%2</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Deseja criar esta transação?</translation>
@@ -3293,8 +3375,9 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Index da saída</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(O certificado não foi verificado)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">
+%1 (O certificado não foi verificado)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3395,10 +3478,6 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Enviado para</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pagamento para você mesmo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minerado</translation>
</message>
@@ -3470,10 +3549,6 @@ Nota: Como a taxa é calculada por byte, uma taxa de "100 satoshis por kvB" para
<translation type="unfinished">Enviado para</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Para você mesmo</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minerado</translation>
</message>
@@ -3712,6 +3787,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s está corrompido. Tente usar a ferramenta de carteira bitcoin-wallet para salvamento ou restauração de backup.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s falhou ao validar o estado da cópia -assumeutxo. Isso indica um problema de hardware, um bug no software ou uma modificação incorreta do software que permitiu o carregamento de uma cópia inválida. Como resultado disso, o nó será desligado e parará de usar qualquer estado criado na cópia, redefinindo a altura da corrente de %d para %d. Na próxima reinicialização, o nó retomará a sincronização de%d sem usar nenhum dado da cópia. Por favor, reporte este incidente para %s, incluindo como você obteve a cópia. A cópia inválida do estado de cadeia será deixada no disco caso sirva para diagnosticar o problema que causou esse erro.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">1%s solicita para escutar na porta 2%u. Esta porta é considerada "ruim" e, portanto, é improvável que qualquer ponto se conecte-se a ela. Consulte doc/p2p-bad-ports.md para obter detalhes e uma lista completa.</translation>
</message>
@@ -3732,10 +3811,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Erro ao carregar a carteira. A carteira requer que os blocos sejam baixados e o software atualmente não suporta o carregamento de carteiras enquanto os blocos estão sendo baixados fora de ordem ao usar instantâneos assumeutxo. A carteira deve ser carregada com êxito após a sincronização do nó atingir o patamar 1%s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Erro ao ler arquivo %s! Todas as chaves privadas foram lidas corretamente, mas os dados de transação ou o livro de endereços podem estar faltando ou incorretos.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Erro ao ler %s! Dados de transações podem estar incorretos ou faltando. Reescaneando a carteira.</translation>
</message>
@@ -3772,6 +3847,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Prune: A ultima sincronização da carteira foi além dos dados podados. Você precisa usar -reindex (fazer o download de toda a blockchain novamente no caso de nós com prune)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Falha ao renomear '%s' -&gt; '%s'. Você deve resolver este problema manualmente movendo ou removendo o diretório de cópia inválido %s, caso contrário o mesmo erro ocorrerá novamente na próxima inicialização.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: Desconhecida a versão %d do programa da carteira sqlite. Apenas a versão %d é suportada</translation>
</message>
@@ -3780,10 +3859,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">O banco de dados de blocos contém um bloco que parece ser do futuro. Isso pode ser devido à data e hora do seu computador estarem configuradas incorretamente. Apenas reconstrua o banco de dados de blocos se você estiver certo de que a data e hora de seu computador estão corretas.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">O banco de dados de índices de bloco contém um 'txindex' antigo. Faça um -reindex completo para liberar espaço em disco, se desejar. Este erro não será exibido novamente.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">A quantia da transação é muito pequena para mandar depois de deduzida a taxa</translation>
</message>
@@ -3816,6 +3891,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Não é possível reproduzir blocos. Você precisará reconstruir o banco de dados usando -reindex-chainstate.</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Categoria especificada no nível de log não suportada %1$s=%2$s. Esperado %1$s=&lt;category&gt;:&lt;loglevel&gt;. Categorias validas: %3$s. Níveis de log válidos: %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Formato de banco de dados incompatível na chainstate. Por favor reinicie com a opção "-reindex-chainstate". Isto irá recriar o banco de dados da chainstate.</translation>
</message>
@@ -3824,6 +3903,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Carteira criada com sucesso. As carteiras antigas estão sendo descontinuadas e o suporte para a criação de abertura de carteiras antigas será removido no futuro.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Carteira carregada com sucesso. As carteiras legadas estão sendo descontinuadas e o suporte para a criação e abertura de carteiras legadas será removido no futuro. Carteiras legadas podem ser migradas para uma carteira com descritor com a ferramenta migratewallet. </translation>
+ </message>
+ <message>
<source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
<translation type="unfinished">Aviso: Chaves privadas detectadas na carteira {%s} com chaves privadas desativadas</translation>
</message>
@@ -3868,30 +3951,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Não foi possível escrever no diretório '%s': verifique as permissões.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">O processo de atualização do -txindex iniciado por uma versão anterior não foi concluído. Reinicie com a versão antiga ou faça um -reindex completo.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s falhou ao validar o estado da cópia -assumeutxo. Isso indica um problema de hardware, um bug no software ou uma modificação incorreta do software que permitiu o carregamento de uma cópia inválida. Como resultado disso, o nó será desligado e parará de usar qualquer estado criado na cópia, redefinindo a altura da corrente de %d para %d. Na próxima reinicialização, o nó retomará a sincronização de%d sem usar nenhum dado da cópia. Por favor, reporte este incidente para %s, incluindo como você obteve a cópia. A cópia inválida do estado de cadeia foi deixado no disco caso sirva para diagnosticar o problema que causou esse erro.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s está muito alto! Essa quantia poderia ser paga em uma única transação.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">a opção "-reindex-chainstate" não é compatível com "-blockfilterindex". Por favor, desabilite temporariamente a opção "blockfilterindex" enquanto utilizar a opção "-reindex-chainstate", ou troque "-reindex-chainstate" por "-reindex" para recriar completamente todos os índices. </translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">a opção "-reindex-chainstate" não é compatível com a opção "-coinstatsindex". Por favor desative temporariamente a opção "coinstatsindex" enquanto estiver utilizando "-reindex-chainstate", ou troque "-reindex-chainstate" por "-reindex" para recriar completamente todos os índices.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">a opção "-reindex-chainstate" não é compatível com a opção "-coinstatsindex". Por favor desative temporariamente a opção "coinstatsindex" enquanto estiver utilizando "-reindex-chainstate", ou troque "-reindex-chainstate" por "-reindex" para recriar completamente todos os índices.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Não é possível fornecer conexões específicas e ter addrman procurando conexões ao mesmo tempo.</translation>
</message>
@@ -3900,6 +3963,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Erro ao abrir %s: Carteira com assinador externo. Não foi compilado suporte para assinadores externos</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Erro ao ler arquivo %s! Todas as chaves foram lidas corretamente, mas os dados de transação ou os metadados de endereço podem estar incorretos ou faltando.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Erro: Os dados do livro de endereços da carteira não puderam ser identificados por pertencerem a carteiras migradas</translation>
</message>
@@ -3912,6 +3979,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Erro: A transação %s na carteira não pôde ser identificada por pertencer a carteiras migradas</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Falha ao calcular as taxas de colisão porque os UTXOs não confirmados dependem de um enorme conjunto de transações não confirmadas.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Impossível renomear o arquivo peers.dat (inválido). Por favor mova-o ou delete-o e tente novamente.</translation>
</message>
@@ -3986,10 +4057,6 @@ Por favor tente atualizar o software para a última versão.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Categoria especificada no nível de log não suportada "-loglevel=%s". Esperado "-loglevel=&lt;category&gt;:&lt;loglevel&gt;. Categorias validas: %s. Níveis de log válidos: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4034,6 +4101,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Carregamento terminado!</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erro durante commiting db txn para a remoção das transações da carteira.</translation>
+ </message>
+ <message>
<source>Error initializing block database</source>
<translation type="unfinished">Erro ao inicializar banco de dados de blocos</translation>
</message>
@@ -4074,16 +4145,12 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Erro ao ler o banco de dados. Encerrando.</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Erro: não é possível extrair a destinação do scriptpubkey gerado</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Erro: impossível adicionar tx apenas-visualização para carteira apenas-visualização</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Erro durante o início db txn para a remoção das transações da carteira.</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Erro: Impossível excluir transações apenas-visualização </translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Erro: não é possível extrair a destinação do scriptpubkey gerado</translation>
</message>
<message>
<source>Error: Disk space is low for %s</source>
@@ -4098,10 +4165,6 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Keypool exaurida, por gentileza execute keypoolrefill primeiro</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Erro: Nem todos os txs apenas-visualização foram excluídos</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Erro: Essa carteira já utiliza o SQLite</translation>
</message>
@@ -4126,10 +4189,30 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Erro: Impossível ler todos os registros no banco de dados</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Erro: Não foi possível ler o melhor registo de localização de blocos da carteira</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">Erro: Impossível remover dados somente-visualização do Livro de Endereços </translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Erro: Não foi possível escrever o registo do melhor localizador de bloqueio da pasta solvível</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Erro: Não é possível escrever o registo do melhor localizador de blocos da pasta watchonly</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Erro: falha na cópia da agenda de endereços para a carteira %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Erro: a transação do banco de dados não pode ser executada para a carteira %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Falha ao escutar em qualquer porta. Use -listen=0 se você quiser isso.</translation>
</message>
@@ -4138,10 +4221,18 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Falha ao escanear novamente a carteira durante a inicialização</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Falha ao iniciar índices, desligando..</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Falha ao verificar a base de dados</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Falha ao remover a transação: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Taxa de taxa (%s) é menor que a configuração da taxa de taxa (%s)</translation>
</message>
@@ -4354,6 +4445,10 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Esta é a taxa que você irá pagar se enviar uma transação.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">A transação %s não pertence a esta carteira.</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Quantidade da transação muito pequena</translation>
</message>
@@ -4366,10 +4461,6 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Endereço de troco da transação fora da faixa</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">A transação demorou muito na memória</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">A transação deve ter ao menos um destinatário</translation>
</message>
@@ -4438,14 +4529,30 @@ Impossível restaurar backup da carteira.</translation>
<translation type="unfinished">Rede desconhecida especificada em -onlynet: '%s'</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Nível de log global inválido "-loglevel=%s". Valores válidos: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Nível de registo global não suportado %s=%s. Valores válidos: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">falha na criação do ficheiro da pasta: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates não é suportado na cadeia %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Categoria de log desconhecida %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Erro: Não foi possível adicionar tx %s de vigilância à pasta de vigilância</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Erro: Impossível excluir transações apenas-visualização.</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Comentário do Agente de Usuário (%s) contém caracteres inseguros.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ro.ts b/src/qt/locale/bitcoin_ro.ts
index 14739e0cdb..059436329d 100644
--- a/src/qt/locale/bitcoin_ro.ts
+++ b/src/qt/locale/bitcoin_ro.ts
@@ -54,14 +54,6 @@
<translation type="unfinished">A&amp;lege</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Adresa de trimitere</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adresa de primire</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Acestea sunt adresele tale Bitcoin pentru efectuarea platilor. Intotdeauna verifica atent suma de plata si adresa beneficiarului inainte de a trimite monede.</translation>
</message>
@@ -98,6 +90,14 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">A apărut o eroare la salvarea listei de adrese la %1. Vă rugăm să încercaţi din nou.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Adresa de trimitere-%1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Adresa de primire - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Export nereusit</translation>
</message>
@@ -672,6 +672,11 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Încarcă backup-ul portmoneului</translation>
</message>
<message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Restaurare portofel</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Numele portofelului</translation>
@@ -809,10 +814,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Comision:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Praf:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">După taxă:</translation>
</message>
@@ -877,10 +878,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Copiază octeţi</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiază praf</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiază rest</translation>
</message>
@@ -889,18 +886,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">(%1 blocat)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">da</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">nu</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Această etichetă devine roşie, dacă orice beneficiar primeşte o sumă mai mică decât pragul curent pentru praf.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Poate varia +/- %1 satoshi pentru fiecare intrare.</translation>
</message>
@@ -967,6 +952,29 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Restaurare portofel</translation>
+ </message>
+ <message>
+ <source>Restore wallet failed</source>
+ <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
+ <translation type="unfinished">Restaurarea portofelului nereusita</translation>
+ </message>
+ <message>
+ <source>Restore wallet warning</source>
+ <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
+ <translation type="unfinished">Avertisment restaurare portofel</translation>
+ </message>
+ <message>
+ <source>Restore wallet message</source>
+ <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
+ <translation type="unfinished">Mesaj restaurare portofel</translation>
+ </message>
+</context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1028,21 +1036,17 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Faceți Portofel gol</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Utilizați descriptori pentru gestionarea scriptPubKey</translation>
+ <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
+ <translation type="unfinished">Utilizeaza un dispozitiv de semnare a tranzactiilor, de exemplu un portofel hardware. Mai intai, configureaza software-ul pentru dispozitivul extern din preferintele portofelului.</translation>
</message>
<message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished"> Descriptor Portofel</translation>
+ <source>External signer</source>
+ <translation type="unfinished">Semnator extern</translation>
</message>
<message>
<source>Create</source>
<translation type="unfinished">Creează</translation>
</message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Compilat fără suport sqlite (necesar pentru portofele descriptor)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1149,6 +1153,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
</translation>
</message>
<message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">Alege directorul de date</translation>
+ </message>
+ <message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">Cel putin %1GB de date vor fi stocate in acest director, si aceasta valoare va creste in timp.</translation>
</message>
@@ -1194,6 +1202,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Deoarece este prima lansare a programului poți alege unde %1 va stoca datele sale.</translation>
</message>
<message>
+ <source>Limit block chain storage to</source>
+ <translation type="unfinished">Limiteaza stocarea blockchainul-ui la</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
<translation type="unfinished">Revenirea la această setare necesită re-descărcarea întregului blockchain. Este mai rapid să descărcați mai întâi rețeaua complet și să o fragmentați mai târziu. Dezactivează unele funcții avansate.</translation>
</message>
@@ -1255,6 +1267,14 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Numarul de blocuri ramase</translation>
</message>
<message>
+ <source>Unknown…</source>
+ <translation type="unfinished">Necunoscut...</translation>
+ </message>
+ <message>
+ <source>calculating…</source>
+ <translation type="unfinished">Se calculeaza...</translation>
+ </message>
+ <message>
<source>Last block time</source>
<translation type="unfinished">Data ultimului bloc</translation>
</message>
@@ -1366,6 +1386,11 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">(0 = automat, &lt;0 = lasă atîtea nuclee libere)</translation>
</message>
<message>
+ <source>Enable R&amp;PC server</source>
+ <extracomment>An Options window setting to enable the RPC server.</extracomment>
+ <translation type="unfinished">Permite server-ul R&amp;PC</translation>
+ </message>
+ <message>
<source>W&amp;allet</source>
<translation type="unfinished">Portofel</translation>
</message>
@@ -1382,6 +1407,11 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Cheltuire rest neconfirmat</translation>
</message>
<message>
+ <source>Enable &amp;PSBT controls</source>
+ <extracomment>An options window setting to enable PSBT controls.</extracomment>
+ <translation type="unfinished">Permite controalele &amp;PSBT</translation>
+ </message>
+ <message>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation type="unfinished">Deschide automat în router portul aferent clientului Bitcoin. Funcţionează doar dacă routerul duportă UPnP şi e activat.</translation>
</message>
@@ -1418,6 +1448,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">&amp;Fereastră</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">Arata pictograma in zona de notificare</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">Arată doar un icon în tray la ascunderea ferestrei</translation>
</message>
@@ -1495,6 +1529,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Fisierul de configurare e folosit pentru a specifica optiuni utilizator avansate care modifica setarile din GUI. In plus orice optiune din linia de comanda va modifica acest fisier de configurare.</translation>
</message>
<message>
+ <source>Continue</source>
+ <translation type="unfinished">Continua</translation>
+ </message>
+ <message>
<source>Cancel</source>
<translation type="unfinished">Anulare</translation>
</message>
@@ -1589,6 +1627,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Copiați în clipboard</translation>
</message>
<message>
+ <source>Save…</source>
+ <translation type="unfinished">Salveaza</translation>
+ </message>
+ <message>
<source>Close</source>
<translation type="unfinished">Inchide</translation>
</message>
@@ -1597,6 +1639,10 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Salvați datele tranzacției</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">adresa proprie</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">Suma totală</translation>
</message>
@@ -2170,10 +2216,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Şterge toate câmpurile formularului.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Praf:</translation>
- </message>
- <message>
<source>Confirmation time target:</source>
<translation type="unfinished">Timp confirmare tinta:</translation>
</message>
@@ -2222,10 +2264,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Copiază octeţi</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Copiază praf</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Copiază rest</translation>
</message>
@@ -2234,10 +2272,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">%1(%2 blocuri)</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">din portofelul '%1'</translation>
- </message>
- <message>
<source>%1 to %2</source>
<translation type="unfinished">%1 la %2</translation>
</message>
@@ -2635,10 +2669,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Index debit</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certificatul nu a fost verificat)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Comerciant</translation>
</message>
@@ -2737,10 +2767,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Trimis către</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Plată către dvs.</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minat</translation>
</message>
@@ -2816,10 +2842,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Trimis către</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Către dvs.</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minat</translation>
</message>
@@ -3003,10 +3025,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Distribuit sub licenţa de programe MIT, vezi fişierul însoţitor %s sau %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Eroare la citirea %s! Toate cheile sînt citite corect, dar datele tranzactiei sau anumite intrări din agenda sînt incorecte sau lipsesc.</translation>
- </message>
- <message>
<source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
<translation type="unfinished">Vă rugăm verificaţi dacă data/timpul calculatorului dvs. sînt corecte! Dacă ceasul calcultorului este gresit, %s nu va funcţiona corect.</translation>
</message>
@@ -3243,10 +3261,6 @@ Semnarea este posibilă numai cu adrese de tip "legacy".</translation>
<translation type="unfinished">Sumele tranzactionate nu pot fi negative</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Tranzacţia are o lungime prea mare in lantul mempool</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Tranzactia trebuie sa aiba cel putin un destinatar</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ru.ts b/src/qt/locale/bitcoin_ru.ts
index 1f728430fe..c7ac89b746 100644
--- a/src/qt/locale/bitcoin_ru.ts
+++ b/src/qt/locale/bitcoin_ru.ts
@@ -3,11 +3,11 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Нажмите правую кнопку мыши, чтобы изменить адрес или метку</translation>
+ <translation type="unfinished">Щелкните правой кнопкой мыши, чтобы отредактировать адрес или этикетку</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">создать новый адрес</translation>
+ <translation type="unfinished">Создать новый адрес</translation>
</message>
<message>
<source>&amp;New</source>
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Copia la dirección seleccionada al portapapeles</translation>
+ <translation type="unfinished">Копирование выбранного адреса в системный буфер обмена</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Выбрать</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Адреса отправки</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Адреса получения</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Это ваши биткоин-адреса для отправки платежей. Всегда проверяйте сумму и адрес получателя перед отправкой перевода.</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Произошла ошибка при попытке сохранить список адресов в %1. Пожалуйста, попробуйте еще раз.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Адреса отправки - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Адреса получения - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Ошибка при экспорте</translation>
</message>
@@ -181,11 +181,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">Введите старую и новую парольные фразы для кошелька</translation>
+ <translation type="unfinished">Введите старую и новую парольные фразы для кошелька.</translation>
</message>
<message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation type="unfinished">Помните, что шифрование кошелька не может полностью защитить ваши биткоины от кражи вредоносными программами, заразившими ваш компьютер.</translation>
+ <translation type="unfinished">Помните, что шифрование кошелька не может полностью защитить ваши биткоины от кражи вредоносным ПО, заразившим ваш компьютер.</translation>
</message>
<message>
<source>Wallet to be encrypted</source>
@@ -193,11 +193,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">Ваш кошелёк будет зашифрован.</translation>
+ <translation type="unfinished">Ваш кошелёк будет зашифрован. </translation>
</message>
<message>
<source>Your wallet is now encrypted. </source>
- <translation type="unfinished">Сейчас ваш кошелёк зашифрован.</translation>
+ <translation type="unfinished">Сейчас ваш кошелёк зашифрован. </translation>
</message>
<message>
<source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
@@ -205,15 +205,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet encryption failed</source>
- <translation type="unfinished">Не удалось зашифровать кошелёк</translation>
+ <translation type="unfinished">Шифрование кошелька не удалось</translation>
</message>
<message>
<source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation type="unfinished">Сбой шифрования кошелька из-за внутренней ошибки. Ваш кошелёк не был зашифрован.</translation>
+ <translation type="unfinished">Шифрование кошелька не удалось из-за внутренней ошибки. Ваш кошелек не был зашифрован.</translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
- <translation type="unfinished">Введённые парольные фразы не совпадают.</translation>
+ <translation type="unfinished">Введенные пароли не совпадают.</translation>
</message>
<message>
<source>Wallet unlock failed</source>
@@ -267,8 +267,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">Произошла критическая ошибка. %1 больше не может продолжать безопасную работу и будет закрыт.
- </translation>
+ <translation type="unfinished">Произошла критическая ошибка. %1 больше не может продолжать безопасную работу и будет закрыт.</translation>
</message>
<message>
<source>Internal error</source>
@@ -536,11 +535,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Options…</source>
- <translation type="unfinished">&amp;Параметры...</translation>
+ <translation type="unfinished">&amp;Параметры…</translation>
</message>
<message>
<source>&amp;Encrypt Wallet…</source>
- <translation type="unfinished">&amp;Зашифровать Кошелёк...</translation>
+ <translation type="unfinished">&amp;Зашифровать Кошелёк…</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
@@ -548,15 +547,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Создать резервную копию кошелька...</translation>
+ <translation type="unfinished">&amp;Создать резервную копию кошелька…</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
- <translation type="unfinished">&amp;Изменить пароль...</translation>
+ <translation type="unfinished">&amp;Изменить пароль…</translation>
</message>
<message>
<source>Sign &amp;message…</source>
- <translation type="unfinished">Подписать &amp;сообщение...</translation>
+ <translation type="unfinished">Подписать &amp;сообщение…</translation>
</message>
<message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
@@ -564,7 +563,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Verify message…</source>
- <translation type="unfinished">&amp;Проверить сообщение</translation>
+ <translation type="unfinished">&amp;Проверить сообщение…</translation>
</message>
<message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
@@ -572,23 +571,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Load PSBT from file…</source>
- <translation type="unfinished">&amp;Загрузить PSBT из файла...</translation>
+ <translation type="unfinished">&amp;Загрузить PSBT из файла…</translation>
</message>
<message>
<source>Open &amp;URI…</source>
- <translation type="unfinished">О&amp;ткрыть URI...</translation>
+ <translation type="unfinished">Открыть &amp;URI…</translation>
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">Закрыть кошелёк...</translation>
+ <translation type="unfinished">Закрыть кошелёк…</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">Создать кошелёк...</translation>
+ <translation type="unfinished">Создать кошелёк…</translation>
</message>
<message>
<source>Close All Wallets…</source>
- <translation type="unfinished">Закрыть все кошельки...</translation>
+ <translation type="unfinished">Закрыть все кошельки…</translation>
</message>
<message>
<source>&amp;File</source>
@@ -608,23 +607,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Syncing Headers (%1%)…</source>
- <translation type="unfinished">Синхронизация заголовков (%1%)...</translation>
+ <translation type="unfinished">Синхронизация заголовков (%1%)…</translation>
</message>
<message>
<source>Synchronizing with network…</source>
- <translation type="unfinished">Синхронизация с сетью...</translation>
+ <translation type="unfinished">Синхронизация с сетью…</translation>
</message>
<message>
<source>Indexing blocks on disk…</source>
- <translation type="unfinished">Индексация блоков на диске...</translation>
+ <translation type="unfinished">Индексация блоков на диске…</translation>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">Обработка блоков на диске...</translation>
+ <translation type="unfinished">Обработка блоков на диске…</translation>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">Подключение к узлам...</translation>
+ <translation type="unfinished">Подключение к узлам…</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -656,7 +655,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">Синхронизация...</translation>
+ <translation type="unfinished">Синхронизация…</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -680,7 +679,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Up to date</source>
- <translation type="unfinished">До настоящего времени </translation>
+ <translation type="unfinished">До настоящего времени</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction</source>
@@ -688,7 +687,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">Загрузить PSBT из &amp;буфера обмена...</translation>
+ <translation type="unfinished">Загрузить PSBT из &amp;буфера обмена…</translation>
</message>
<message>
<source>Load Partially Signed Bitcoin Transaction from clipboard</source>
@@ -712,7 +711,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">Открыть URI протокола bitcoin:</translation>
+ <translation type="unfinished">Открыть биткойн: URI</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -741,8 +740,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Закрыть все кошельки</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Перенести кошелек</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Перенос кошелька</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">Показать помощь по %1, чтобы получить список доступных параметров командной строки</translation>
+ <translation type="unfinished">Показать справку %1 со списком доступных параметров командной строки</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -838,6 +845,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Предсинхронизация заголовков (%1%)…</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Ошибка создания кошелька</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Невозможно создать новый кошелек, программа была скомпилирована без поддержки sqlite (требуется для дескрипторных кошельков)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Ошибка: %1</translation>
</message>
@@ -933,7 +948,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Bytes:</source>
- <translation type="unfinished">Байтов:</translation>
+ <translation type="unfinished">Байты:</translation>
</message>
<message>
<source>Amount:</source>
@@ -944,10 +959,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Комиссия:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Пыль:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">После комиссии:</translation>
</message>
@@ -1036,10 +1047,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Копировать байты</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копировать пыль</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Копировать сдачу</translation>
</message>
@@ -1048,18 +1055,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 заблокирован)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">да</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">нет</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Эта метка становится красной, если получатель получит сумму меньше, чем текущий порог пыли.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Может меняться на +/- %1 сатоши за каждый вход.</translation>
</message>
@@ -1115,14 +1110,65 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Loading wallets…</source>
<extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
- <translation type="unfinished">Загрузка кошельков...</translation>
+ <translation type="unfinished">Загрузка кошельков…</translation>
+ </message>
+</context>
+<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Перенести кошелек</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Вы уверены, что хотите перенести кошелек &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Миграция кошелька преобразует этот кошелек в один или несколько дескрипторных кошельков. Необходимо создать новую резервную копию кошелька.
+Если этот кошелек содержит какие-либо скрипты только для просмотра, будет создан новый кошелек, который содержит эти скрипты только для просмотра.
+Если этот кошелек содержит какие-либо решаемые, но не отслеживаемые скрипты, будет создан другой и новый кошелек, который содержит эти скрипты.
+
+В процессе миграции будет создана резервная копия кошелька. Файл резервной копии будет называться &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak и может быть найден в каталоге для этого кошелька. В случае неправильной миграции резервная копия может быть восстановлена с помощью функциональности "Восстановить кошелек".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Перенести Кошелек</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Перенос кошелька &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Кошелек '%1' был успешно перенесён.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Скрипты Watchonly были перенесены в новый кошелек под названием '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Решаемые, но не наблюдаемые сценарии были перенесены в новый кошелек под названием '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Перенос не удался</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Перенос успешно завершен</translation>
</message>
</context>
<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
- <translation type="unfinished">Не удалось открыть кошелёк </translation>
+ <translation type="unfinished">Не удалось открыть кошелёк</translation>
</message>
<message>
<source>Open wallet warning</source>
@@ -1140,7 +1186,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
- <translation type="unfinished">Открывается кошелёк &lt;b&gt;%1&lt;/b&gt;...</translation>
+ <translation type="unfinished">Открывается кошелёк &lt;b&gt;%1&lt;/b&gt;…</translation>
</message>
</context>
<context>
@@ -1153,7 +1199,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">Восстановление кошелька &lt;b&gt;%1&lt;/b&gt;...</translation>
+ <translation type="unfinished">Восстановление кошелька &lt;b&gt;%1&lt;/b&gt;…</translation>
</message>
<message>
<source>Restore wallet failed</source>
@@ -1165,12 +1211,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
<translation type="unfinished">Предупреждение при восстановлении кошелька</translation>
</message>
- <message>
- <source>Restore wallet message</source>
- <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">Сообщение при восстановлении кошелька</translation>
- </message>
-</context>
+ </context>
<context>
<name>WalletController</name>
<message>
@@ -1201,6 +1242,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Создать кошелёк</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Вы в одном шаге от создания своего нового кошелька!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Укажите имя и, при желании, включите дополнительные опции</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Название кошелька</translation>
</message>
@@ -1237,14 +1286,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Создать пустой кошелёк</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Использовать дескрипторы для управления scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Дескрипторный кошелёк</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Использовать внешнее устройство для подписи, например аппаратный кошелек. Сначала настройте сценарий внешней подписи в настройках кошелька.</translation>
</message>
@@ -1257,10 +1298,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Создать</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Скомпилирован без поддержки SQLite (он необходим для дескрипторных кошельков)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Скомпилирован без поддержки внешней подписи (требуется для внешней подписи)</translation>
@@ -1393,7 +1430,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 will download and store a copy of the Bitcoin block chain.</source>
- <translation type="unfinished">%1будет скачано и сохранит копию цепи блоков Bitcoin</translation>
+ <translation type="unfinished">%1 загрузит и сохранит копию цепочки блоков Bitcoin.</translation>
</message>
<message>
<source>The wallet will also be stored in this directory.</source>
@@ -1425,11 +1462,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">Возврат этого параметра в прежнее положение потребует повторного скачивания всей цепочки блоков. Быстрее будет сначала скачать полную цепочку и обрезать позднее. Отключает некоторые расширенные функции. </translation>
+ <translation type="unfinished">Возврат этого параметра в прежнее положение потребует повторного скачивания всей цепочки блоков. Быстрее будет сначала скачать полную цепочку и обрезать позднее. Отключает некоторые расширенные функции.</translation>
</message>
<message>
<source> GB</source>
- <translation type="unfinished">ГБ</translation>
+ <translation type="unfinished"> ГБ</translation>
</message>
<message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
@@ -1498,11 +1535,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Unknown…</source>
- <translation type="unfinished">Неизвестно...</translation>
+ <translation type="unfinished">Неизвестно…</translation>
</message>
<message>
<source>calculating…</source>
- <translation type="unfinished">вычисляется...</translation>
+ <translation type="unfinished">вычисляется…</translation>
</message>
<message>
<source>Last block time</source>
@@ -1534,7 +1571,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">Неизвестно. Синхронизируются заголовки (%1, %2%)...</translation>
+ <translation type="unfinished">Неизвестно. Синхронизируются заголовки (%1, %2%)…</translation>
</message>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
@@ -1765,7 +1802,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Show the icon in the system tray.</source>
- <translation type="unfinished">Показывать значок в области уведомлений</translation>
+ <translation type="unfinished">Показывать значок в области уведомлений.</translation>
</message>
<message>
<source>&amp;Show tray icon</source>
@@ -1824,18 +1861,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Использовать &amp;отдельный прокси SOCKS5 для соединения с узлами через скрытые сервисы Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Моноширинный шрифт на вкладке Обзор:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">встроенный "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">самый похожий системный "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;ОК</translation>
</message>
@@ -1867,11 +1892,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Для активации изменений необходим перезапуск клиента.</translation>
</message>
<message>
- <source>Current settings will be backed up at "%1".</source>
- <extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
- <translation type="unfinished">Резервная копия текущих настроек будет сохранена в "%1".</translation>
- </message>
- <message>
<source>Client will be shut down. Do you want to proceed?</source>
<extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
<translation type="unfinished">Клиент будет закрыт. Продолжить?</translation>
@@ -2033,7 +2053,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Cannot sign inputs while wallet is locked.</source>
- <translation type="unfinished">Невозможно подписать входы пока кошелёк заблокирован</translation>
+ <translation type="unfinished">Невозможно подписать входы пока кошелёк заблокирован.</translation>
</message>
<message>
<source>Could not sign any more inputs.</source>
@@ -2061,7 +2081,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>PSBT copied to clipboard.</source>
- <translation type="unfinished">PSBT скопирована в буфер обмена</translation>
+ <translation type="unfinished">PSBT скопирована в буфер обмена.</translation>
</message>
<message>
<source>Save Transaction Data</source>
@@ -2077,8 +2097,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT сохранена на диск.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Отправляет %1 на %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">свой адрес</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2086,7 +2106,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Pays transaction fee: </source>
- <translation type="unfinished">Платит комиссию:</translation>
+ <translation type="unfinished">Платит комиссию: </translation>
</message>
<message>
<source>Total Amount</source>
@@ -2137,7 +2157,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Cannot start bitcoin: click-to-pay handler</source>
- <translation type="unfinished">Не удаётся запустить обработчик click-to-pay для протокола bitcoin:</translation>
+ <translation type="unfinished">Не удаётся запустить обработчик click-to-pay для протокола bitcoin</translation>
</message>
<message>
<source>URI handling</source>
@@ -2327,7 +2347,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Wallet: </source>
- <translation type="unfinished">Кошелёк:</translation>
+ <translation type="unfinished">Кошелёк: </translation>
</message>
<message>
<source>(none)</source>
@@ -2358,6 +2378,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Выберите узел для просмотра подробностей.</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Версия транспортного протокола:%1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Транспортный протокол</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Строка идентификатора сеанса BIP324 в шестнадцатеричном формате, если таковой имеется.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">ID сессии</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Версия</translation>
</message>
@@ -2468,10 +2504,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Службы</translation>
</message>
<message>
- <source>High bandwidth BIP152 compact block relay: %1</source>
- <translation type="unfinished">Широкополосный ретранслятор компактных блоков BIP152: %1</translation>
- </message>
- <message>
<source>High Bandwidth</source>
<translation type="unfinished">Широкая полоса</translation>
</message>
@@ -2587,6 +2619,21 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Исходящий для получения адресов: короткое время жизни, для запроса адресов</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">обнаружение: пир может быть v1 или v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: незашифрованный транспортный протокол с открытым текстом</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: Зашифрованный транспортный протокол BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">мы выбрали этот узел для широкополосной передачи</translation>
</message>
@@ -3003,10 +3050,6 @@ For more information on using this console, type %6.
<translation type="unfinished">Входы…</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Пыль:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Выбрать…</translation>
</message>
@@ -3083,10 +3126,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Копировать байты</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копировать пыль</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Копировать сдачу</translation>
</message>
@@ -3117,10 +3156,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Создает частично подписанную биткоин-транзакцию (PSBT), чтобы использовать её, например, с офлайновым кошельком %1, или PSBT-совместимым аппаратным кошельком.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">с кошелька "%1"</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 на "%2"</translation>
</message>
@@ -3511,7 +3546,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<name>TrafficGraphWidget</name>
<message>
<source>kB/s</source>
- <translation type="unfinished">КБ/с</translation>
+ <translation type="unfinished">кБ/с</translation>
</message>
</context>
<context>
@@ -3647,10 +3682,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Индекс выхода</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Сертификат не был проверен)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Продавец</translation>
</message>
@@ -3749,10 +3780,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Отправлено на</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Платёж себе</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Добыто</translation>
</message>
@@ -3828,10 +3855,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Отправлено на</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Себе</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Добыто</translation>
</message>
@@ -3849,7 +3872,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Range…</source>
- <translation type="unfinished">Диапазон...</translation>
+ <translation type="unfinished">Диапазон…</translation>
</message>
<message>
<source>&amp;Copy address</source>
@@ -4051,7 +4074,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Can't sign transaction.</source>
- <translation type="unfinished">Невозможно подписать транзакцию</translation>
+ <translation type="unfinished">Невозможно подписать транзакцию.</translation>
</message>
<message>
<source>Could not commit transaction</source>
@@ -4117,6 +4140,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s испорчен. Попробуйте восстановить его с помощью инструмента bitcoin-wallet или из резервной копии.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s не удалось подтвердить состояние моментального снимка -assumeutxo. Это указывает на аппаратную проблему, или ошибку в программном обеспечении, или неудачную модификацию программного обеспечения, которая позволила загрузить недопустимый снимок. В результате этого узел выключится и перестанет использовать любое состояние, которое было построено на основе моментального снимка, сбросив высоту цепочки с %d на %d. При следующем перезапуске узел возобновит синхронизацию с %d без использования данных моментального снимка. Сообщите об этом инциденте по адресу %s, указав, как вы получили снимок. Состояние цепи недействительного снимка будет оставлено на диске, если оно поможет в диагностике проблемы, вызвавшей эту ошибку.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s хочет открыть порт %u на прослушивание. Этот порт считается "плохим", и другие узлы, скорее всего, не захотят общаться через этот порт. Список портов и подробности можно узнать в документе doc/p2p-bad-ports.md.</translation>
</message>
@@ -4145,10 +4172,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Не удалось загрузить кошелёк. Для кошелька требуется, чтобы блоки были загружены. Но в данный момент программа не поддерживает загрузку кошелька с одновременной загрузкой блоков не по порядку с использованием снимков assumeutxo. Кошелёк должен успешно загрузиться после того, как узел синхронизирует блок %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Ошибка чтения %s! Все ключи прочитаны верно, но данные транзакций или записи адресной книги могут отсутствовать или быть неправильными.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Ошибка чтения %s! Данные транзакций отсутствуют или неправильны. Кошелёк сканируется заново.</translation>
</message>
@@ -4166,7 +4189,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
- <translation type="unfinished">Ошибка: устаревшие кошельки поддерживают только следующие типы адресов: "legacy", "p2sh-segwit", и "bech32".</translation>
+ <translation type="unfinished">Ошибка: устаревшие кошельки поддерживают только следующие типы адресов: "legacy", "p2sh-segwit", и "bech32"</translation>
</message>
<message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
@@ -4186,15 +4209,15 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">Не указан дамп-файл. Чтобы использовать createfromdump, необходимо указать -dumpfile=&lt;filename&gt;</translation>
+ <translation type="unfinished">Не указан дамп-файл. Чтобы использовать createfromdump, необходимо указать -dumpfile=&lt;filename&gt;.</translation>
</message>
<message>
<source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">Не указан дамп-файл. Чтобы использовать dump, необходимо указать -dumpfile=&lt;filename&gt;</translation>
+ <translation type="unfinished">Не указан дамп-файл. Чтобы использовать dump, необходимо указать -dumpfile=&lt;filename&gt;.</translation>
</message>
<message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <translation type="unfinished">Не указан формат файла кошелька. Чтобы использовать createfromdump, необходимо указать -format=&lt;format&gt;</translation>
+ <translation type="unfinished">Не указан формат файла кошелька. Чтобы использовать createfromdump, необходимо указать -format=&lt;format&gt;.</translation>
</message>
<message>
<source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
@@ -4217,16 +4240,16 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Обрезка: последняя синхронизация кошелька вышла за рамки обрезанных данных. Необходимо сделать -reindex (снова скачать всю цепочку блоков, если у вас узел с обрезкой)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Не удалось выполнить переименование '%s' -&gt; '%s'. Вы должны решить эту проблему, вручную переместив или удалив недействительный каталог моментальных снимков %s, иначе при следующем запуске вы снова столкнетесь с той же ошибкой.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: неизвестная версия схемы SQLite кошелька: %d. Поддерживается только версия %d</translation>
</message>
<message>
<source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
- <translation type="unfinished">В базе данных блоков найден блок из будущего. Это может произойти из-за неверно установленных даты и времени на вашем компьютере. Перестраивайте базу данных блоков только если вы уверены, что дата и время установлены верно.</translation>
- </message>
- <message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">База данных индексации блоков содержит устаревший "txindex". Чтобы освободить место на диске, выполните полный -reindex, или игнорируйте эту ошибку. Это сообщение об ошибке больше показано не будет.</translation>
+ <translation type="unfinished">В базе данных блоков найден блок из будущего. Это может произойти из-за неверно установленных даты и времени на вашем компьютере. Перестраивайте базу данных блоков только если вы уверены, что дата и время установлены верно</translation>
</message>
<message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
@@ -4265,6 +4288,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Указан неизвестный формат файла кошелька "%s". Укажите "bdb" либо "sqlite".</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Неподдерживаемый уровень регистрации по категориям %1$s=%2$s. Ожидается %1$s=&lt;category&gt;:&lt;loglevel&gt;. Допустимые категории: %3$s. Допустимые уровни регистрации: %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Обнаружен неподдерживаемый формат базы данных состояния цепочки блоков. Пожалуйста, перезапустите программу с ключом -reindex-chainstate. Это перестроит базу данных состояния цепочки блоков.</translation>
</message>
@@ -4273,6 +4300,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Кошелёк успешно создан. Старый формат кошелька признан устаревшим. Поддержка создания кошелька в этом формате и его открытие в будущем будут удалены.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Кошелек успешно загружен. Устаревший тип кошелька, поддержка создания и открытия устаревших кошельков будет удалена в будущем. Устаревшие кошельки можно перенести на дескрипторный кошелек с помощью функции migratewallet.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Внимание: формат дамп-файла кошелька "%s" не соответствует указанному в командной строке формату "%s".</translation>
</message>
@@ -4321,26 +4352,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Не удается выполнить запись в каталог данных "%s"; проверьте разрешения.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">Обновление -txindex, запущенное при предыдущей версии не может быть завершено. Перезапустите с предыдущей версией или запустите весь процесс заново с ключом -reindex.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s слишком много! Комиссии такого объёма могут быть оплачены за одну транзакцию.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Опция -reindex-chainstate не совместима с -blockfilterindex. Пожалуйста, выключите на время blockfilterindex, пока используется -reindex-chainstate, либо замените -reindex-chainstate на -reindex для полной перестройки всех индексов.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Опция -reindex-chainstate не совместима с -coinstatsindex. Пожалуйста, выключите на время coinstatsindex, пока используется -reindex-chainstate, либо замените -reindex-chainstate на -reindex для полной перестройки всех индексов.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Опция -reindex-chainstate не совместима с -txindex. Пожалуйста, выключите на время txindex, пока используется -reindex-chainstate, либо замените -reindex-chainstate на -reindex для полной перестройки всех индексов.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Не удаётся предоставить определённые соединения, чтобы при этом addrman нашёл в них исходящие соединения.</translation>
</message>
@@ -4349,6 +4364,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Ошибка загрузки %s: не удалось загрузить кошелёк с внешней подписью, так как эта версия программы собрана без поддержки внешней подписи</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Ошибка при чтении %s! Все ключи прочитаны правильно, но данные транзакции или метаданные адреса могут отсутствовать или быть неверными.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Ошибка: адресная книга в кошельке не принадлежит к мигрируемым кошелькам</translation>
</message>
@@ -4361,14 +4380,26 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Ошибка: транзакция %s не принадлежит к мигрируемым кошелькам</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Не удалось рассчитать комиссионные за бамп, поскольку неподтвержденные UTXO зависят от огромного скопления неподтвержденных транзакций.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Не удалось переименовать файл peers.dat. Пожалуйста, переместите или удалите его и попробуйте снова.</translation>
</message>
<message>
+ <source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
+ <translation type="unfinished">Оценка вознаграждения не удалась. Fallbackfee отключен. Подождите несколько блоков или включите %s.</translation>
+ </message>
+ <message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
<translation type="unfinished">Несовместимые ключи: был явно указан -dnsseed=1, но -onlynet не разрешены соединения через IPv4/IPv6</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
+ <translation type="unfinished">Неверная сумма для %s=&lt;amount&gt;: '%s' (должна быть не менее минимальной комиссии %s, чтобы предотвратить застревание транзакций)</translation>
+ </message>
+ <message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
<translation type="unfinished">Исходящие соединения ограничены сетью CJDNS (-onlynet=cjdns), но -cjdnsreachable не задан</translation>
</message>
@@ -4386,7 +4417,23 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">Размер входов превысил максимальный вес. Пожалуйста, попробуйте отправить меньшую сумму или объедините UTXO в вашем кошельке вручную.</translation>
+ <translation type="unfinished">Размер входов превысил максимальный вес. Пожалуйста, попробуйте отправить меньшую сумму или объедините UTXO в вашем кошельке вручную</translation>
+ </message>
+ <message>
+ <source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
+ <translation type="unfinished">Общая сумма предварительно выбранных монет не покрывает цель транзакции. Пожалуйста, разрешите автоматический выбор других входов или включите больше монет вручную</translation>
+ </message>
+ <message>
+ <source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
+ <translation type="unfinished">Для транзакции требуется одно место назначения с не-0 значением, не-0 feerate или предварительно выбранный вход</translation>
+ </message>
+ <message>
+ <source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
+ <translation type="unfinished">Снимок UTXO не прошел проверку. Перезапустите, чтобы возобновить нормальную загрузку начального блока, или попробуйте загрузить другой снимок.</translation>
+ </message>
+ <message>
+ <source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
+ <translation type="unfinished">Неподтвержденные UTXO доступны, но их расходование создает цепочку транзакций, которые будут отклонены мемпулом</translation>
</message>
<message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
@@ -4411,10 +4458,6 @@ Please try running the latest software version.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Неподдерживаемый уровень подробности журнала для категории -loglevel=%s. Ожидалось -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Доступные категории: %s. Доступные уровни подробности журнала: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4519,14 +4562,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Ошибка: не удалось извлечь получателя из сгенерированного scriptpubkey</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Ошибка: не удалось добавить транзакцию для наблюдения в кошелёк для наблюдения</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Ошибка: транзакции только для наблюдения не удаляются</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">Ошибка: не удалось создать курсор в базе данных</translation>
</message>
@@ -4536,7 +4571,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
- <translation type="unfinished">Ошибка: контрольные суммы дамп-файла не совпадают. Вычислено %s, ожидалось %s.</translation>
+ <translation type="unfinished">Ошибка: контрольные суммы дамп-файла не совпадают. Вычислено %s, ожидалось %s</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
@@ -4563,10 +4598,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Ошибка: нет %s доступных адресов.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Ошибка: не все наблюдаемые транзакции могут быть удалены</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Ошибка: этот кошелёк уже использует SQLite</translation>
</message>
@@ -4607,6 +4638,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Не удалось пересканировать кошелёк во время инициализации</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Не удалось запустить индексы, завершение работы...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Не удалось проверить базу данных</translation>
</message>
@@ -4679,6 +4714,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Неверный порт указан в %s: '%s'</translation>
</message>
<message>
+ <source>Invalid pre-selected input %s</source>
+ <translation type="unfinished">Недопустимый предварительно выбранный ввод %s</translation>
+ </message>
+ <message>
<source>Listening for incoming connections failed (listen returned error %s)</source>
<translation type="unfinished">Ошибка при прослушивании входящих подключений (%s)</translation>
</message>
@@ -4719,6 +4758,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Недостаточно доступных файловых дескрипторов.</translation>
</message>
<message>
+ <source>Not found pre-selected input %s</source>
+ <translation type="unfinished">Не найден предварительно выбранный ввод %s</translation>
+ </message>
+ <message>
+ <source>Not solvable pre-selected input %s</source>
+ <translation type="unfinished">Не решаемый заранее выбранный ввод %s</translation>
+ </message>
+ <message>
<source>Prune cannot be configured with a negative value.</source>
<translation type="unfinished">Обрезка блоков не может использовать отрицательное значение.</translation>
</message>
@@ -4812,11 +4859,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>This is the minimum transaction fee you pay on every transaction.</source>
- <translation type="unfinished">Это минимальная комиссия, которую вы платите для любой транзакции</translation>
+ <translation type="unfinished">Это минимальная комиссия, которую вы платите для любой транзакции.</translation>
</message>
<message>
<source>This is the transaction fee you will pay if you send a transaction.</source>
- <translation type="unfinished">Это размер комиссии, которую вы заплатите при отправке транзакции</translation>
+ <translation type="unfinished">Это размер комиссии, которую вы заплатите при отправке транзакции.</translation>
</message>
<message>
<source>Transaction amount too small</source>
@@ -4831,10 +4878,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Индекс получателя адреса сдачи вне диапазона</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">У транзакции слишком длинная цепочка в пуле в памяти</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Транзакция должна иметь хотя бы одного получателя</translation>
</message>
@@ -4911,8 +4954,12 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">В силу вступили неизвестные правила (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Неподдерживаемый уровень подробности ведения журнала -loglevel=%s. Доступные значения: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Неподдерживаемый уровень глобального протоколирования %s=%s. Допустимые значения: %s.</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates не поддерживается в цепочке %s.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
diff --git a/src/qt/locale/bitcoin_sc.ts b/src/qt/locale/bitcoin_sc.ts
index 69bcdfb2d7..8bf552baeb 100644
--- a/src/qt/locale/bitcoin_sc.ts
+++ b/src/qt/locale/bitcoin_sc.ts
@@ -46,14 +46,6 @@
<translation type="unfinished">S&amp;ciobera</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Incarreramentu de inviu</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Incarreramentu destinatàriu</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Custus funt is incarreramentu Bitcoin tuus po mandai pagamentus. Càstia sempri sa cantidadi e s'incarreramentu destinatàriu antis de inviais is monedas</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sd.ts b/src/qt/locale/bitcoin_sd.ts
new file mode 100644
index 0000000000..6497eac9fe
--- /dev/null
+++ b/src/qt/locale/bitcoin_sd.ts
@@ -0,0 +1,281 @@
+<TS version="2.1" language="sd">
+<context>
+ <name>AddressBookPage</name>
+ <message>
+ <source>Create a new address</source>
+ <translation type="unfinished">نئون پتو ٺاھيو</translation>
+ </message>
+ <message>
+ <source>&amp;New</source>
+ <translation type="unfinished">نئون</translation>
+ </message>
+ <message>
+ <source>C&amp;hoose</source>
+ <translation type="unfinished">پسند ڪيو</translation>
+ </message>
+ </context>
+<context>
+ <name>AddressTableModel</name>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">پتو</translation>
+ </message>
+ </context>
+<context>
+ <name>QObject</name>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">مقدار</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n second(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n minute(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n hour(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n day(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n week(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n year(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>BitcoinGUI</name>
+ <message>
+ <source>&amp;Send</source>
+ <translation type="unfinished">موڪليو</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation type="unfinished">حاصل ڪيو</translation>
+ </message>
+ <message numerus="yes">
+ <source>Processed %n block(s) of transaction history.</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>%n active connection(s) to Bitcoin network.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>CoinControlDialog</name>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">مقدار</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">تاریخ</translation>
+ </message>
+ </context>
+<context>
+ <name>CreateWalletDialog</name>
+ <message>
+ <source>Create</source>
+ <translation type="unfinished">ٺاھيو</translation>
+ </message>
+ </context>
+<context>
+ <name>FreespaceChecker</name>
+ <message>
+ <source>name</source>
+ <translation type="unfinished">نالو</translation>
+ </message>
+ </context>
+<context>
+ <name>Intro</name>
+ <message>
+ <source>Bitcoin</source>
+ <translation type="unfinished">بٽڪوائن</translation>
+ </message>
+ <message numerus="yes">
+ <source>%n GB of space available</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(of %n GB needed)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(%n GB needed for full chain)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message numerus="yes">
+ <source>(sufficient to restore backups %n day(s) old)</source>
+ <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>Welcome</source>
+ <translation type="unfinished">ڀليڪار</translation>
+ </message>
+ </context>
+<context>
+ <name>ModalOverlay</name>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">لڪايو</translation>
+ </message>
+ </context>
+<context>
+ <name>OptionsDialog</name>
+ <message>
+ <source>Expert</source>
+ <translation type="unfinished">ماھر</translation>
+ </message>
+ </context>
+<context>
+ <name>PSBTOperationsDialog</name>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">يہ</translation>
+ </message>
+ </context>
+<context>
+ <name>PeerTableModel</name>
+ <message>
+ <source>Address</source>
+ <extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
+ <translation type="unfinished">پتو</translation>
+ </message>
+ </context>
+<context>
+ <name>RPCConsole</name>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">نالو</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation type="unfinished">نہ</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation type="unfinished">نامعلوم</translation>
+ </message>
+</context>
+<context>
+ <name>RecentRequestsTableModel</name>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">تاریخ</translation>
+ </message>
+ </context>
+<context>
+ <name>SendCoinsDialog</name>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">لڪايو</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">يہ</translation>
+ </message>
+ <message numerus="yes">
+ <source>Estimated to begin confirmation within %n block(s).</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionDesc</name>
+ <message>
+ <source>Status</source>
+ <translation type="unfinished">حالت</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">تاریخ</translation>
+ </message>
+ <message numerus="yes">
+ <source>matures in %n more block(s)</source>
+ <translation type="unfinished">
+ <numerusform />
+ <numerusform />
+ </translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">مقدار</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionTableModel</name>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">تاریخ</translation>
+ </message>
+ </context>
+<context>
+ <name>TransactionView</name>
+ <message>
+ <source>All</source>
+ <translation type="unfinished">سڀ</translation>
+ </message>
+ <message>
+ <source>Today</source>
+ <translation type="unfinished">اڄ</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">تاریخ</translation>
+ </message>
+ <message>
+ <source>Address</source>
+ <translation type="unfinished">پتو</translation>
+ </message>
+ </context>
+</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_si.ts b/src/qt/locale/bitcoin_si.ts
index d789e2a04c..5206b23486 100644
--- a/src/qt/locale/bitcoin_si.ts
+++ b/src/qt/locale/bitcoin_si.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">ලිපිනය හෝ නම්පත සංශෝධනයට දකුණු බොත්තම ඔබන්න</translation>
+ <translation type="unfinished">ලිපිනය හෝ ලේබලය සංස්කරණය කිරීමට දකුණු-ක්ලික් කරන්න</translation>
</message>
<message>
<source>Create a new address</source>
@@ -58,14 +58,6 @@
<translation type="unfinished">තෝ&amp;රන්න</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">යවන ලිපින</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">ලැබෙන ලිපින</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">මේ ඔබගේ ගෙවීම් යැවීම සඳහා වන බිට්කොයින් ලිපින වේ. කාසි යැවීමට පෙර සෑම විටම මුදල සහ ලැබීමේ ලිපිනය පරීක්‍ෂා කරන්න.</translation>
</message>
@@ -620,14 +612,6 @@
<translation type="unfinished">බයිට පිටපත් කරන්න</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ඔව්</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">නැත</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(නම්පතක් නැත)</translation>
</message>
@@ -891,10 +875,6 @@
<translation type="unfinished">අතරු මුහුණතේ &amp;භාෂාව:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">එබ්බවූ "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;හරි</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sk.ts b/src/qt/locale/bitcoin_sk.ts
index 55c6f97e99..d0e8b11fe8 100644
--- a/src/qt/locale/bitcoin_sk.ts
+++ b/src/qt/locale/bitcoin_sk.ts
@@ -50,14 +50,6 @@
<translation type="unfinished">Vy&amp;brať</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Odosielajúce adresy</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Prijímajúce adresy</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Toto sú Vaše Bitcoin adresy pre posielanie platieb. Vždy skontrolujte sumu a prijímaciu adresu pred poslaním mincí.</translation>
</message>
@@ -215,10 +207,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Zadané heslo pre dešifrovanie peňaženky bolo nesprávne.</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">Zadaná prístupová fráza na dešifrovanie peňaženky je nesprávna. Obsahuje nulový znak (tj - bajt s hodnotou nula). Ak bola prístupová fráza nastavená verziou tohto softvéru pred verziou 25.0, skúste to znova s použitím iba znakov až po — ale nezahrňujúc — prvý nulový znak. Ak sa vám to podarí, prosím nastavte novú prístupovú frázu, aby ste tomuto problému predišli v budúcnosti.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Heslo k peňaženke bolo úspešne zmenené.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Zmena prístupovej frázy zlyhala</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">Stará prístupová fráza zadaná na dešifrovanie peňaženky je nesprávna. Obsahuje nulový znak (tj - bajt s hodnotou nula). Ak bola prístupová fráza nastavená verziou tohto softvéru pred verziou 25.0, skúste to znova s použitím iba znakov až po — ale nezahrňujúc — prvý nulový znak.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Upozornenie: Máte zapnutý Caps Lock!</translation>
</message>
@@ -237,6 +241,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">Súbor s nastaveniami %1 môže byť poškodený alebo neplatný.</translation>
+ </message>
+ <message>
<source>Runaway exception</source>
<translation type="unfinished">Nezachytená výnimka</translation>
</message>
@@ -660,6 +668,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Zatvoriť peňaženku</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Obnoviť peňaženku…</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Obnoviť peňaženku zo zálohovaného súboru</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Zatvoriť všetky peňaženky</translation>
</message>
@@ -689,6 +707,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Dáta peňaženky</translation>
</message>
<message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Načítať zálohu peňaženky</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Obnoviť peňaženku</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Názov peňaženky</translation>
@@ -747,6 +775,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Povoliť sieťovú aktivitu</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Predbežná synchronizácia hlavičiek (%1%)…</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Chyba: %1</translation>
</message>
@@ -853,10 +885,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Poplatok:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Prach:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Po poplatku:</translation>
</message>
@@ -945,10 +973,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopírovať bajty</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopírovať prach</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopírovať zmenu</translation>
</message>
@@ -957,18 +981,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 zamknutých)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">áno</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">nie</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Tento popis sčervenie ak ktorýkoľvek príjemca dostane sumu menšiu ako súčasný limit pre "prach".</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Môže sa líšiť o +/- %1 satoshi(s) pre každý vstup.</translation>
</message>
@@ -1009,7 +1021,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Can't list signers</source>
<translation type="unfinished">Nemôžem zobraziť podpisovateľov</translation>
</message>
- </context>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">Bolo nájdených príliš veľa externých podpisovateľov</translation>
+ </message>
+</context>
<context>
<name>LoadWalletsActivity</name>
<message>
@@ -1049,6 +1065,29 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Obnoviť peňaženku</translation>
+ </message>
+ <message>
+ <source>Restore wallet failed</source>
+ <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
+ <translation type="unfinished">Obnovenie peňaženky zlyhalo</translation>
+ </message>
+ <message>
+ <source>Restore wallet warning</source>
+ <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
+ <translation type="unfinished">Varovanie pri obnovovaní peňaženky</translation>
+ </message>
+ <message>
+ <source>Restore wallet message</source>
+ <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
+ <translation type="unfinished">Správa o obnovení peňaženky</translation>
+ </message>
+</context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1114,14 +1153,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Vytvoriť prázdnu peňaženku</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Na správu scriptPubKey používajte deskriptory</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Peňaženka deskriptora</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Použiť externé podpisovacie zariadenie ako napr. hardvérová peňaženka. Nastavte najprv externý skript podpisovateľa v nastaveniach peňaženky.</translation>
</message>
@@ -1134,10 +1165,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Vytvoriť</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Zostavené bez podpory sqlite (povinné pre peňaženky deskriptorov)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Skompilované bez podpory externého podpisovania (potrebné pre externé podpisovanie)</translation>
@@ -1657,18 +1684,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Použiť samostatný SOCKS&amp;5 proxy server na nadviazanie spojenia s peer-mi cez službu Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Písmo s pevnou šírkou na karte Prehľad:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">zabudovaný "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">najbližší zodpovedajúci "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Zrušiť</translation>
</message>
@@ -1890,8 +1905,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT bola uložená na disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Pošle %1 do %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">vlastná adresa</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2175,6 +2190,10 @@ Ak ste dostali túto chybu mali by ste požiadať obchodníka o URI kompatibiln
<translation type="unfinished">Verzia</translation>
</message>
<message>
+ <source>Whether we relay transactions to this peer.</source>
+ <translation type="unfinished">Či preposielame transakcie tomuto uzlu.</translation>
+ </message>
+ <message>
<source>Starting Block</source>
<translation type="unfinished">Počiatočný blok</translation>
</message>
@@ -2209,6 +2228,16 @@ Ak ste dostali túto chybu mali by ste požiadať obchodníka o URI kompatibiln
<translation type="unfinished">Postupovanie adries</translation>
</message>
<message>
+ <source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
+ <extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
+ <translation type="unfinished">Celkový počet adries prijatých od tohto uzlu, ktoré boli spracované (neobsahuje adresy, ktoré boli zrušené kvôli obmedzeniu rýchlosti).</translation>
+ </message>
+ <message>
+ <source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
+ <extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
+ <translation type="unfinished">Celkový počet adries prijatých od tohto uzlu, ktoré boli zrušené (nespracované) kvôli obmedzeniu rýchlosti.</translation>
+ </message>
+ <message>
<source>Addresses Processed</source>
<extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
<translation type="unfinished">Spracované adresy</translation>
@@ -2589,6 +2618,10 @@ Pre viac informácií o používaní tejto konzoly napíšte %6.
<translation type="unfinished">Kopírovať &amp;sumu</translation>
</message>
<message>
+ <source>Not recommended due to higher fees and less protection against typos.</source>
+ <translation type="unfinished">Nie je odporúčané kvôli vyšším poplatkom a menšej ochrane proti preklepom.</translation>
+ </message>
+ <message>
<source>Could not unlock wallet.</source>
<translation type="unfinished">Nepodarilo sa odomknúť peňaženku.</translation>
</message>
@@ -2778,10 +2811,6 @@ Pre viac informácií o používaní tejto konzoly napíšte %6.
<translation type="unfinished">Vstupy…</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Prach:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Zvoliť…</translation>
</message>
@@ -2858,10 +2887,6 @@ Poznámka: Keďže poplatok je počítaný za bajt, poplatok pri sadzbe "100 sat
<translation type="unfinished">Kopírovať bajty</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopírovať prach</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopírovať zmenu</translation>
</message>
@@ -2892,10 +2917,6 @@ Poznámka: Keďže poplatok je počítaný za bajt, poplatok pri sadzbe "100 sat
<translation type="unfinished">Vytvorí čiastočne podpísanú Bitcoin transakciu (Partially Signed Bitcoin Transaction - PSBT) na použitie napríklad s offline %1 peňaženkou alebo v hardvérovej peňaženke kompatibilnej s PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> z peňaženky '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 do '%2'</translation>
</message>
@@ -3391,10 +3412,6 @@ Poznámka: Keďže poplatok je počítaný za bajt, poplatok pri sadzbe "100 sat
<translation type="unfinished">Index výstupu</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certifikát nebol overený)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Kupec</translation>
</message>
@@ -3493,10 +3510,6 @@ Poznámka: Keďže poplatok je počítaný za bajt, poplatok pri sadzbe "100 sat
<translation type="unfinished">Odoslané na</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Platba sebe samému</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Vyťažené</translation>
</message>
@@ -3568,10 +3581,6 @@ Poznámka: Keďže poplatok je počítaný za bajt, poplatok pri sadzbe "100 sat
<translation type="unfinished">Odoslané na</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Ku mne</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Vyťažené</translation>
</message>
@@ -3864,8 +3873,8 @@ Choďte do Súbor &gt; Otvoriť Peňaženku, pre načítanie peňaženky.
<translation type="unfinished">Distribuované pod softvérovou licenciou MIT, pozri sprievodný súbor %s alebo %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Nastala chyba pri čítaní súboru %s! Všetkz kľúče sa prečítali správne, ale dáta o transakcíách alebo záznamy v adresári môžu chýbať alebo byť nesprávne.</translation>
+ <source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
+ <translation type="unfinished">Chyba pri načítavaní peňaženky. Peňaženka vyžaduje stiahnutie blokov, a softvér momentálne nepodporuje načítavanie peňaženiek počas sťahovania blokov v nesprávnom poradí pri použití snímok assumeutxo. Peňaženka by mala byť schopná sa úspešne načítať, keď synchronizácia uzlov dosiahne výšku %s</translation>
</message>
<message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
@@ -3888,6 +3897,10 @@ Choďte do Súbor &gt; Otvoriť Peňaženku, pre načítanie peňaženky.
<translation type="unfinished">Chyba: Staršie peňaženky podporujú len adresy typu "legacy", "p2sh-segwit", a "bech32"</translation>
</message>
<message>
+ <source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
+ <translation type="unfinished">Chyba: Nie je možné vytvoriť deskriptory pre túto staršiu peňaženku. Nezabudnite zadať prístupovú frázu peňaženky, ak je šifrovaná.</translation>
+ </message>
+ <message>
<source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
<translation type="unfinished">Súbor %s už existuje. Ak si nie ste istý, že toto chcete, presuňte ho najprv preč.</translation>
</message>
@@ -3936,10 +3949,6 @@ Choďte do Súbor &gt; Otvoriť Peňaženku, pre načítanie peňaženky.
<translation type="unfinished">Databáza blokov obsahuje blok, ktorý vyzerá byť z budúcnosti. Toto môže byť spôsobené nesprávnym systémovým časom vášho počítača. Obnovujte databázu blokov len keď ste si istý, že systémový čas je nastavený správne.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">Databáza indexov blokov obsahuje 'txindex' staršieho typu. Pre uvoľnenie obsadeného miesta spustite s parametrom -reindex, inak môžete ignorovať túto chybu. Táto správa sa už nabudúce nezobrazí.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Suma je príliš malá pre odoslanie transakcie</translation>
</message>
@@ -3976,6 +3985,14 @@ Choďte do Súbor &gt; Otvoriť Peňaženku, pre načítanie peňaženky.
<translation type="unfinished">Poskytnutý neznámy formát peňaženky "%s". Prosím použite "bdb" alebo "sqlite".</translation>
</message>
<message>
+ <source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
+ <translation type="unfinished">Nájdený nepodporovaný formát databázy reťazcového stavu. Prosím reštartujte s -reindex-chainstate. Toto obnoví databázu reťazcového stavu.</translation>
+ </message>
+ <message>
+ <source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
+ <translation type="unfinished">Peňaženka bola úspešne vytvorená. Starší typ peňaženky sa postupne ruší a podpora pre vytváranie a otváranie starších peňaženiek bude v budúcnosti odstránená.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Varovanie: Formát peňaženky súboru dumpu "%s" nesúhlasí s formátom zadaným na príkazovom riadku "%s".</translation>
</message>
@@ -4024,8 +4041,8 @@ Choďte do Súbor &gt; Otvoriť Peňaženku, pre načítanie peňaženky.
<translation type="unfinished">Nie je možné zapísať do adresára ' %s'. Skontrolujte povolenia.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">Upgrade -txindex spustený predchádzajúcou verziou nemôže byť dokončený. Reštartujte s prechdádzajúcou verziou programu alebo spustite s parametrom -reindex.</translation>
+ <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">%s je nastavené veľmi vysoko! Takto vysoké poplatky by mohli byť zaplatené za jednu transakciu.</translation>
</message>
<message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
@@ -4036,10 +4053,36 @@ Choďte do Súbor &gt; Otvoriť Peňaženku, pre načítanie peňaženky.
<translation type="unfinished">Chyba pri načítaní %s: Načíta sa peňaženka s externým podpisovaním, ale podpora pre externé podpisovanie nebola začlenená do programu</translation>
</message>
<message>
+ <source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
+ <translation type="unfinished">Chyba: Dáta adresára v peňaženke nemožno identifikovať ako patriace migrovaným peňaženkám</translation>
+ </message>
+ <message>
+ <source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
+ <translation type="unfinished">Chyba: Počas migrácie boli vytvorené duplicitné deskriptory. Vaša peňaženka môže byť poškodená.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Nepodarilo sa premenovať chybný súbor peers.dat. Prosím presuňte ho alebo vymažte a skúste znovu.</translation>
</message>
<message>
+ <source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
+ <translation type="unfinished">Celková suma vopred vybraných mincí nepokrýva cieľ transakcie. Prosím, povoľte, aby boli automaticky vybrané iné vstupy alebo pridajte viac mincí manuálne</translation>
+ </message>
+ <message>
+ <source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
+ <translation type="unfinished">Nepotvrdené UTXO sú k dispozícii, ale ich použitie vytvorí reťazec transakcií, ktoré mempool odmietne</translation>
+ </message>
+ <message>
+ <source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
+
+The wallet might have been tampered with or created with malicious intent.
+</source>
+ <translation type="unfinished">Nájdený neočakávaný starý záznam v deskriptorovej peňaženke. Načítavanie peňaženky %s
+
+S peňaženkou mohlo byť manipulované alebo mohla byť vytvorená s úmyselne škodlivým zámerom
+</translation>
+ </message>
+ <message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
<translation type="unfinished">Nastavenie konfigurácie pre %s platí iba v sieti %s a v sekcii [%s].</translation>
</message>
@@ -4212,6 +4255,10 @@ Choďte do Súbor &gt; Otvoriť Peňaženku, pre načítanie peňaženky.
<translation type="unfinished">Neplatné oprávnenie P2P: '%s'</translation>
</message>
<message>
+ <source>Invalid amount for %s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">Neplatné množstvo pre %s=&lt;amount&gt;: '%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
<translation type="unfinished">Neplatná suma pre -%s=&lt;amount&gt;: '%s'</translation>
</message>
@@ -4220,6 +4267,10 @@ Choďte do Súbor &gt; Otvoriť Peňaženku, pre načítanie peňaženky.
<translation type="unfinished">Nadaná neplatná netmask vo -whitelist: '%s'</translation>
</message>
<message>
+ <source>Invalid port specified in %s: '%s'</source>
+ <translation type="unfinished">Bol zadaný neplatný port v %s: '%s'</translation>
+ </message>
+ <message>
<source>Loading P2P addresses…</source>
<translation type="unfinished">Načítavam P2P adresy…</translation>
</message>
@@ -4364,10 +4415,6 @@ Choďte do Súbor &gt; Otvoriť Peňaženku, pre načítanie peňaženky.
<translation type="unfinished">Výstupný index transakcie zmeny je mimo rozsahu</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakcia má v transakčnom zásobníku príliš dlhý reťazec</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcia musí mať aspoň jedného príjemcu</translation>
</message>
@@ -4412,6 +4459,10 @@ Choďte do Súbor &gt; Otvoriť Peňaženku, pre načítanie peňaženky.
<translation type="unfinished">Nepodarilo sa spustiť HTTP server. Pre viac detailov zobrazte debug log.</translation>
</message>
<message>
+ <source>Unable to unload the wallet before migrating</source>
+ <translation type="unfinished">Nepodarilo sa odpojiť peňaženku pred migráciou</translation>
+ </message>
+ <message>
<source>Unknown -blockfilterindex value %s.</source>
<translation type="unfinished">Neznáma -blockfilterindex hodnota %s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sl.ts b/src/qt/locale/bitcoin_sl.ts
index 2d45a6f7dd..ceae34b731 100644
--- a/src/qt/locale/bitcoin_sl.ts
+++ b/src/qt/locale/bitcoin_sl.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Izberi</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Imenik naslovov za pošiljanje</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Imenik prejemnih naslovov</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">To so vaši bitcoin-naslovi za pošiljanje. Pred pošiljanjem vedno preverite znesek in prejemnikov naslov.</translation>
</message>
@@ -696,18 +688,6 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">O&amp;kno</translation>
</message>
<message>
- <source>Zoom</source>
- <translation type="unfinished">Povečava</translation>
- </message>
- <message>
- <source>Main Window</source>
- <translation type="unfinished">Glavno okno</translation>
- </message>
- <message>
- <source>%1 client</source>
- <translation type="unfinished">Odjemalec %1</translation>
- </message>
- <message>
<source>&amp;Hide</source>
<translation type="unfinished">&amp;Skrij</translation>
</message>
@@ -856,10 +836,6 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Provizija:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Prah:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Po proviziji:</translation>
</message>
@@ -948,30 +924,10 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Kopiraj bajte</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiraj prah</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiraj vračilo</translation>
</message>
<message>
- <source>(%1 locked)</source>
- <translation type="unfinished">(%1 zaklenjeno)</translation>
- </message>
- <message>
- <source>yes</source>
- <translation type="unfinished">da</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ne</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ta oznaka postane rdeča, če kateri od prejemnikov prejme znesek, nižji od trenutne meje prahu.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Lahko se razlikuje za +/- %1 sat na vhod.</translation>
</message>
@@ -1149,14 +1105,6 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Ustvari prazno denarnico</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Uporabi deskriptorje za upravljanje s scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Denarnica z deskriptorji</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Za podpisovanje uporabite zunanjo napravo, kot je n.pr. hardverska denarnica. Najprej nastavite zunanjega podpisnika v nastavitvah denarnice.</translation>
</message>
@@ -1169,10 +1117,6 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Ustvari</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Prevedeno brez podpore za SQLite (potrebna za deskriptorske denarnice)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Prevedeno brez podpore za zunanje podpisovanje</translation>
@@ -1320,6 +1264,10 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Napaka: Ni mogoče ustvariti mape "%1".</translation>
</message>
<message>
+ <source>Error</source>
+ <translation type="unfinished">Napaka</translation>
+ </message>
+ <message>
<source>Welcome</source>
<translation type="unfinished">Dobrodošli</translation>
</message>
@@ -1720,18 +1668,6 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">Uporabi ločen posredniški strežik SOCKS5 za povezavo s soležniki prek storitev onion (Tor):</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Pisava enakomerne širine v zavihku Pregled:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">vdelan "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">najboljše ujemanje "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;V redu</translation>
</message>
@@ -1973,8 +1909,8 @@ Podpisovanje je možno le s podedovanimi ("legacy") naslovi.</translation>
<translation type="unfinished">DPBT shranjena na disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Pošlje %1 na %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">lasten naslov</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2899,10 +2835,6 @@ Za več informacij glede uporabe konzole uporabite ukaz %6.
<translation type="unfinished">Vhodi ...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Prah:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Izberi ...</translation>
</message>
@@ -2979,10 +2911,6 @@ Opomba: Ker se provizija izračuna na bajt, bi provizija "100 satoshijev na kvB"
<translation type="unfinished">Kopiraj bajte</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiraj prah</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiraj vračilo</translation>
</message>
@@ -3013,10 +2941,6 @@ Opomba: Ker se provizija izračuna na bajt, bi provizija "100 satoshijev na kvB"
<translation type="unfinished">Ustvari delno podpisano bitcoin-transakcijo (DPBT, angl. PSBT), ki jo lahko kopirate in potem podpišete n.pr. z nepovezano (offline) %1 denarnico ali pa s hardversko denarnico, ki podpira DPBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished"> iz denarnice '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 v '%2'</translation>
</message>
@@ -3538,10 +3462,6 @@ Opomba: Ker se provizija izračuna na bajt, bi provizija "100 satoshijev na kvB"
<translation type="unfinished">Indeks izhoda</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certifikat ni bil preverjen)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Trgovec</translation>
</message>
@@ -3640,10 +3560,6 @@ Opomba: Ker se provizija izračuna na bajt, bi provizija "100 satoshijev na kvB"
<translation type="unfinished">Poslano na </translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Plačilo sebi</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Narudarjeno</translation>
</message>
@@ -3719,10 +3635,6 @@ Opomba: Ker se provizija izračuna na bajt, bi provizija "100 satoshijev na kvB"
<translation type="unfinished">Poslano na </translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Sebi</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Narudarjeno</translation>
</message>
@@ -4024,10 +3936,6 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<translation type="unfinished">Distribuirano v okviru programske licence MIT. Podrobnosti so navedene v priloženi datoteki %s ali %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Napaka pri branju %s! Vsi ključi so bili prebrani pravilno, vendar so lahko vnosi o transakcijah ali vnosi naslovov nepravilni ali manjkajo.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Napaka pri branju %s! Podatki o transakciji morda manjkajo ali pa so napačni. Ponovno prečitavam denarnico.</translation>
</message>
@@ -4104,10 +4012,6 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<translation type="unfinished">Baza podatkov blokov vsebuje blok, ki naj bi bil iz prihodnosti. To je lahko posledica napačne nastavitve datuma in časa vašega računalnika. Znova zgradite bazo podatkov samo, če ste prepričani, da sta datum in čas računalnika pravilna.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">Baza kazala blokov vsebuje zastarel 'txindex'. Če želite sprostiti zasedeni prostor na disku, zaženite poln -reindex, sicer pa prezrite to napako. To sporočilo o napaki se ne bo več prikazalo.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Znesek transakcije po odbitku provizije je premajhen za pošiljanje.</translation>
</message>
@@ -4196,22 +4100,6 @@ Za odpiranje denarnice kliknite Datoteka &gt; Odpri denarnico
<translation type="unfinished">Nastavitev -peerblockfilters ni veljavna brez nastavitve -blockfilterindex.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">Nadgradnja -txindex je bila začeta s prejšnjo različico programske opreme in je ni mogoče dokončati. Poskusite ponovno s prejšnjo različico ali pa zaženite poln -reindex.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Možnost -reindex-chainstate ni združljiva z -blockfilterindex. Prosimo, ali začasno onemogočite blockfilterindex in uporabite -reindex-chainstate ali pa namesto reindex-chainstate uporabite -reindex za popolno ponovno tvorbo vseh kazal.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Možnost -reindex-chainstate option ni združljiva z -coinstatsindex. Prosimo, ali začasno onemogočite coinstatsindex in uporabite -reindex-chainstate ali pa namesto reindex-chainstate uporabite -reindex za popolno ponovno tvorbo vseh kazal.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Možnost -reindex-chainstate option ni združljiva s -txindex. Prosimo, ali začasno onemogočite txindex in uporabite -reindex-chainstate ali pa namesto reindex-chainstate uporabite -reindex za popolno ponovno tvorbo vseh kazal.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Nezdružljivi nastavitvi: navedene so specifične povezave in hkrati se uporablja addrman za iskanje izhodnih povezav.</translation>
</message>
@@ -4332,14 +4220,6 @@ Obnovitev varnostne kopije denarnice ni bila mogoča.</translation>
<translation type="unfinished">Napaka pri branju naslednjega zapisa v podatkovni bazi denarnice.</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Napaka: dodajanje opazovane transakcije v opazovano denarnico je spodletelo</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Napaka: brisanje opazovanih transakcij je spodletelo</translation>
- </message>
- <message>
<source>Error: Couldn't create cursor into database</source>
<translation type="unfinished">Napaka: ne morem ustvariti kurzorja v bazo</translation>
</message>
@@ -4376,10 +4256,6 @@ Obnovitev varnostne kopije denarnice ni bila mogoča.</translation>
<translation type="unfinished">Napaka: na voljo ni nobenega naslova '%s'</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Napaka: nekaterih opazovanih transakcij ni bilo mogoče izbrisati</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Napaka: ta denarnica že uporablja SQLite</translation>
</message>
@@ -4620,10 +4496,6 @@ Obnovitev varnostne kopije denarnice ni bila mogoča.</translation>
<translation type="unfinished">Indeks izhoda vračila je izven obsega.</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transakcija je del predolge verige nepotrjenih transakcij</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transakcija mora imeti vsaj enega prejemnika.</translation>
</message>
@@ -4676,6 +4548,10 @@ Obnovitev varnostne kopije denarnice ni bila mogoča.</translation>
<translation type="unfinished">Zagon HTTP strežnika neuspešen. Poglejte razhroščevalni dnevnik za podrobnosti (debug.log).</translation>
</message>
<message>
+ <source>Unable to unload the wallet before migrating</source>
+ <translation type="unfinished">Zapiranje denarnice pred migracijo ni uspelo</translation>
+ </message>
+ <message>
<source>Unknown -blockfilterindex value %s.</source>
<translation type="unfinished">Neznana vrednost -blockfilterindex %s.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sn.ts b/src/qt/locale/bitcoin_sn.ts
index 40abe38b4e..bfdb6c951b 100644
--- a/src/qt/locale/bitcoin_sn.ts
+++ b/src/qt/locale/bitcoin_sn.ts
@@ -22,14 +22,6 @@
<translation type="unfinished">Dzima</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Makero ekutumira</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Makero ekutambira</translation>
- </message>
- <message>
<source>&amp;Copy Address</source>
<translation type="unfinished">Kopera Kero</translation>
</message>
diff --git a/src/qt/locale/bitcoin_so.ts b/src/qt/locale/bitcoin_so.ts
index 27a41f2440..48c02c1fa2 100644
--- a/src/qt/locale/bitcoin_so.ts
+++ b/src/qt/locale/bitcoin_so.ts
@@ -3,23 +3,23 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Fadlan garaaci Midig ku dhufo si aad u saxdo ciwaanka ama sumadda.</translation>
+ <translation type="unfinished">Xaq-click si aad cinwaanka edit ama qoraalka</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Fadhlan samee cinwaan cusub.</translation>
+ <translation type="unfinished">Abuur cinwaan cusub</translation>
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">Maqal</translation>
+ <translation type="unfinished">&amp;Hormarin</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Ka akhriso cinwaan aad xaqiijinaysay si aad u ku koobid natiijada isticmaalka ee nidaamka</translation>
+ <translation type="unfinished">Nuqul ka dhig cinwaanka hadda la soo xulay ee clipboard system</translation>
</message>
<message>
<source>&amp;Copy</source>
- <translation type="unfinished">&amp;Fidi </translation>
+ <translation type="unfinished">&amp;Nuqul</translation>
</message>
<message>
<source>C&amp;lose</source>
@@ -58,14 +58,6 @@
<translation type="unfinished">C&amp;Aagga</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Cinwaanada dirista</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Cinwaanada qaabilaadda</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Kuwani waa cinwaanada Seeraar aad ku direyso lacagaha. Marwalba caddadka ama cinwaanka laga soo hubiyo inta aadan dirin lacagta qadaadiicda ah ka hor inta aadan dirin.</translation>
</message>
@@ -84,9 +76,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">Liiska Cinwaanka Dhoofinta
-
-</translation>
+ <translation type="unfinished">Liiska Cinwaanka Dhoofinta</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -150,7 +140,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">Digniin: Haddii aad qarisid jeebkaaga oo aad lumiso ereyga Passphrase, waxaad 1LOSE DOONAA DHAMMAAN BITCOINS1!</translation>
+ <translation type="unfinished">Digniin: Haddii aad jeebka jeebkaaga qarisid, Oo aad lumiso ereygii,Adigaa sameyn doontaa&lt;b&gt;Lumin oo dhan BITCOINS AAD&lt;/b&gt;!</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
diff --git a/src/qt/locale/bitcoin_sq.ts b/src/qt/locale/bitcoin_sq.ts
index fc6e79a5b3..8649fd6a97 100644
--- a/src/qt/locale/bitcoin_sq.ts
+++ b/src/qt/locale/bitcoin_sq.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">Zgjidh</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Duke derguar adresen</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Duke marr adresen</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Këto janë Bitcoin adresat e juaja për të dërguar pagesa. Gjithmon kontrolloni shumën dhe adresën pranuese para se të dërgoni monedha.</translation>
</message>
@@ -399,14 +391,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Data</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">po</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">jo</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(pa etiketë)</translation>
</message>
@@ -763,10 +747,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Dërguar drejt</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Pagesë ndaj vetvetes</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Minuar</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sr.ts b/src/qt/locale/bitcoin_sr.ts
index 12e063c3d6..5646cf7938 100644
--- a/src/qt/locale/bitcoin_sr.ts
+++ b/src/qt/locale/bitcoin_sr.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Одабери</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Адресе за слање</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Адресе за примање</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ово су твоје Биткоин адресе за слање уплата. Увек добро провери износ и адресу на коју шаљеш пре него што пошаљеш уплату.</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Десила се грешка приликом покушаја да се листа адреса сачува на %1. Молимо покушајте поново.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Адресе за слање - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Адресе за примање - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Извоз Неуспешан</translation>
</message>
@@ -274,6 +274,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Da li želiš da poništiš podešavanja na početne vrednosti, ili da prekineš bez promena?</translation>
</message>
<message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">Догодила се фатална грешка. Проверите да ли је могуће уписивати у "settings" фајл или покушајте да покренете са "-nosettings".</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Грешка: %1</translation>
</message>
@@ -669,10 +674,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Затвори новчаник</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Поврати Новчаник...</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Затвори све новчанике</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Пренеси новчаник</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Прикажи поруку помоћи %1 за листу са могућим опцијама Биткоин командне линије</translation>
</message>
@@ -693,6 +711,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Нема доступних новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Име Новчаника</translation>
@@ -853,10 +881,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Провизија:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Прашина:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Након накнаде:</translation>
</message>
@@ -941,10 +965,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Копирај бајтове</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копирај прашину</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Копирај кусур</translation>
</message>
@@ -953,18 +973,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 закључан)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">да</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">не</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ознака постаје црвена уколико прималац прими износ мањи од износа прашине - сићушног износа.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Може варирати +/- %1 сатоши(ја) по инпуту.</translation>
</message>
@@ -1015,6 +1023,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1040,6 +1055,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1105,14 +1128,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Направи Празан Новчаник</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Користите дескрипторе за управљање сцриптПубКеи-ом</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Дескриптор Новчаник</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Користите спољни уређај за потписивање као што је хардверски новчаник. Прво конфигуришите скрипту спољног потписника у подешавањима новчаника.
</translation>
@@ -1126,10 +1141,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Направи</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Састављено без склите подршке (потребно за новчанике дескриптора)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Састављено без подршке за спољно потписивање (потребно за спољно потписивање)</translation>
@@ -1626,18 +1637,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Користите посебан СОЦКС&amp;5 прокси да бисте дошли до вршњака преко услуга Тор онион:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Једноразредни фонт на картици Преглед:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">уграђено ”%1”</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">Најближа сличност ”%1”</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Уреду</translation>
</message>
@@ -1859,8 +1858,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ПСБТ је сачуван на диску.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">*Шаље %1 до %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">сопствена адреса</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2705,10 +2704,6 @@ For more information on using this console, type %6.
<translation type="unfinished">Поља...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Прашина:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Одабери...</translation>
</message>
@@ -2785,10 +2780,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Копирај бајтове</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копирај прашину</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Копирај кусур</translation>
</message>
@@ -2819,10 +2810,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Креира делимично потписану Биткоин трансакцију (PSBT) за коришћење са нпр. офлајн %1 новчаником, или PSBT компатибилним хардверским новчаником. </translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">из новчаника '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 до '%2'</translation>
</message>
@@ -3307,10 +3294,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Излазни индекс</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Сертификат још није проверен)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Трговац</translation>
</message>
@@ -3409,10 +3392,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Послат ка</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Уплата самом себи</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Рударено</translation>
</message>
@@ -3484,10 +3463,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Послат ка</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Теби</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Рударено</translation>
</message>
@@ -3703,6 +3678,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Резервна копија новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
<source>Backup Failed</source>
<translation type="unfinished">Резервна копија није успела</translation>
</message>
@@ -3738,10 +3718,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Дистрибуирано под MIT софтверском лиценцом, погледајте придружени документ %s или %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Грешка у читању %s! Сви кључеви су прочитани коректно, али подаци о трансакцији или уноси у адресар могу недостајати или бити нетачни.</translation>
- </message>
- <message>
<source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
<translation type="unfinished">Молим проверите да су време и датум на вашем рачунару тачни. Уколико је сат нетачан, %s неће радити исправно.</translation>
</message>
@@ -4002,10 +3978,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Износ трансакције не може бити негативан</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Трансакција има предугачак ланац у удруженој меморији</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Трансакција мора имати бар једног примаоца</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sr@ijekavianlatin.ts b/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
index 18bd455b5f..a10aa71c10 100644
--- a/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
+++ b/src/qt/locale/bitcoin_sr@ijekavianlatin.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">I&amp;zaberi</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Адресе за слање</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adresa na koju se prima</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ово су твоје Биткоин адресе за слање уплата. Увек добро провери износ и адресу на коју шаљеш пре него што пошаљеш уплату.</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Десила се грешка приликом покушаја да се листа адреса сачува на %1. Молимо покушајте поново.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Адреса пошиљаоца - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Адресе за примање - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Извоз Неуспешан</translation>
</message>
@@ -270,6 +270,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Da li želiš da poništiš podešavanja na početne vrednosti, ili da prekineš bez promena?</translation>
</message>
<message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">Догодила се фатална грешка. Проверите да ли је могуће уписивати у "settings" фајл или покушајте да покренете са "-nosettings".</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Greška: %1</translation>
</message>
@@ -665,10 +670,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Затвори новчаник</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Поврати новчаник...</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Затвори све новчанике</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Пренеси новчаник</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Прикажи поруку помоћи %1 за листу са могућим опцијама Биткоин командне линије</translation>
</message>
@@ -689,6 +707,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Нема доступних новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Име Новчаника</translation>
@@ -849,10 +877,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Naknada:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Прашина:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Након накнаде:</translation>
</message>
@@ -937,10 +961,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Копирај бајтове</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копирај прашину</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Копирај кусур</translation>
</message>
@@ -949,18 +969,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 закључан)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">да</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">не</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ознака постаје црвена уколико прималац прими износ мањи од износа прашине - сићушног износа.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Може варирати +/- %1 сатоши(ја) по инпуту.</translation>
</message>
@@ -1011,6 +1019,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1036,6 +1051,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1101,14 +1124,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Направи Празан Новчаник</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Користите дескрипторе за управљање сцриптПубКеи-ом</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Дескриптор Новчаник</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Користите спољни уређај за потписивање као што је хардверски новчаник. Прво конфигуришите скрипту спољног потписника у подешавањима новчаника.
</translation>
@@ -1122,10 +1137,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Направи</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Састављено без склите подршке (потребно за новчанике дескриптора)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Састављено без подршке за спољно потписивање (потребно за спољно потписивање)</translation>
@@ -1270,7 +1281,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Greska</translation>
+ <translation type="unfinished">Грешка</translation>
</message>
<message>
<source>Welcome</source>
@@ -1622,18 +1633,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Користите посебан СОЦКС&amp;5 прокси да бисте дошли до вршњака преко услуга Тор онион:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Једноразредни фонт на картици Преглед:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">уграђено ”%1”</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">Најближа сличност ”%1”</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Уреду</translation>
</message>
@@ -1689,7 +1688,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Greska</translation>
+ <translation type="unfinished">Грешка</translation>
</message>
<message>
<source>The configuration file could not be opened.</source>
@@ -1855,8 +1854,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ПСБТ је сачуван на диску.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">*Шаље %1 до %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">сопствена адреса</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2701,10 +2700,6 @@ For more information on using this console, type %6.
<translation type="unfinished">Поља...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Прашина:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Одабери...</translation>
</message>
@@ -2781,10 +2776,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Копирај бајтове</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копирај прашину</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Копирај кусур</translation>
</message>
@@ -2815,10 +2806,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Креира делимично потписану Биткоин трансакцију (PSBT) за коришћење са нпр. офлајн %1 новчаником, или PSBT компатибилним хардверским новчаником. </translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">из новчаника '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 до '%2'</translation>
</message>
@@ -3303,10 +3290,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Излазни индекс</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Сертификат још није проверен)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Trgovac</translation>
</message>
@@ -3405,10 +3388,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Poslat</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Уплата самом себи</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Рударено</translation>
</message>
@@ -3480,10 +3459,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Poslat</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Теби</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Рударено</translation>
</message>
@@ -3601,11 +3576,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<name>WalletFrame</name>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Napravi novi novčanik</translation>
+ <translation type="unfinished">Направи нови ночаник</translation>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Greska</translation>
+ <translation type="unfinished">Грешка</translation>
</message>
<message>
<source>Unable to decode PSBT from clipboard (invalid base64)</source>
@@ -3699,6 +3674,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Резервна копија новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
<source>Backup Failed</source>
<translation type="unfinished">Резервна копија није успела</translation>
</message>
@@ -3734,10 +3714,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Дистрибуирано под MIT софтверском лиценцом, погледајте придружени документ %s или %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Грешка у читању %s! Сви кључеви су прочитани коректно, али подаци о трансакцији или уноси у адресар могу недостајати или бити нетачни.</translation>
- </message>
- <message>
<source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
<translation type="unfinished">Молим проверите да су време и датум на вашем рачунару тачни. Уколико је сат нетачан, %s неће радити исправно.</translation>
</message>
@@ -3998,10 +3974,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Износ трансакције не може бити негативан</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Трансакција има предугачак ланац у удруженој меморији</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Трансакција мора имати бар једног примаоца</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sr@latin.ts b/src/qt/locale/bitcoin_sr@latin.ts
index 4cb359fb19..c7b80f3b02 100644
--- a/src/qt/locale/bitcoin_sr@latin.ts
+++ b/src/qt/locale/bitcoin_sr@latin.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">I&amp;zaberi</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Adresa na koju se šalje</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adresa na koju se prima</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ovo su Vaše Bitcoin adrese na koju se vrše uplate. Uvek proverite iznos i prijemnu adresu pre slanja novčića.</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Desila se greška prilikom čuvanja liste adresa u %1. Molimo pokusajte ponovo.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Адреса пошиљаоца - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Адресе за примање - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Izvoz Neuspeo</translation>
</message>
@@ -270,6 +270,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Da li želiš da poništiš podešavanja na početne vrednosti, ili da prekineš bez promena?</translation>
</message>
<message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">Догодила се фатална грешка. Проверите да ли је могуће уписивати у "settings" фајл или покушајте да покренете са "-nosettings".</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Greška: %1</translation>
</message>
@@ -665,10 +670,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Затвори новчаник</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Поврати новчаник...</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Затвори све новчанике</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Пренеси новчаник</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Прикажи поруку помоћи %1 за листу са могућим опцијама Биткоин командне линије</translation>
</message>
@@ -689,6 +707,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Нема доступних новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Име Новчаника</translation>
@@ -849,10 +877,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Naknada:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Прашина:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Nakon Naknade:</translation>
</message>
@@ -937,10 +961,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Копирај бајтове</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копирај прашину</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Копирај кусур</translation>
</message>
@@ -949,18 +969,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 закључан)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">да</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">не</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ознака постаје црвена уколико прималац прими износ мањи од износа прашине - сићушног износа.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Може варирати +/- %1 сатоши(ја) по инпуту.</translation>
</message>
@@ -1011,6 +1019,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Пренеси Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1036,6 +1051,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Поврати Новчаник</translation>
+ </message>
+ </context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1101,14 +1124,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Направи Празан Новчаник</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Користите дескрипторе за управљање сцриптПубКеи-ом</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Дескриптор Новчаник</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Користите спољни уређај за потписивање као што је хардверски новчаник. Прво конфигуришите скрипту спољног потписника у подешавањима новчаника.
</translation>
@@ -1122,10 +1137,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Направи</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Састављено без склите подршке (потребно за новчанике дескриптора)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Састављено без подршке за спољно потписивање (потребно за спољно потписивање)</translation>
@@ -1618,18 +1629,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Користите посебан СОЦКС&amp;5 прокси да бисте дошли до вршњака преко услуга Тор онион:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Једноразредни фонт на картици Преглед:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">уграђено ”%1”</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">Најближа сличност ”%1”</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;Уреду</translation>
</message>
@@ -1851,8 +1850,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ПСБТ је сачуван на диску.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">*Шаље %1 до %2</translation>
+ <source>own address</source>
+ <translation type="unfinished">sopstvena adresa</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2697,10 +2696,6 @@ For more information on using this console, type %6.
<translation type="unfinished">Поља...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Прашина:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Одабери...</translation>
</message>
@@ -2777,10 +2772,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Копирај бајтове</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копирај прашину</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Копирај кусур</translation>
</message>
@@ -2811,10 +2802,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Креира делимично потписану Биткоин трансакцију (PSBT) за коришћење са нпр. офлајн %1 новчаником, или PSBT компатибилним хардверским новчаником. </translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">из новчаника '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 до '%2'</translation>
</message>
@@ -3299,10 +3286,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Излазни индекс</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Сертификат још није проверен)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Trgovac</translation>
</message>
@@ -3401,10 +3384,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Poslat</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Placanje samom sebi</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Iskopano</translation>
</message>
@@ -3476,10 +3455,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Poslat</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Теби</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Iskopano</translation>
</message>
@@ -3597,7 +3572,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<name>WalletFrame</name>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">Napravi novi novčanik</translation>
+ <translation type="unfinished">Направи нови ночаник</translation>
</message>
<message>
<source>Error</source>
@@ -3695,6 +3670,11 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Резервна копија новчаника</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Подаци Новчаника</translation>
+ </message>
+ <message>
<source>Backup Failed</source>
<translation type="unfinished">Резервна копија није успела</translation>
</message>
@@ -3730,10 +3710,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Дистрибуирано под MIT софтверском лиценцом, погледајте придружени документ %s или %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Грешка у читању %s! Сви кључеви су прочитани коректно, али подаци о трансакцији или уноси у адресар могу недостајати или бити нетачни.</translation>
- </message>
- <message>
<source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
<translation type="unfinished">Молим проверите да су време и датум на вашем рачунару тачни. Уколико је сат нетачан, %s неће радити исправно.</translation>
</message>
@@ -3994,10 +3970,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Износ трансакције не може бити негативан</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Трансакција има предугачак ланац у удруженој меморији</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Трансакција мора имати бар једног примаоца</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sv.ts b/src/qt/locale/bitcoin_sv.ts
index 36a3ede0ad..19903798dd 100644
--- a/src/qt/locale/bitcoin_sv.ts
+++ b/src/qt/locale/bitcoin_sv.ts
@@ -15,7 +15,7 @@
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Kopiera den markerade adressen till systemets Urklipp</translation>
+ <translation type="unfinished">Kopiera den tillfälligt markerade adressen till systemets urklippsfunktion</translation>
</message>
<message>
<source>&amp;Copy</source>
@@ -58,14 +58,6 @@
<translation type="unfinished">V&amp;älj</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Avsändaradresser</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Mottagaradresser</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Detta är dina Bitcoin-adresser för att skicka betalningar. Kontrollera alltid belopp och mottagaradress innan du skickar bitcoin.</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
Försök igen.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Avsändaradresser - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Mottagaradresser - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Export misslyckades</translation>
</message>
@@ -217,17 +217,29 @@ Försök igen.</translation>
</message>
<message>
<source>Wallet unlock failed</source>
- <translation type="unfinished">Misslyckades låsa upp plånboken</translation>
+ <translation type="unfinished">Misslyckades att låsa upp plånboken</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
<translation type="unfinished">Lösenfrasen för dekryptering av plånboken var felaktig.</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">Lösenordet som angavs för plånboksavkrypteringen är felaktigt. Det innehåller ett nolltecken (det vill säga en nollbyte). Om lösenordet ställdes in med en tidigare version av denna programvara före version 25.0, försök igen med endast tecknen upp till - men inte inklusive - det första nolltecknet. Om detta lyckas, vänligen ställ in ett nytt lösenord för att undvika detta problem i framtiden.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Plånbokens lösenfras ändrades.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Misslyckades att ändra lösenfras</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">Det gamla lösenordet som angavs för plånboksavkrypteringen är felaktigt. Det innehåller ett nolltecken (det vill säga en nollbyte). Om lösenordet ställdes in med en tidigare version av denna programvara före version 25.0, försök igen med endast tecknen upp till - men inte inklusive - det första nolltecknet.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Varning: Caps Lock är påslaget!</translation>
</message>
@@ -246,6 +258,18 @@ Försök igen.</translation>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">Konfigurationsfil %1 verkar vara korrupt</translation>
+ </message>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Ohanterligt undantag</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">Ett allvarligt fel har uppstått. %1 kan inte längre köras säkert och kommer att avslutas.</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">Internt fel</translation>
</message>
@@ -257,6 +281,11 @@ Försök igen.</translation>
<context>
<name>QObject</name>
<message>
+ <source>Do you want to reset settings to default values, or to abort without making changes?</source>
+ <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
+ <translation type="unfinished">Vill du återställa inställningarna till standardvärden, eller avbryta utan att göra några ändringar?</translation>
+ </message>
+ <message>
<source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
<extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
<translation type="unfinished">Ett allvarligt fel skedde. Se att filen för inställningar är möjlig att skriva, eller försök köra med "-nosettings"</translation>
@@ -267,7 +296,7 @@ Försök igen.</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 har inte avslutats korrekt än...</translation>
+ <translation type="unfinished">%1 har inte avslutats korrekt ännu...</translation>
</message>
<message>
<source>unknown</source>
@@ -297,6 +326,11 @@ Försök igen.</translation>
<translation type="unfinished">Fullt relä</translation>
</message>
<message>
+ <source>Block Relay</source>
+ <extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">Blockrelä</translation>
+ </message>
+ <message>
<source>None</source>
<translation type="unfinished">Ingen</translation>
</message>
@@ -524,7 +558,7 @@ Försök igen.</translation>
</message>
<message>
<source>Processing blocks on disk…</source>
- <translation type="unfinished">Behandlar block på disken…</translation>
+ <translation type="unfinished">Processar block på disken…</translation>
</message>
<message>
<source>Connecting to peers…</source>
@@ -640,6 +674,14 @@ Försök igen.</translation>
<translation type="unfinished">Stäng alla plånböcker</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrera plånbok</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Migrera en plånbok</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Visa %1 hjälpmeddelande för att få en lista med möjliga Bitcoin kommandoradsalternativ.</translation>
</message>
@@ -665,6 +707,11 @@ Försök igen.</translation>
<translation type="unfinished">Plånboksdata</translation>
</message>
<message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Ladda backup av plånbok</translation>
+ </message>
+ <message>
<source>Restore Wallet</source>
<extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
<translation type="unfinished">Återställ Plånbok</translation>
@@ -692,7 +739,11 @@ Försök igen.</translation>
</message>
<message>
<source>&amp;Hide</source>
- <translation type="unfinished">och göm</translation>
+ <translation type="unfinished">&amp;Dölj</translation>
+ </message>
+ <message>
+ <source>S&amp;how</source>
+ <translation type="unfinished">V&amp;isa</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -708,6 +759,11 @@ Försök igen.</translation>
<translation type="unfinished">Klicka för fler alternativ</translation>
</message>
<message>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">Visa flik för anslutningar</translation>
+ </message>
+ <message>
<source>Disable network activity</source>
<extracomment>A context menu item.</extracomment>
<translation type="unfinished">Stäng av nätverksaktivitet</translation>
@@ -718,6 +774,18 @@ Försök igen.</translation>
<translation type="unfinished">Aktivera nätverksaktivitet</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Förhandsinkoppling av rubriker ( %1 %)...</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Misslyckades att skapa plånbok</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Kan inte skapa ny plånbok, programvaran kompilerades utan stöd för sqlite (krävs för deskriptorplånböcker)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Fel: %1</translation>
</message>
@@ -824,10 +892,6 @@ Försök igen.</translation>
<translation type="unfinished">Avgift:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Damm:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Efter avgift:</translation>
</message>
@@ -888,6 +952,18 @@ Försök igen.</translation>
<translation type="unfinished">Kopiera &amp;Belopp</translation>
</message>
<message>
+ <source>Copy transaction &amp;ID and output index</source>
+ <translation type="unfinished">Kopiera transaktion &amp;ID och utdatindex</translation>
+ </message>
+ <message>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">L&amp;ås oanvända</translation>
+ </message>
+ <message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">&amp;Lås upp oanvända</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">Kopiera kvantitet</translation>
</message>
@@ -904,10 +980,6 @@ Försök igen.</translation>
<translation type="unfinished">Kopiera byte</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiera damm</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiera växel</translation>
</message>
@@ -916,18 +988,6 @@ Försök igen.</translation>
<translation type="unfinished">(%1 låst)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ja</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">nej</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Denna etikett blir röd om någon mottagare tar emot ett belopp som är lägre än aktuell dammtröskel.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Kan variera +/- %1 satoshi per inmatning.</translation>
</message>
@@ -968,7 +1028,11 @@ Försök igen.</translation>
<source>Can't list signers</source>
<translation type="unfinished">Kan inte lista signerare</translation>
</message>
- </context>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">För stort antal externa signerare funna</translation>
+ </message>
+</context>
<context>
<name>LoadWalletsActivity</name>
<message>
@@ -983,6 +1047,47 @@ Försök igen.</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Migrera plånbok</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Är du säker att du vill migrera plånboken 1 %1 1 ?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Migrering av plånboken kommer att konvertera denna plånbok till en eller flera deskriptorplånböcker. En ny säkerhetskopia av plånboken måste skapas.
+Om den här plånboken innehåller watchonly-skript skapas en ny plånbok som innehåller dessa watchonly-skript.
+Om den här plånboken innehåller lösbara</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Migrera plånbok</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Migrerar plånbok &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Migrering av plånboken ' %1 ' genomförd.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Migrering misslyckades</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Migrering genomförd</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -990,7 +1095,7 @@ Försök igen.</translation>
</message>
<message>
<source>Open wallet warning</source>
- <translation type="unfinished">Öppna plånboksvarning.</translation>
+ <translation type="unfinished">Öppna plånboksvarning</translation>
</message>
<message>
<source>default wallet</source>
@@ -1024,7 +1129,17 @@ Försök igen.</translation>
<extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
<translation type="unfinished">Det gick inte att återställa plånboken</translation>
</message>
- </context>
+ <message>
+ <source>Restore wallet warning</source>
+ <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
+ <translation type="unfinished">Återställ plånboksvarning</translation>
+ </message>
+ <message>
+ <source>Restore wallet message</source>
+ <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
+ <translation type="unfinished">Återskapa plånboksmeddelande</translation>
+ </message>
+</context>
<context>
<name>WalletController</name>
<message>
@@ -1055,6 +1170,14 @@ Försök igen.</translation>
<translation type="unfinished">Skapa plånbok</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Nu är du bara ett steg ifrån att skapa din nya plånbok!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Ange ett namn och, om så önskas, aktivera eventuella avancerade alternativ</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">Namn på plånboken</translation>
</message>
@@ -1091,10 +1214,23 @@ Försök igen.</translation>
<translation type="unfinished">Skapa tom plånbok</translation>
</message>
<message>
+ <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
+ <translation type="unfinished">Använd en extern signeringsenhet, t.ex. en hårdvaruplånbok. Konfigurera först skriptet för extern signering i plånboksinställningarna.</translation>
+ </message>
+ <message>
+ <source>External signer</source>
+ <translation type="unfinished">Extern signerare</translation>
+ </message>
+ <message>
<source>Create</source>
<translation type="unfinished">Skapa</translation>
</message>
- </context>
+ <message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Kompilerad utan stöd för extern signering (krävs för extern signering)</translation>
+ </message>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -1178,8 +1314,8 @@ Försök igen.</translation>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n GB tillgängligt lagringsutrymme</numerusform>
+ <numerusform>%n GB tillgängligt lagringsutrymme</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -1197,6 +1333,10 @@ Försök igen.</translation>
</translation>
</message>
<message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">Välj katalog för data</translation>
+ </message>
+ <message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">Minst %1 GB data kommer att sparas i den här katalogen, och de växer över tiden.</translation>
</message>
@@ -1208,8 +1348,8 @@ Försök igen.</translation>
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>(tillräckligt för att återställa säkerhetskopior %n dag(ar) gammal)</numerusform>
+ <numerusform>(tillräckligt för att återställa säkerhetskopior %n dag(ar) gammal)</numerusform>
</translation>
</message>
<message>
@@ -1337,6 +1477,10 @@ Försök igen.</translation>
<source>Hide</source>
<translation type="unfinished">Dölj</translation>
</message>
+ <message>
+ <source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
+ <translation type="unfinished">%1 synkroniserar. Den kommer att ladda ner metadata och block från noder och validera dem fram tills att toppen på blockkedjan är nådd.</translation>
+ </message>
</context>
<context>
<name>OpenURIDialog</name>
@@ -1389,6 +1533,10 @@ Försök igen.</translation>
<translation type="unfinished">Minimera istället för att stänga programmet när fönstret stängs. När detta alternativ är aktiverat stängs programmet endast genom att välja Stäng i menyn.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Typsnitt på översiktsfliken:</translation>
+ </message>
+ <message>
<source>Open the %1 configuration file from the working directory.</source>
<translation type="unfinished">Öppna konfigurationsfilen %1 från arbetskatalogen.</translation>
</message>
@@ -1452,6 +1600,10 @@ Försök igen.</translation>
<translation type="unfinished">Aktivera &amp;PSBT-kontroll</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">Extern signerare (e.g. hårdvaruplånbok)</translation>
+ </message>
+ <message>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
<translation type="unfinished">Öppna automatiskt Bitcoin-klientens port på routern. Detta fungerar endast om din router stödjer UPnP och det är är aktiverat.</translation>
</message>
@@ -1544,10 +1696,19 @@ Försök igen.</translation>
<translation type="unfinished">Anslut till Bitcoin-nätverket genom en separat SOCKS5-proxy för onion-tjänster genom Tor.</translation>
</message>
<message>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">Använd en fristående SOCKS&amp;5 proxy för att nå noder via Tor onion tjänster:</translation>
+ </message>
+ <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Avbryt</translation>
</message>
<message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">Kompilerad utan stöd för extern signering (krävs för extern signering)</translation>
+ </message>
+ <message>
<source>default</source>
<translation type="unfinished">standard</translation>
</message>
@@ -1735,8 +1896,12 @@ Försök igen.</translation>
<translation type="unfinished">PSBT sparad till disk.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Skickar %1 till %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Skickar %1 till %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">egen adress</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -1767,6 +1932,10 @@ Försök igen.</translation>
<translation type="unfinished">Transaktionen behöver signatur(er).</translation>
</message>
<message>
+ <source>(But no wallet is loaded.)</source>
+ <translation type="unfinished">&lt;br&gt;(</translation>
+ </message>
+ <message>
<source>(But this wallet cannot sign transactions.)</source>
<translation type="unfinished">(Den här plånboken kan inte signera transaktioner.)</translation>
</message>
@@ -1975,7 +2144,7 @@ Försök igen.</translation>
</message>
<message>
<source>&amp;Peers</source>
- <translation type="unfinished">&amp;Klienter</translation>
+ <translation type="unfinished">&amp;Noder</translation>
</message>
<message>
<source>Banned peers</source>
@@ -1986,6 +2155,10 @@ Försök igen.</translation>
<translation type="unfinished">Välj en klient för att se detaljerad information.</translation>
</message>
<message>
+ <source>Transaction Relay</source>
+ <translation type="unfinished">Transaktionsrelä</translation>
+ </message>
+ <message>
<source>Starting Block</source>
<translation type="unfinished">Startblock</translation>
</message>
@@ -2106,6 +2279,16 @@ Försök igen.</translation>
<translation type="unfinished">Ut:</translation>
</message>
<message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: okrypterat transportprotokoll i klartext</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324 krypterat transportprotokoll</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">&amp;Kopiera adress</translation>
@@ -2444,10 +2627,6 @@ Försök igen.</translation>
<translation type="unfinished">Inmatningar…</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Damm:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Välj…</translation>
</message>
@@ -2512,10 +2691,6 @@ Försök igen.</translation>
<translation type="unfinished">Kopiera byte</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiera damm</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiera växel</translation>
</message>
@@ -2524,6 +2699,10 @@ Försök igen.</translation>
<translation type="unfinished">%1 (%2 block)</translation>
</message>
<message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">Anslut din hårdvaruplånbok först.</translation>
+ </message>
+ <message>
<source>Cr&amp;eate Unsigned</source>
<translation type="unfinished">Sk&amp;apa Osignerad</translation>
</message>
@@ -2532,10 +2711,6 @@ Försök igen.</translation>
<translation type="unfinished">Skapar en delvis signerad Bitcoin transaktion (PSBT) att använda vid t.ex. en offline %1 plånbok, eller en PSBT-kompatibel hårdvaruplånbok.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">från plånbok: '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 till '%2'</translation>
</message>
@@ -2570,6 +2745,11 @@ Försök igen.</translation>
<translation type="unfinished">Verifiera ditt transaktionsförslag. Det kommer skapas en delvis signerad Bitcoin transaktion (PSBT) som du kan spara eller kopiera och sen signera med t.ex. en offline %1 plånbok, eller en PSBT-kompatibel hårdvaruplånbok.</translation>
</message>
<message>
+ <source>Do you want to create this transaction?</source>
+ <extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
+ <translation type="unfinished">Vill du skapa den här transaktionen?</translation>
+ </message>
+ <message>
<source>Please, review your transaction.</source>
<extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
<translation type="unfinished">Var vänlig se över din transaktion.</translation>
@@ -2984,10 +3164,6 @@ Försök igen.</translation>
<translation type="unfinished">Utmatningsindex</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Certifikatet verifierades inte)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Handlare</translation>
</message>
@@ -3086,10 +3262,6 @@ Försök igen.</translation>
<translation type="unfinished">Skickad till</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Betalning till dig själv</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Grävda</translation>
</message>
@@ -3161,10 +3333,6 @@ Försök igen.</translation>
<translation type="unfinished">Skickad till</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Till dig själv</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Grävda</translation>
</message>
@@ -3197,6 +3365,10 @@ Försök igen.</translation>
<translation type="unfinished">Kopiera &amp;Belopp</translation>
</message>
<message>
+ <source>Copy transaction &amp;ID</source>
+ <translation type="unfinished">Kopiera transaktions &amp;ID</translation>
+ </message>
+ <message>
<source>&amp;Show transaction details</source>
<translation type="unfinished">&amp;Visa detaljer för överföringen</translation>
</message>
@@ -3412,10 +3584,6 @@ Gå till Fil &gt; Öppna plånbok för att läsa in en plånbok.
<translation type="unfinished">Distribuerad under MIT mjukvarulicens, se den bifogade filen %s eller %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Fel vid läsning av %s! Alla nycklar lästes korrekt, men transaktionsdata eller poster i adressboken kanske saknas eller är felaktiga.</translation>
- </message>
- <message>
<source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
<translation type="unfinished">Fler än en onion-adress finns tillgänglig. Den automatiskt skapade Tor-tjänsten kommer använda %s.</translation>
</message>
@@ -3764,10 +3932,6 @@ Gå till Fil &gt; Öppna plånbok för att läsa in en plånbok.
<translation type="unfinished">Transaktionsbelopp får ej vara negativt</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Transaktionen har för lång mempool-kedja</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">Transaktionen måste ha minst en mottagare</translation>
</message>
diff --git a/src/qt/locale/bitcoin_sw.ts b/src/qt/locale/bitcoin_sw.ts
index 3f94907ce3..499eb68538 100644
--- a/src/qt/locale/bitcoin_sw.ts
+++ b/src/qt/locale/bitcoin_sw.ts
@@ -3,7 +3,7 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">Bonyeza kitufe cha kulia kufanya mabadiliko kwenye anuani au lebo</translation>
+ <translation type="unfinished">Bonyeza kulia ili kuhariri anwani au lebo</translation>
</message>
<message>
<source>Create a new address</source>
@@ -31,15 +31,15 @@
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">Weka anwani au lebo ili utafute</translation>
+ <translation type="unfinished">Weka anwani au chapa ili utafute</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Hamisha data katika kichupo cha sasa hadi kwenye faili</translation>
+ <translation type="unfinished">Toa data katika kichupo cha sasa hadi kwenye faili</translation>
</message>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">na hamisha</translation>
+ <translation type="unfinished">&amp;Toa</translation>
</message>
<message>
<source>&amp;Delete</source>
@@ -58,14 +58,6 @@
<translation type="unfinished">Chagua</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Kutuma anuani</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Kupokea anuani</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Hizi ndizo anwani zako za kutuma malipo ya sarafu ya Bitcoin. Hakikisha kila wakati kiwango na anwani ya kupokea kabla ya kutuma sarafu.</translation>
</message>
@@ -81,7 +73,7 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
<message>
<source>Copy &amp;Label</source>
- <translation type="unfinished">nakala &amp; lebo</translation>
+ <translation type="unfinished">Nakili &amp; Chapa</translation>
</message>
<message>
<source>&amp;Edit</source>
@@ -89,16 +81,21 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">Pakia orodha ya anuani</translation>
+ <translation type="unfinished">Toa orodha ya anuani</translation>
</message>
<message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Faili lililotenganishwa kwa mkato</translation>
+ <translation type="unfinished">Faili linalotenganishwa kwa mkato</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the address list to %1. Please try again.</source>
+ <extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
+ <translation type="unfinished">Kulikuwa na kosa jaribu kuokoa orodha ya anwani kwa %1. Tafadhali jaribu tena.</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Upakiaji haujafanikiwa</translation>
+ <translation type="unfinished">Utoaji Haujafanikiwa</translation>
</message>
</context>
<context>
@@ -139,24 +136,60 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<translation type="unfinished">Onyesha nenosiri</translation>
</message>
<message>
+ <source>Encrypt wallet</source>
+ <translation type="unfinished">Simba mkoba</translation>
+ </message>
+ <message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
<translation type="unfinished">Operesheni hii inahitaji kaulisiri ya mkoba wako ili kufungua pochi.</translation>
</message>
<message>
+ <source>Unlock wallet</source>
+ <translation type="unfinished">Fungua mkoba</translation>
+ </message>
+ <message>
<source>Change passphrase</source>
<translation type="unfinished">Badilisha nenosiri </translation>
</message>
<message>
+ <source>Confirm wallet encryption</source>
+ <translation type="unfinished">Thibitisha usimbaji fiche wa pochi</translation>
+ </message>
+ <message>
<source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
<translation type="unfinished">Ilani: Ikiwa utasimba pochi yako na ukapoteza nenosiri lako, &lt;b&gt; UTAPOTEZA BITCOIN ZAKO ZOTE &lt;/b&gt;!</translation>
</message>
<message>
+ <source>Are you sure you wish to encrypt your wallet?</source>
+ <translation type="unfinished">Je, una uhakika ungependa kusimba kibeti chako kwa njia fiche?</translation>
+ </message>
+ <message>
+ <source>Wallet encrypted</source>
+ <translation type="unfinished">Wallet imesimbwa kwa njia fiche</translation>
+ </message>
+ <message>
<source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">Ingiza nenosiri jipya kwa ajili ya pochi yako.&lt;br/&gt;Tafadhali tumia nenosiri ya&lt;b&gt;herufi holelaholela kumi au zaidi&lt;/b&gt;, au &lt;b&gt; maneno kumi au zaidi&lt;/b&gt;.</translation>
+ <translation type="unfinished">Ingiza nenosiri jipya kwa ajili ya pochi yako.&lt;br/&gt;Tafadhali tumia nenosiri la &lt;b&gt;herufi holelaholela kumi au zaidi&lt;/b&gt;, au &lt;b&gt;maneno kumi au zaidi&lt;/b&gt;.</translation>
</message>
<message>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">Ingiza nenosiri ya zamani na nenosiri jipya ya pochi yako.</translation>
+ <translation type="unfinished">Ingiza nenosiri la zamani na nenosiri jipya la pochi yako.</translation>
+ </message>
+ <message>
+ <source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
+ <translation type="unfinished">Kumbuka kwamba usimbaji fiche wa mkoba wako hauwezi kulinda bitcoins zako zisiibiwe na programu hasidi kuambukiza kompyuta yako.</translation>
+ </message>
+ <message>
+ <source>Wallet to be encrypted</source>
+ <translation type="unfinished">Wallet itasimbwa kwa njia fiche</translation>
+ </message>
+ <message>
+ <source>Your wallet is about to be encrypted. </source>
+ <translation type="unfinished">Mkoba wako unakaribia kusimbwa kwa njia fiche.</translation>
+ </message>
+ <message>
+ <source>Your wallet is now encrypted. </source>
+ <translation type="unfinished">Mkoba wako sasa umesimbwa kwa njia fiche.</translation>
</message>
<message>
<source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
@@ -164,12 +197,20 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
 </translation>
</message>
<message>
+ <source>Wallet encryption failed</source>
+ <translation type="unfinished">Usimbaji fiche wa Wallet haukufaulu</translation>
+ </message>
+ <message>
+ <source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
+ <translation type="unfinished">Usimbaji fiche wa Wallet umeshindwa kwa sababu ya hitilafu ya ndani. Pochi yako haikusimbwa kwa njia fiche.</translation>
+ </message>
+ <message>
<source>The supplied passphrases do not match.</source>
<translation type="unfinished">Nenosiri liliyotolewa haifanani.</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">Nenosiri liliyoingizwa kwa ajili ya kufundua pochi sio sahihi.</translation>
+ <translation type="unfinished">Nenosiri liliyoingizwa kwa ajili ya kufungua pochi sio sahihi.</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
@@ -187,9 +228,57 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
<translation type="unfinished">Nenosiri la zamani liliyoingizwa kwa ajili ya kufungulia pochi sio sahihi. Linabeba herufi batili (yaani - yenye byte 0 ). Kama nenosiri liliwekwa na toleo la programu hii kabla ya 25.0, tafadhali jaribu tena na herufi zote mpaka — lakini usiweka — herufi batili ya kwanza.</translation>
</message>
- </context>
+ <message>
+ <source>Warning: The Caps Lock key is on!</source>
+ <translation type="unfinished">Onyo: Kitufe cha Caps Lock kimewashwa!</translation>
+ </message>
+</context>
+<context>
+ <name>BanTableModel</name>
+ <message>
+ <source>Banned Until</source>
+ <translation type="unfinished">Imepigwa Marufuku Hadi</translation>
+ </message>
+</context>
+<context>
+ <name>BitcoinApplication</name>
+ <message>
+ <source>Runaway exception</source>
+ <translation type="unfinished">Ubaguzi wa kukimbia</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">Kosa kubwa limejitokeza. %1 haliwezi kuendelea salama na litajiondoa.</translation>
+ </message>
+ <message>
+ <source>Internal error</source>
+ <translation type="unfinished">Hitilafu ya ndani</translation>
+ </message>
+ <message>
+ <source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
+ <translation type="unfinished">Hitilafu ya ndani ilitokea. %1 itajaribu kuendelea salama. Hii ni mdudu usiotarajiwa ambao unaweza kuripotiwa kama ilivyoelezwa hapa chini.</translation>
+ </message>
+</context>
<context>
<name>QObject</name>
+ <message>
+ <source>Do you want to reset settings to default values, or to abort without making changes?</source>
+ <extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
+ <translation type="unfinished">Unataka kurejesha mipangilio kwa thamani za awali, au kusitisha bila kufanya mabadiliko?</translation>
+ </message>
+ <message>
+ <source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
+ <extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
+ <translation type="unfinished">Kosa kubwa limejitokeza. Angalia kwamba faili ya mipangilio inaweza kuandikwa, au jaribu kuendesha na -nosettings.</translation>
+ </message>
+ <message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Kosa: %1</translation>
+ </message>
+ <message>
+ <source>%1 didn't yet exit safely…</source>
+ <translation type="unfinished">%1 bado hajaondoka salama...</translation>
+ </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
@@ -236,14 +325,107 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<context>
<name>BitcoinGUI</name>
<message>
+ <source>&amp;Overview</source>
+ <translation type="unfinished">&amp;Muhtasari</translation>
+ </message>
+ <message>
+ <source>Show general overview of wallet</source>
+ <translation type="unfinished">Onyesha muhtasari wa jumla wa mkoba</translation>
+ </message>
+ <message>
+ <source>&amp;Transactions</source>
+ <translation type="unfinished">&amp;Shughuli za malipo</translation>
+ </message>
+ <message>
+ <source>Browse transaction history</source>
+ <translation type="unfinished">Angalia historia ya shughuli za malipo</translation>
+ </message>
+ <message>
+ <source>Quit application</source>
+ <translation type="unfinished">Acha programu</translation>
+ </message>
+ <message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">Kuhusu %1</translation>
+ </message>
+ <message>
+ <source>Show information about %1</source>
+ <translation type="unfinished">Onyesha habari kuhusu %1</translation>
+ </message>
+ <message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished">Kuhusu &amp;Qt</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">Badilisha chaguo za usanidi kwa %1</translation>
+ </message>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">Unda mkoba mpya</translation>
+ </message>
+ <message>
+ <source>&amp;Minimize</source>
+ <translation type="unfinished">Kupunguza</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Mkoba:</translation>
+ </message>
+ <message>
+ <source>Network activity disabled.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">Shughuli ya mtandao imelemazwa.</translation>
+ </message>
+ <message>
+ <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
+ <translation type="unfinished">Proxy imeamilishwa: %1</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation type="unfinished">Tuma sarafu kwa anwani ya Bitcoin</translation>
+ </message>
+ <message>
+ <source>Backup wallet to another location</source>
+ <translation type="unfinished">Cheleza mkoba hadi eneo lingine</translation>
+ </message>
+ <message>
<source>Change the passphrase used for wallet encryption</source>
<translation type="unfinished">Badilisha nenosiri liliyotumika kusimba pochi</translation>
</message>
<message>
+ <source>&amp;Send</source>
+ <translation type="unfinished">&amp;TUMA</translation>
+ </message>
+ <message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">&amp;Chaguo...</translation>
+ </message>
+ <message>
+ <source>Encrypt the private keys that belong to your wallet</source>
+ <translation type="unfinished">Funga funguo za siri zinazomiliki mkoba wako.</translation>
+ </message>
+ <message>
<source>&amp;Change Passphrase…</source>
<translation type="unfinished">&amp;Badilisha Nenosiri...</translation>
</message>
<message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">Saini &amp;ujumbe...</translation>
+ </message>
+ <message>
+ <source>Sign messages with your Bitcoin addresses to prove you own them</source>
+ <translation type="unfinished">Saini ujumbe na anwani zako za Bitcoin ili kuthibitisha umiliki wao.</translation>
+ </message>
+ <message>
+ <source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
+ <translation type="unfinished">Hakikisha ujumbe umethibitishwa kuwa ulisainiwa na anwani za Bitcoin zilizotajwa</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">Fungua &amp;URI ...</translation>
+ </message>
+ <message>
<source>Close Wallet…</source>
<translation type="unfinished">Funga pochi</translation>
</message>
@@ -256,6 +438,46 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<translation type="unfinished">Funga pochi yzote</translation>
</message>
<message>
+ <source>&amp;File</source>
+ <translation type="unfinished">&amp;Faili</translation>
+ </message>
+ <message>
+ <source>&amp;Settings</source>
+ <translation type="unfinished">&amp;Vipimo</translation>
+ </message>
+ <message>
+ <source>&amp;Help</source>
+ <translation type="unfinished">&amp;Msaidie</translation>
+ </message>
+ <message>
+ <source>Tabs toolbar</source>
+ <translation type="unfinished">Vidirisha vya vichupo</translation>
+ </message>
+ <message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">Kuunganisha Vichwa vya habari (%1%) ...</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">Kuunganisha na mtandao ...</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">Kuweka alama za vitengo kwenye diski ...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">Kusindika vitalu kwenye diski ...</translation>
+ </message>
+ <message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">Kuunganisha na wenzako wa kushirikiana...</translation>
+ </message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation type="unfinished">Omba malipo (huzalisha nambari za QR na bitcoin: URIs)</translation>
+ </message>
+ <message>
<source>Show the list of used sending addresses and labels</source>
<translation type="unfinished">Onyesha orodha ya anuani za kutuma na chapa</translation>
</message>
@@ -263,6 +485,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<source>Show the list of used receiving addresses and labels</source>
<translation type="unfinished">Onyesha orodha ya anuani za kupokea zilizotumika na chapa</translation>
</message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation type="unfinished">&amp;Chaguo za amri ya amri</translation>
+ </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
@@ -270,6 +496,11 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<numerusform />
</translation>
</message>
+ <message>
+ <source>Wallet Name</source>
+ <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
+ <translation type="unfinished">Jina la Wallet</translation>
+ </message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
@@ -279,6 +510,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</translation>
</message>
<message>
+ <source>Error: %1</source>
+ <translation type="unfinished">Kosa: %1</translation>
+ </message>
+ <message>
<source>Label: %1
</source>
<translation type="unfinished">Chapa: %1</translation>
@@ -296,28 +531,35 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Nakili &amp; Chapa</translation>
+ <translation type="unfinished">Nakili &amp;chapa</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ndio</translation>
+ <source>(no label)</source>
+ <translation type="unfinished">(hamna chapa)</translation>
</message>
+ </context>
+<context>
+ <name>RestoreWalletActivity</name>
<message>
- <source>no</source>
- <translation type="unfinished">La</translation>
+ <source>Restore wallet warning</source>
+ <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
+ <translation type="unfinished">Rejesha onyo la pochi</translation>
</message>
+ </context>
+<context>
+ <name>WalletController</name>
<message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Hii chapa hubadilika kuwa nyekundu kama mpokeaji yeyote atapokea kiasi kidogo kuliko kizingiti vumbi cha sasa.</translation>
- </message>
- <message>
- <source>(no label)</source>
- <translation type="unfinished">(hamna chapa)</translation>
+ <source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
+ <translation type="unfinished">Kufunga pochi kwa muda mrefu sana kunaweza kusababisha kusawazisha tena mnyororo mzima ikiwa upogoaji umewezeshwa.</translation>
</message>
</context>
<context>
<name>CreateWalletDialog</name>
<message>
+ <source>Wallet Name</source>
+ <translation type="unfinished">Jina la Wallet</translation>
+ </message>
+ <message>
<source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
<translation type="unfinished">Simba pochi. Pochi itasimbwa kwa kutumia nenosiri utakalo chagua.</translation>
</message>
@@ -329,6 +571,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
<translation type="unfinished">Tengeneza pochi tupu. Pochi tupu kwa kuanza hazina funguo za siri au hati. Funguo za siri zinaweza kuingizwa, au mbegu ya HD inaweza kuwekwa baadae.</translation>
</message>
+ <message>
+ <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
+ <translation type="unfinished">Tumia kifaa cha kutia sahihi cha nje kama vile pochi ya maunzi. Sanidi hati ya kutia sahihi ya nje katika mapendeleo ya pochi kwanza.</translation>
+ </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -341,6 +587,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<translation type="unfinished">Chapa inayohusiana na hiki kipendele cha orodha ya anuani</translation>
</message>
<message>
+ <source>Edit sending address</source>
+ <translation type="unfinished">Badilisha anwani ya kutuma</translation>
+ </message>
+ <message>
<source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
<translation type="unfinished">Anuani "%1" ipo teyari kama anuani ya kupokea ikiwa na chapa "%2" hivyo haiwezi kuongezwa kama anuani ya kutuma.</translation>
</message>
@@ -348,14 +598,34 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">Anuani iliyoingizwa "%1" teyari ipo kwenye kitabu cha anuani ikiwa na chapa "%2".</translation>
</message>
- </context>
+ <message>
+ <source>Could not unlock wallet.</source>
+ <translation type="unfinished">Haikuweza kufungua pochi.</translation>
+ </message>
+ <message>
+ <source>New key generation failed.</source>
+ <translation type="unfinished">Uzalishaji mpya wa ufunguo umeshindwa.</translation>
+ </message>
+</context>
<context>
<name>FreespaceChecker</name>
<message>
+ <source>A new data directory will be created.</source>
+ <translation type="unfinished">Saraka mpya ya data itaundwa.</translation>
+ </message>
+ <message>
<source>name</source>
<translation type="unfinished">Jina</translation>
</message>
- </context>
+ <message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">Njia tayari ipo, na si saraka.</translation>
+ </message>
+ <message>
+ <source>Cannot create data directory here.</source>
+ <translation type="unfinished">Haiwezi kuunda saraka ya data hapa.</translation>
+ </message>
+</context>
<context>
<name>Intro</name>
<message numerus="yes">
@@ -419,7 +689,11 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Nakili &amp; Chapa</translation>
+ <translation type="unfinished">Nakili &amp;chapa</translation>
+ </message>
+ <message>
+ <source>Could not unlock wallet.</source>
+ <translation type="unfinished">Haikuweza kufungua pochi.</translation>
</message>
</context>
<context>
@@ -428,6 +702,10 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
<source>Label:</source>
<translation type="unfinished">Chapa:</translation>
</message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">Mkoba:</translation>
+ </message>
</context>
<context>
<name>RecentRequestsTableModel</name>
@@ -502,7 +780,7 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">Nakili &amp; Chapa</translation>
+ <translation type="unfinished">Nakili &amp;chapa</translation>
</message>
<message>
<source>&amp;Edit address label</source>
@@ -510,12 +788,12 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
<message>
<source>Export Transaction History</source>
- <translation type="unfinished">Pakia historia ya miamala</translation>
+ <translation type="unfinished">Toa Historia ya Miamala</translation>
</message>
<message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
- <translation type="unfinished">Faili lililotenganishwa kwa mkato</translation>
+ <translation type="unfinished">Faili linalotenganishwa kwa mkato</translation>
</message>
<message>
<source>Label</source>
@@ -527,22 +805,29 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Upakiaji haujafanikiwa</translation>
+ <translation type="unfinished">Utoaji Haujafanikiwa</translation>
</message>
<message>
<source>Exporting Successful</source>
- <translation type="unfinished">Upakiaji Umefanikiwa</translation>
+ <translation type="unfinished">Utoaji Umefanikiwa</translation>
+ </message>
+ </context>
+<context>
+ <name>WalletFrame</name>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">Unda mkoba mpya</translation>
</message>
</context>
<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">na hamisha</translation>
+ <translation type="unfinished">&amp;Toa</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">Hamisha data katika kichupo cha sasa hadi kwenye faili</translation>
+ <translation type="unfinished">Toa data katika kichupo cha sasa hadi kwenye faili</translation>
</message>
</context>
<context>
@@ -557,15 +842,15 @@ Kutia sahihi kunawezekana tu kwa anwani za aina ya 'urithi'.</translation>
</message>
<message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">HITILAFU: Data za kitabu cha anunai katika pochi haziwezi kutambulika kuwa ni ya pochi zilizohamia.</translation>
+ <translation type="unfinished">Hitilafu: Data za kitabu cha anunai katika pochi haziwezi kutambulika kuwa ni ya pochi zilizohamia.</translation>
</message>
<message>
<source>Error: No %s addresses available.</source>
- <translation type="unfinished">HITILAFU: Hamna anuani zilizopo %s.</translation>
+ <translation type="unfinished">Hitilafu: Hamna anuani zilizopo %s.</translation>
</message>
<message>
<source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">HITILAFU: Imeshindwa kuondoa data katika kitabu cha anuani ya kutazama tu</translation>
+ <translation type="unfinished">Hitilafu: Imeshindwa kuondoa data katika kitabu cha anuani ya kutazama tu</translation>
</message>
<message>
<source>Importing…</source>
diff --git a/src/qt/locale/bitcoin_szl.ts b/src/qt/locale/bitcoin_szl.ts
index 74a1591a57..81a33250ad 100644
--- a/src/qt/locale/bitcoin_szl.ts
+++ b/src/qt/locale/bitcoin_szl.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">Ô&amp;bier</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Adresy posyłaniŏ</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Adresy ôdbiyraniŏ</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Tukej sōm adresy Bitcoin na kere posyłŏsz płaty. Dycki wybaduj wielość i adresã ôdbiyrŏcza przed posłaniym mōnet.</translation>
</message>
@@ -541,10 +533,6 @@
<translation type="unfinished">Ôpłŏcka:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Sztaub:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Po ôpłŏcce:</translation>
</message>
@@ -609,10 +597,6 @@
<translation type="unfinished">Kopiyruj wielość bajtōw</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiyruj sztaub</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiyruj wydŏwkã</translation>
</message>
@@ -621,18 +605,6 @@
<translation type="unfinished">(%1 zaszperowane)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ja</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">niy</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ta etyketa stŏwŏ sie czyrwōnŏ jeźli keryś z ôdbiyrŏczy dostŏwŏ kwotã myńszõ aniżeli terŏźny prōg sztaubu.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Chwiyrŏ sie +/- %1 satoshi na wchōd.</translation>
</message>
@@ -1361,10 +1333,6 @@
<translation type="unfinished">Włŏsne:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Sztaub:</translation>
- </message>
- <message>
<source>Balance:</source>
<translation type="unfinished">Saldo:</translation>
</message>
@@ -1389,10 +1357,6 @@
<translation type="unfinished">Kopiyruj wielość bajtōw</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopiyruj sztaub</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopiyruj wydŏwkã</translation>
</message>
@@ -1557,10 +1521,6 @@
<translation type="unfinished">Ôdebrane ôd</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Płat do siebie</translation>
- </message>
- <message>
<source>(no label)</source>
<translation type="unfinished">(chyba etykety)</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ta.ts b/src/qt/locale/bitcoin_ta.ts
index 832e099734..6255126438 100644
--- a/src/qt/locale/bitcoin_ta.ts
+++ b/src/qt/locale/bitcoin_ta.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">தே&amp;ர்வுசெய் </translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">முகவரிகள் அனுப்பப்படுகின்றன</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">முகவரிகள் பெறப்படுகின்றன</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">இவை பணம் அனுப்புவதற்கு உங்களின் பிட்காயின் முகவரிகள். பிட்காயின்களை அனுப்புவதற்கு முன் எப்பொழுதும் தொகையும் பெறுதலையும் சரிபார்க்கவும்.</translation>
</message>
@@ -726,10 +718,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">கட்டணம்:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">டஸ்ட்</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">கட்டணத்திறகுப் பின்:</translation>
</message>
@@ -794,10 +782,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">நகல் கட்டணம்</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">தூசி நகலெடுக்கவும்</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">மாற்றத்தை நகலெடுக்கவும்</translation>
</message>
@@ -806,18 +790,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 பூட்டப்பட்டது)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ஆம்</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">இல்லை</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">நடப்பு தூசி நிலையை விட குறைவான அளவு பெறுநரை பெறுமானால் இந்த லேபிள் சிவப்பு நிறமாக மாறும்.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">உள்ளீடு ஒன்றுக்கு +/- %1 சாத்தோஷி (கள்) மாறுபடலாம்</translation>
</message>
@@ -1482,6 +1454,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">நெருக்கமான</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">சொந்த முகவரி</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">முழு தொகை</translation>
</message>
@@ -2068,10 +2044,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">படிவத்தின் அனைத்து துறையையும் அழி.</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">டஸ்ட்</translation>
- </message>
- <message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
<translation type="unfinished">தொகுதிகள் உள்ள இடத்தை விட குறைவான பரிவர்த்தனை அளவு இருக்கும் போது, ​​சுரங்க தொழிலாளர்கள் மற்றும் ரிலேடிங் முனைகள் குறைந்தபட்ச கட்டணத்தைச் செயல்படுத்தலாம். இந்த குறைந்தபட்ச கட்டணத்தை மட்டும் செலுத்துவது நன்றாக உள்ளது, ஆனால் நெட்வொர்க்கில் செயல்படுவதை விட bitcoin பரிவர்த்தனைகளுக்கு இன்னும் கோரிக்கை தேவைப்பட்டால் இது ஒருபோதும் உறுதிப்படுத்தாத பரிவர்த்தனைக்கு காரணமாக இருக்கலாம்.</translation>
</message>
@@ -2128,10 +2100,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">நகல் கட்டணம்</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">தூசி நகலெடுக்கவும்</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">மாற்றத்தை நகலெடுக்கவும்</translation>
</message>
@@ -2140,10 +2108,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 (%2 ப்ளாக்ஸ்)</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">வாலட்டில் இருந்து '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 இருந்து '%2'</translation>
</message>
@@ -2554,10 +2518,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">வெளியீட்டு அட்டவணை</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(சான்றிதழ் சரிபார்க்கப்படவில்லை)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">வணிகர்</translation>
</message>
@@ -2640,10 +2600,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">அனுப்பப்பட்டது</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">உனக்கே பணம் செலுத்து</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">மைன் செய்யப்பட்டது</translation>
</message>
@@ -2719,10 +2675,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">அனுப்பப்பட்டது</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">உங்களுக்கே</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">மைன் செய்யப்பட்டது</translation>
</message>
@@ -2913,10 +2865,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">எம்ஐடி சாப்ட்வேர் விதிமுறைகளின் கீழ் பகிர்ந்தளிக்கப்படுகிறது, அதனுடன் கொடுக்கப்பட்டுள்ள %s அல்லது %s பைல் ஐ பார்க்கவும்</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">%s படிப்பதில் பிழை! எல்லா விசைகளும் சரியாகப் படிக்கப்படுகின்றன, ஆனால் பரிவர்த்தனை டேட்டா அல்லது முகவரி புத்தக உள்ளீடுகள் காணவில்லை அல்லது தவறாக இருக்கலாம்.</translation>
- </message>
- <message>
<source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
<translation type="unfinished">உங்கள் கணினியின் தேதி மற்றும் நேரம் சரியாக உள்ளதா என்பதனை சரிபார்க்கவும்! உங்கள் கடிகாரம் தவறாக இருந்தால், %s சரியாக இயங்காது.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_te.ts b/src/qt/locale/bitcoin_te.ts
index aca9d9bc26..e30f9bebf5 100644
--- a/src/qt/locale/bitcoin_te.ts
+++ b/src/qt/locale/bitcoin_te.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">ఎం&amp;చుకోండి</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">పంపించే చిరునామాలు</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">అందుకునే చిరునామాలు</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">ఇవి మీరు పంపే చెల్లింపుల బిట్‌కాయిన్ చిరునామాలు. నాణేలు పంపే ముందు ప్రతిసారి అందుకునే చిరునామా మరియు చెల్లింపు మొత్తం సరిచూసుకోండి.</translation>
</message>
@@ -742,7 +734,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">&amp;చూపించు</translation>
+ <translation type="unfinished">S&amp;ఎలా</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
@@ -883,10 +875,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">రుసుము:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">దుమ్ము:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">రుసుము తర్వాత:</translation>
</message>
@@ -975,10 +963,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">బైట్‌లను కాపీ చేయండి</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">దుమ్మును కాపీ చేయండి</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">మార్పుని కాపీ చేయండి</translation>
</message>
@@ -987,18 +971,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 లాక్ చేయబడింది)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">అవును</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">లేదు</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">ఏదైనా గ్రహీత ప్రస్తుత ధూళి థ్రెషోల్డ్ కంటే చిన్న మొత్తాన్ని స్వీకరిస్తే ఈ లేబుల్ ఎరుపు రంగులోకి మారుతుంది.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">ఒక్కో ఇన్‌పుట్‌కు +/- %1 సతోషి(లు) మారవచ్చు.</translation>
</message>
@@ -1168,14 +1140,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ఖాళీ వాలెట్‌ని తయారు చేయండి</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">scriptPubKey నిర్వహణ కోసం డిస్క్రిప్టర్‌లను ఉపయోగించండి</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">డిస్క్రిప్టర్ వాలెట్</translation>
- </message>
- <message>
<source>External signer</source>
<translation type="unfinished">బాహ్య సంతకందారు</translation>
</message>
@@ -1184,10 +1148,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">సృష్టించు</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Sqlite మద్దతు లేకుండా కంపైల్ చేయబడింది (డిస్క్రిప్టర్ వాలెట్‌లకు అవసరం)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">బాహ్య సంతకం మద్దతు లేకుండా సంకలనం చేయబడింది (బాహ్య సంతకం కోసం అవసరం)</translation>
@@ -1657,18 +1617,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Tor onion సేవల ద్వారా సహచరులను చేరుకోవడానికి ప్రత్యేక SOCKS&amp;5 ప్రాక్సీని ఉపయోగించండి:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">ఓవర్‌వ్యూ ట్యాబ్‌లో మోనోస్పేస్డ్ ఫాంట్:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">పొందుపరిచారు "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">సన్నిహిత సరిపోలిక "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">&amp;అలాగే</translation>
</message>
@@ -1906,10 +1854,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT డిస్క్‌లో సేవ్ చేయబడింది.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* %1 ని %2 కి పంపుతుంది</translation>
- </message>
- <message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
<translation type="unfinished">లావాదేవీ రుసుము లేదా మొత్తం లావాదేవీ మొత్తాన్ని లెక్కించడం సాధ్యం కాలేదు.</translation>
</message>
@@ -2332,10 +2276,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">దాచు</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">దుమ్ము:</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">కాపీ పరిమాణం</translation>
</message>
@@ -2356,10 +2296,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">బైట్‌లను కాపీ చేయండి</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">దుమ్మును కాపీ చేయండి</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">మార్పుని కాపీ చేయండి</translation>
</message>
@@ -2368,10 +2304,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 (%2 బ్లాక్‌లు)</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">వాలెట్ నుండి '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 కు '%2'</translation>
</message>
@@ -2554,7 +2486,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>WalletFrame</name>
<message>
<source>Create a new wallet</source>
- <translation type="unfinished">కొత్త వాలెట్‌ని సృష్టించండి</translation>
+ <translation type="unfinished">&lt;div&gt;&lt;/div&gt;</translation>
</message>
<message>
<source>Error</source>
@@ -2667,10 +2599,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">లావాదేవీ మార్పు అవుట్‌పుట్ సూచిక పరిధి వెలుపల ఉంది</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">లావాదేవీ మెంపూల్ చైన్‌లో చాలా పొడవుగా ఉంది</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">లావాదేవీకి కనీసం ఒక గ్రహీత ఉండాలి</translation>
</message>
@@ -2747,10 +2675,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">తెలియని కొత్త నియమాలు (వెర్షన్‌బిట్‌ %i)ని యాక్టివేట్ చేశాయి</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">మద్దతు లేని గ్లోబల్ లాగింగ్ స్థాయి -లాగ్‌లెవెల్=%s. చెల్లుబాటు అయ్యే విలువలు: %s.</translation>
- </message>
- <message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">మద్దతు లేని లాగింగ్ వర్గం %s=%s</translation>
</message>
diff --git a/src/qt/locale/bitcoin_th.ts b/src/qt/locale/bitcoin_th.ts
deleted file mode 100644
index 40f8252f22..0000000000
--- a/src/qt/locale/bitcoin_th.ts
+++ /dev/null
@@ -1,798 +0,0 @@
-<TS version="2.1" language="th">
-<context>
- <name>BitcoinApplication</name>
- <message>
- <source>Settings file %1 might be corrupt or invalid.</source>
- <translation type="unfinished">ไฟล์ตั้งค่า%1 อาจเสียหายหรือไม่ถูกต้อง</translation>
- </message>
- </context>
-<context>
- <name>QObject</name>
- <message>
- <source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1 ยังไม่ออกอย่างปลอดภัย...</translation>
- </message>
- <message>
- <source>Inbound</source>
- <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
- <translation type="unfinished">ขาเข้า</translation>
- </message>
- <message>
- <source>Outbound</source>
- <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
- <translation type="unfinished">ขาออก</translation>
- </message>
- <message>
- <source>Manual</source>
- <extracomment>Peer connection type established manually through one of several methods.</extracomment>
- <translation type="unfinished">คู่มือ</translation>
- </message>
- <message numerus="yes">
- <source>%n second(s)</source>
- <translation type="unfinished">
- <numerusform>%n second(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n minute(s)</source>
- <translation type="unfinished">
- <numerusform>%n minute(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n hour(s)</source>
- <translation type="unfinished">
- <numerusform>%n hour(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n day(s)</source>
- <translation type="unfinished">
- <numerusform>%n day(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n week(s)</source>
- <translation type="unfinished">
- <numerusform>%n week(s)</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>%n year(s)</source>
- <translation type="unfinished">
- <numerusform>%n year(s)</numerusform>
- </translation>
- </message>
- <message>
- <source>%1 B</source>
- <translation type="unfinished">%1 ไบต์</translation>
- </message>
- <message>
- <source>%1 kB</source>
- <translation type="unfinished">%1 กิโลไบต์</translation>
- </message>
- <message>
- <source>%1 MB</source>
- <translation type="unfinished">%1 เมกะไบต์</translation>
- </message>
- <message>
- <source>%1 GB</source>
- <translation type="unfinished">%1 จิกะไบต์</translation>
- </message>
-</context>
-<context>
- <name>BitcoinGUI</name>
- <message>
- <source>Connecting to peers…</source>
- <translation type="unfinished">กำลังเชื่อมต่อไปยัง peers…</translation>
- </message>
- <message>
- <source>Request payments (generates QR codes and bitcoin: URIs)</source>
- <translation type="unfinished">ขอการชำระเงิน (สร้างรหัส QR และ bitcoin: URIs)</translation>
- </message>
- <message>
- <source>Show the list of used sending addresses and labels</source>
- <translation type="unfinished">แสดงรายการที่ใช้ในการส่งแอดเดรสและเลเบลที่ใช้แล้ว</translation>
- </message>
- <message>
- <source>Show the list of used receiving addresses and labels</source>
- <translation type="unfinished">แสดงรายการที่ได้ใช้ในการรับแอดเดรสและเลเบล</translation>
- </message>
- <message numerus="yes">
- <source>Processed %n block(s) of transaction history.</source>
- <translation type="unfinished">
- <numerusform>Processed %n block(s) of transaction history.</numerusform>
- </translation>
- </message>
- <message>
- <source>%1 behind</source>
- <translation type="unfinished">%1 เบื้องหลัง</translation>
- </message>
- <message>
- <source>Catching up…</source>
- <translation type="unfinished">กำลังติดตามถึงรายการล่าสุด…</translation>
- </message>
- <message>
- <source>Last received block was generated %1 ago.</source>
- <translation type="unfinished">บล็อกที่ได้รับล่าสุดถูกสร้างขึ้นเมื่อ %1 ที่แล้ว</translation>
- </message>
- <message>
- <source>Transactions after this will not yet be visible.</source>
- <translation type="unfinished">ธุรกรรมหลังจากนี้จะยังไม่ปรากฏให้เห็น</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">ข้อผิดพลาด</translation>
- </message>
- <message>
- <source>Warning</source>
- <translation type="unfinished">คำเตือน</translation>
- </message>
- <message>
- <source>Information</source>
- <translation type="unfinished">ข้อมูล</translation>
- </message>
- <message>
- <source>Up to date</source>
- <translation type="unfinished">ปัจจุบัน</translation>
- </message>
- <message>
- <source>Restore Wallet…</source>
- <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
- <translation type="unfinished">กู้คืนวอลเล็ต…</translation>
- </message>
- <message>
- <source>Restore a wallet from a backup file</source>
- <extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">กู้คืนวอลเล็ตจากไฟล์สำรองข้อมูล</translation>
- </message>
- <message>
- <source>Close all wallets</source>
- <translation type="unfinished">ปิดกระเป๋าสตางค์ทั้งหมด</translation>
- </message>
- <message>
- <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">แสดง %1 ข้อความช่วยเหลือ เพื่อแสดงรายการ ตัวเลือกที่เป็นไปได้สำหรับ Bitcoin command-line</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">กระเป๋าสตางค์เริ่มต้น</translation>
- </message>
- <message>
- <source>No wallets available</source>
- <translation type="unfinished">ไม่มีกระเป๋าสตางค์</translation>
- </message>
- <message>
- <source>Load Wallet Backup</source>
- <extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">โหลดสำรองข้อมูลวอลเล็ต</translation>
- </message>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">กู้คืนวอลเล็ต</translation>
- </message>
- <message numerus="yes">
- <source>%n active connection(s) to Bitcoin network.</source>
- <extracomment>A substring of the tooltip.</extracomment>
- <translation type="unfinished">
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
- </translation>
- </message>
- <message>
- <source>Click for more actions.</source>
- <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
- <translation type="unfinished">คลิกเพื่อดูการดำเนินการเพิ่มเติม</translation>
- </message>
- </context>
-<context>
- <name>UnitDisplayStatusBarControl</name>
- <message>
- <source>Unit to show amounts in. Click to select another unit.</source>
- <translation type="unfinished">หน่วยแสดงจำนวนเงิน คลิกเพื่อเลือกหน่วยอื่น</translation>
- </message>
-</context>
-<context>
- <name>CoinControlDialog</name>
- <message>
- <source>L&amp;ock unspent</source>
- <translation type="unfinished">L&amp;ock ที่ไม่ได้ใข้</translation>
- </message>
- <message>
- <source>&amp;Unlock unspent</source>
- <translation type="unfinished">&amp;ปลดล็อค ที่ไม่ไดใช้</translation>
- </message>
- </context>
-<context>
- <name>LoadWalletsActivity</name>
- <message>
- <source>Load Wallets</source>
- <extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
- <translation type="unfinished">โหลด วอลเล็ต</translation>
- </message>
- <message>
- <source>Loading wallets…</source>
- <extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
- <translation type="unfinished">กำลังโหลด วอลเล็ต...</translation>
- </message>
-</context>
-<context>
- <name>OpenWalletActivity</name>
- <message>
- <source>Open wallet failed</source>
- <translation type="unfinished">เปิด วอลเล็ต ล้มเหลว</translation>
- </message>
- <message>
- <source>Open wallet warning</source>
- <translation type="unfinished">คำเตือน การเปิด วอลเล็ต</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">วอลเล็ต เริ่มต้น</translation>
- </message>
- <message>
- <source>Open Wallet</source>
- <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">เปิด วอลเล็ต</translation>
- </message>
- <message>
- <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
- <translation type="unfinished">กำลังเปิด วอลเล็ต &lt;b&gt;%1&lt;/b&gt;…</translation>
- </message>
-</context>
-<context>
- <name>RestoreWalletActivity</name>
- <message>
- <source>Restore Wallet</source>
- <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">กู้คืนวอลเล็ต</translation>
- </message>
- <message>
- <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
- <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">ทำการกู้คืนวอลเล็ต &lt;b&gt;%1&lt;/b&gt;…</translation>
- </message>
- <message>
- <source>Restore wallet failed</source>
- <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">การกู้คืนวอลเล็ตล้มเหลว</translation>
- </message>
- <message>
- <source>Restore wallet warning</source>
- <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
- <translation type="unfinished">คำเตือนการกู้คืนวอลเล็ต</translation>
- </message>
- <message>
- <source>Restore wallet message</source>
- <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">ข้อความการกู้คืนวอลเล็ต</translation>
- </message>
-</context>
-<context>
- <name>WalletController</name>
- <message>
- <source>Close wallet</source>
- <translation type="unfinished">ปิดกระเป๋าสตางค์</translation>
- </message>
- <message>
- <source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">คุณ แน่ใจ หรือไม่ว่า ต้องการ ปิด วอลเล็ต &lt;i&gt;%1&lt;/i&gt;?</translation>
- </message>
- <message>
- <source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
- <translation type="unfinished">Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled</translation>
- </message>
- <message>
- <source>Close all wallets</source>
- <translation type="unfinished">ปิด วอลเล็ต ทั้งหมด</translation>
- </message>
- <message>
- <source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">คุณ แน่ใจ หรือไม่ว่า ต้องการ ปิด วอลเล็ต ทั้งหมด?</translation>
- </message>
-</context>
-<context>
- <name>CreateWalletDialog</name>
- <message>
- <source>Create Wallet</source>
- <translation type="unfinished">สร้าง วอลเล็ต</translation>
- </message>
- <message>
- <source>Wallet Name</source>
- <translation type="unfinished">ชื่อ วอลเล็ต</translation>
- </message>
- <message>
- <source>Wallet</source>
- <translation type="unfinished">วอลเล็ต</translation>
- </message>
- <message>
- <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">เข้ารหัส วอลเล็ต วอลเล็ต จะถูก เข้ารหัส ด้วย พาสเฟส ที่ คุณ เลือก</translation>
- </message>
- <message>
- <source>Encrypt Wallet</source>
- <translation type="unfinished">เข้ารหัส วอลเล็ต</translation>
- </message>
- <message>
- <source>Advanced Options</source>
- <translation type="unfinished">ตัวเลือก ขั้นสูง</translation>
- </message>
- <message>
- <source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets</translation>
- </message>
- <message>
- <source>Disable Private Keys</source>
- <translation type="unfinished">ปิดใช้งาน คีย์ ส่วนตัว</translation>
- </message>
- <message>
- <source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
- <translation type="unfinished">Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time</translation>
- </message>
- <message>
- <source>Make Blank Wallet</source>
- <translation type="unfinished">ทำ วอลเล็ต ให้ว่างเปล่า</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">ตัวอธิบาย วอลเล็ต</translation>
- </message>
- <message>
- <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
- <translation type="unfinished">Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first</translation>
- </message>
- </context>
-<context>
- <name>EditAddressDialog</name>
- <message>
- <source>Edit Address</source>
- <translation type="unfinished">แก้ไข แอดเดรส</translation>
- </message>
- <message>
- <source>&amp;Label</source>
- <translation type="unfinished">&amp;เลเบล</translation>
- </message>
- <message>
- <source>The label associated with this address list entry</source>
- <translation type="unfinished">รายการ แสดง เลเบล ที่ เกี่ยวข้องกับ ที่เก็บ นี้</translation>
- </message>
- <message>
- <source>&amp;Address</source>
- <translation type="unfinished">&amp;แอดเดรส</translation>
- </message>
- <message>
- <source>New sending address</source>
- <translation type="unfinished">แอดเดรส การส่ง ใหม่</translation>
- </message>
- <message>
- <source>Edit receiving address</source>
- <translation type="unfinished">แก้ไข แอดเดรส การรับ</translation>
- </message>
- <message>
- <source>Edit sending address</source>
- <translation type="unfinished">แก้ไข แอดเดรส การส่ง</translation>
- </message>
- <message>
- <source>The entered address "%1" is not a valid Bitcoin address.</source>
- <translation type="unfinished">แอดเดรส ที่ป้อน "%1" เป็น Bitcoin แอดเดรส ที่ ไม่ ถูกต้อง</translation>
- </message>
- <message>
- <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
- <translation type="unfinished">Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address</translation>
- </message>
- <message>
- <source>The entered address "%1" is already in the address book with label "%2".</source>
- <translation type="unfinished">The entered address "%1" is already in the address book with label "%2"</translation>
- </message>
- <message>
- <source>Could not unlock wallet.</source>
- <translation type="unfinished">ไม่สามารถปลดล็อกวอลเล็ตได้</translation>
- </message>
- <message>
- <source>New key generation failed.</source>
- <translation type="unfinished">การสร้างคีย์ใหม่ล้มเหลว</translation>
- </message>
-</context>
-<context>
- <name>FreespaceChecker</name>
- <message>
- <source>A new data directory will be created.</source>
- <translation type="unfinished">ไดเร็กทอรีข้อมูลใหม่จะถูกสร้างขึ้น</translation>
- </message>
- <message>
- <source>Cannot create data directory here.</source>
- <translation type="unfinished">ไม่สามารถสร้างไดเร็กทอรีข้อมูลที่นี่</translation>
- </message>
-</context>
-<context>
- <name>Intro</name>
- <message numerus="yes">
- <source>%n GB of space available</source>
- <translation type="unfinished">
- <numerusform>มีพื้นที่ว่าง %n GB ที่ใช้งานได้</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>(of %n GB needed)</source>
- <translation type="unfinished">
- <numerusform>(ต้องการพื้นที่ %n GB )</numerusform>
- </translation>
- </message>
- <message numerus="yes">
- <source>(%n GB needed for full chain)</source>
- <translation type="unfinished">
- <numerusform>(%n GB needed for full chain)</numerusform>
- </translation>
- </message>
- <message>
- <source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
- <translation type="unfinished">At least %1 GB of data will be stored in this directory, and it will grow over time</translation>
- </message>
- <message>
- <source>Approximately %1 GB of data will be stored in this directory.</source>
- <translation type="unfinished">ข้อมูลประมาณ %1 GB จะถูกเก็บไว้ในไดเร็กทอรีนี้</translation>
- </message>
- <message numerus="yes">
- <source>(sufficient to restore backups %n day(s) old)</source>
- <extracomment>Explanatory text on the capability of the current prune target.</extracomment>
- <translation type="unfinished">
- <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
- </translation>
- </message>
- <message>
- <source>%1 will download and store a copy of the Bitcoin block chain.</source>
- <translation type="unfinished">%1 จะดาวน์โหลดและจัดเก็บสำเนาของบล็อกเชน Bitcoin</translation>
- </message>
- <message>
- <source>The wallet will also be stored in this directory.</source>
- <translation type="unfinished"> วอลเล็ตจะถูกเก็บใว้ในไดเร็กทอรีนี้เช่นกัน</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">ข้อผิดพลาด</translation>
- </message>
- <message>
- <source>Welcome</source>
- <translation type="unfinished">ยินดีต้อนรับ</translation>
- </message>
- <message>
- <source>Welcome to %1.</source>
- <translation type="unfinished">ยินดีต้อนรับเข้าสู่ %1.</translation>
- </message>
- <message>
- <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
- <translation type="unfinished">เนื่องจากนี่เป็นครั้งแรกที่โปรแกรมเปิดตัว คุณสามารถเลือกได้ว่า %1 จะเก็บข้อมูลไว้ที่ใด</translation>
- </message>
- <message>
- <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
- <translation type="unfinished">Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features</translation>
- </message>
- <message>
- <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
- <translation type="unfinished">This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off</translation>
- </message>
- <message>
- <source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
- <translation type="unfinished">If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low</translation>
- </message>
- <message>
- <source>Use the default data directory</source>
- <translation type="unfinished">ใช้ ไดเรกทอรี ข้อมูล เริ่มต้น</translation>
- </message>
- <message>
- <source>Use a custom data directory:</source>
- <translation type="unfinished">ใช้ ไดเรกทอรี ข้อมูล ที่กำหนดเอง:</translation>
- </message>
-</context>
-<context>
- <name>HelpMessageDialog</name>
- <message>
- <source>version</source>
- <translation type="unfinished">เวอร์ชัน</translation>
- </message>
- <message>
- <source>About %1</source>
- <translation type="unfinished">เกี่ยวกับ %1</translation>
- </message>
- <message>
- <source>Command-line options</source>
- <translation type="unfinished">ตัวเลือก Command-line </translation>
- </message>
-</context>
-<context>
- <name>ShutdownWindow</name>
- <message>
- <source>%1 is shutting down…</source>
- <translation type="unfinished">%1 กำลังถูกปิดลง…</translation>
- </message>
- <message>
- <source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">อย่าปิดเครื่องคอมพิวเตอร์จนกว่าหน้าต่างนี้จะหายไป</translation>
- </message>
-</context>
-<context>
- <name>ModalOverlay</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">รูปแบบ</translation>
- </message>
- <message>
- <source>Number of blocks left</source>
- <translation type="unfinished">ตัวเลข ของ บล็อก ที่เหลือ</translation>
- </message>
- <message>
- <source>Unknown…</source>
- <translation type="unfinished">ไม่รู้จัก…</translation>
- </message>
- <message>
- <source>calculating…</source>
- <translation type="unfinished">กำลังคำนวณ…</translation>
- </message>
- <message>
- <source>Last block time</source>
- <translation type="unfinished">บล็อกเวลาล่าสุด</translation>
- </message>
- <message>
- <source>Progress increase per hour</source>
- <translation type="unfinished">ความคืบหน้าเพิ่มขึ้นต่อชั่วโมง</translation>
- </message>
- <message>
- <source>Estimated time left until synced</source>
- <translation type="unfinished">เวลาโดยประมาณที่เหลือจนกว่าจะซิงค์</translation>
- </message>
- </context>
-<context>
- <name>OptionsDialog</name>
- <message>
- <source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
- <extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
- <translation type="unfinished">ขนาดแคชฐานข้อมูลสูงสุด แคชที่ใหญ่ขึ้นสามารถนำไปสู่การซิงค์ได้เร็วยิ่งขึ้น หลังจากนั้นประโยชน์จะเด่นชัดน้อยลงสำหรับกรณีการใช้งานส่วนใหญ่ การลดขนาดแคชจะลดการใช้หน่วยความจำ มีการแชร์หน่วยความจำ mempool ที่ไม่ได้ใช้สำหรับแคชนี้</translation>
- </message>
- <message>
- <source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
- <extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
- <translation type="unfinished">กำหนดจำนวนเธรดการตรวจสอบสคริปต์ ค่าลบสอดคล้องกับจำนวนคอร์ที่คุณต้องการปล่อยให้ระบบว่าง</translation>
- </message>
- <message>
- <source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
- <extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
- <translation type="unfinished">สิ่งนี้ช่วยให้คุณหรือเครื่องมือของบุคคลที่สามสามารถสื่อสารกับโหนดผ่านคำสั่งบรรทัดคำสั่งและ JSON-RPC</translation>
- </message>
- <message>
- <source>Enable R&amp;PC server</source>
- <extracomment>An Options window setting to enable the RPC server.</extracomment>
- <translation type="unfinished">เปิดใช้งานเซิร์ฟเวอร์ R&amp;PC</translation>
- </message>
- <message>
- <source>W&amp;allet</source>
- <translation type="unfinished">ว&amp;อลเล็ต</translation>
- </message>
- <message>
- <source>Enable &amp;PSBT controls</source>
- <extracomment>An options window setting to enable PSBT controls.</extracomment>
- <translation type="unfinished">เปิดใช้งานการควบคุม &amp;PSBT</translation>
- </message>
- <message>
- <source>External Signer (e.g. hardware wallet)</source>
- <translation type="unfinished">ผู้ลงนามภายนอก (เช่น ฮาร์ดแวร์วอลเล็ต)</translation>
- </message>
- <message>
- <source>Error</source>
- <translation type="unfinished">ข้อผิดพลาด</translation>
- </message>
- </context>
-<context>
- <name>OverviewPage</name>
- <message>
- <source>Form</source>
- <translation type="unfinished">รูปแบบ</translation>
- </message>
- <message>
- <source>Available:</source>
- <translation type="unfinished">พร้อมใช้งาน:</translation>
- </message>
- </context>
-<context>
- <name>PSBTOperationsDialog</name>
- <message>
- <source>PSBT copied to clipboard.</source>
- <translation type="unfinished">PSBT คัดลอกไปยังคลิปบอร์ดแล้ว</translation>
- </message>
- <message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * ส่ง %1 ถึง %2</translation>
- </message>
- <message>
- <source>Transaction has %1 unsigned inputs.</source>
- <translation type="unfinished">ธุรกรรมมี %1 อินพุตที่ไม่ได้ลงนาม</translation>
- </message>
- </context>
-<context>
- <name>PeerTableModel</name>
- <message>
- <source>Peer</source>
- <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
- <translation type="unfinished">เพียร์</translation>
- </message>
- <message>
- <source>Age</source>
- <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">อายุ</translation>
- </message>
- <message>
- <source>Inbound</source>
- <extracomment>An Inbound Connection from a Peer.</extracomment>
- <translation type="unfinished">ขาเข้า</translation>
- </message>
- <message>
- <source>Outbound</source>
- <extracomment>An Outbound Connection to a Peer.</extracomment>
- <translation type="unfinished">ขาออก</translation>
- </message>
-</context>
-<context>
- <name>RPCConsole</name>
- <message>
- <source>Memory Pool</source>
- <translation type="unfinished">พูลเมมโมรี่</translation>
- </message>
- <message>
- <source>Memory usage</source>
- <translation type="unfinished">การใช้เมมโมรี่</translation>
- </message>
- <message>
- <source>High Bandwidth</source>
- <translation type="unfinished">แบนด์วิดท์สูง</translation>
- </message>
- <message>
- <source>Connection Time</source>
- <translation type="unfinished">เวลาในการเชื่อมต่อ</translation>
- </message>
- <message>
- <source>Last Send</source>
- <translation type="unfinished">การส่งล่าสุด</translation>
- </message>
- <message>
- <source>Last Receive</source>
- <translation type="unfinished">การรับล่าสุด</translation>
- </message>
- <message>
- <source>Ping Time</source>
- <translation type="unfinished">เวลาในการ Ping</translation>
- </message>
- <message>
- <source>Ping Wait</source>
- <translation type="unfinished">คอยในการ Ping</translation>
- </message>
- <message>
- <source>Min Ping</source>
- <translation type="unfinished">วินาทีในการ Ping</translation>
- </message>
- <message>
- <source>Debug log file</source>
- <translation type="unfinished">ไฟล์บันทึกการดีบัก</translation>
- </message>
- <message>
- <source>Inbound: initiated by peer</source>
- <extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">ขาเข้า: เริ่มต้นด้วย peer</translation>
- </message>
- <message>
- <source>Outbound Full Relay: default</source>
- <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
- <translation type="unfinished">ขาออก Full Relay: ค่าเริ่มต้น</translation>
- </message>
- </context>
-<context>
- <name>ReceiveRequestDialog</name>
- <message>
- <source>Payment information</source>
- <translation type="unfinished">ข้อมูการชำระเงิน</translation>
- </message>
- </context>
-<context>
- <name>SendCoinsDialog</name>
- <message>
- <source>%1 (%2 blocks)</source>
- <translation type="unfinished">%1 (%2 บล็อก)</translation>
- </message>
- <message>
- <source>Sign on device</source>
- <extracomment>"device" usually means a hardware wallet.</extracomment>
- <translation type="unfinished">ลงชื่อบนอุปกรณ์</translation>
- </message>
- <message>
- <source>Please, review your transaction.</source>
- <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
- <translation type="unfinished">โปรดตรวจสอบธุรกรรมของคุณ</translation>
- </message>
- <message numerus="yes">
- <source>Estimated to begin confirmation within %n block(s).</source>
- <translation type="unfinished">
- <numerusform>Estimated to begin confirmation within %n block(s).</numerusform>
- </translation>
- </message>
- <message>
- <source>Confirm custom change address</source>
- <translation type="unfinished">ยืนยันการเปลี่ยนแปลงแอดเดรสที่กำหนดเอง</translation>
- </message>
- </context>
-<context>
- <name>SignVerifyMessageDialog</name>
- <message>
- <source>Please check the signature and try again.</source>
- <translation type="unfinished">โปรดตรวจสอบลายเซ็นต์และลองใหม่อีกครั้ง</translation>
- </message>
- </context>
-<context>
- <name>TransactionDesc</name>
- <message>
- <source>conflicted with a transaction with %1 confirmations</source>
- <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
- <translation type="unfinished">ขัดแย้งกับการทำธุรกรรมกับ %1 การยืนยัน</translation>
- </message>
- <message numerus="yes">
- <source>matures in %n more block(s)</source>
- <translation type="unfinished">
- <numerusform>matures in %n more block(s)</numerusform>
- </translation>
- </message>
- </context>
-<context>
- <name>TransactionView</name>
- <message>
- <source>Exporting Successful</source>
- <translation type="unfinished">ส่งออกสำเร็จ</translation>
- </message>
- </context>
-<context>
- <name>WalletFrame</name>
- <message>
- <source>Error</source>
- <translation type="unfinished">ข้อผิดพลาด</translation>
- </message>
- <message>
- <source>Partially Signed Transaction (*.psbt)</source>
- <translation type="unfinished">ธุรกรรมที่ลงนามบางส่วน (*.psbt)</translation>
- </message>
- <message>
- <source>PSBT file must be smaller than 100 MiB</source>
- <translation type="unfinished">ไฟล์ PSBT ต้องมีขนาดเล็กกว่า 100 MiB</translation>
- </message>
- <message>
- <source>Unable to decode PSBT</source>
- <translation type="unfinished">ไม่สามารถถอดรหัส PSBT</translation>
- </message>
-</context>
-<context>
- <name>WalletModel</name>
- <message>
- <source>Confirm fee bump</source>
- <translation type="unfinished">ยืนยันค่าธรรมเนียมที่เพิ่มขึ้น</translation>
- </message>
- <message>
- <source>default wallet</source>
- <translation type="unfinished">วอลเล็ต เริ่มต้น</translation>
- </message>
-</context>
-<context>
- <name>bitcoin-core</name>
- <message>
- <source>%s is set very high!</source>
- <translation type="unfinished">%s ตั้งไว้สูงมาก</translation>
- </message>
- <message>
- <source>Error: This wallet already uses SQLite</source>
- <translation type="unfinished">ข้อผิดพลาด: วอลเล็ตนี้ใช้ SQLite อยู่แล้ว</translation>
- </message>
- <message>
- <source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">ข้อผิดพลาด: ไม่สามารถสำรองข้อมูลของวอลเล็ตได้</translation>
- </message>
- <message>
- <source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">ข้อผิดพลาด: ไม่สามารถอ่านข้อมูลทั้งหมดในฐานข้อมูลได้</translation>
- </message>
- </context>
-</TS> \ No newline at end of file
diff --git a/src/qt/locale/bitcoin_tk.ts b/src/qt/locale/bitcoin_tk.ts
index b06d122ffa..0afd01fd71 100644
--- a/src/qt/locale/bitcoin_tk.ts
+++ b/src/qt/locale/bitcoin_tk.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">S&amp;aýla</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Iberýän salgylar</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Kabul edýän salgylar</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Tölegleri ibermek üçin siziň Bitkoin salgylaryňyz şulardyr. Teňňeleri ibermezden ozal hemişe möçberi we kabul edýän salgyny barlaň.</translation>
</message>
@@ -224,10 +216,22 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Gapjygyň şifrini açmak üçin ýazylan parol sözlemi nädogry.</translation>
</message>
<message>
+ <source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
+ <translation type="unfinished">Gapjygyň şifrini açmak üçin ýazylan parol sözlemi nädogry. Onda nol belgi bar (meselem, nol baýt). Eger parol sözlemi bu programmanyň 25.0-dan ozalky wersiýasynda bellenen bolsa, diňe birinji nol belgä çenli, ýöne ony goşman täzeden synanyşyň. Eger şowly netijelense, indikide bu mesele bilen çaknyşmaz ýaly täze parol sözlemini belläň.</translation>
+ </message>
+ <message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">Gapjygyň parol sözlemi üstünlikli çalşyldy.</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">Parol sözlemini üýtgedip bolmady</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">Gapjygy şifrlemek üçin girizilen öňki parol sözlemi dogry däl. Onda nol belgi bar ( meselem, nol baýt). Eger parol sözlemi bu programmanyň 25.0-dan ozalky wersiýasynda bellenen bolsa, diňe birinji nol belgä çenli we bu nol belgini goşmazdan belgiler bilen gaýtadan synanyşyň.</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">Duýduryş: Caps Lock düwmesi açyk!</translation>
</message>
@@ -242,6 +246,10 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<context>
<name>BitcoinApplication</name>
<message>
+ <source>Settings file %1 might be corrupt or invalid.</source>
+ <translation type="unfinished">%1 Sazlamalar faýly bozulan ýa-da ýalňyş.</translation>
+ </message>
+ <message>
<source>Runaway exception</source>
<translation type="unfinished">Dolandyryp bolmaýan ýagdaý</translation>
</message>
@@ -279,49 +287,116 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">%1 entek ygtybarly çykmady...</translation>
</message>
<message>
+ <source>unknown</source>
+ <translation type="unfinished">näbelli</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Möçber</translation>
</message>
+ <message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">(Bitkoin salgysyny giriziň (meselem, %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">Marşrutlaşdyryp bolmaýan</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
+ <translation type="unfinished">Girýän</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">Çykýan</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">Doly ýaýlyma geçiriji</translation>
+ </message>
+ <message>
+ <source>Block Relay</source>
+ <extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">Blok ýaýlyma geçiriji</translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <extracomment>Peer connection type established manually through one of several methods.</extracomment>
+ <translation type="unfinished">Elden</translation>
+ </message>
+ <message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">Barlag</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">Salgy almak</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 g</translation>
+ </message>
+ <message>
+ <source>%1 h</source>
+ <translation type="unfinished">%1 sag</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">ýok</translation>
+ </message>
+ <message>
+ <source>N/A</source>
+ <translation type="unfinished">Elýeter däl</translation>
+ </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n sekund</numerusform>
+ <numerusform>%n sekund</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n minut</numerusform>
+ <numerusform>%n minut</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n sagat</numerusform>
+ <numerusform>%n sagat</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n gün</numerusform>
+ <numerusform>%n gün</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n hepde</numerusform>
+ <numerusform>%n hepde</numerusform>
</translation>
</message>
+ <message>
+ <source>%1 and %2</source>
+ <translation type="unfinished">%1 we %2</translation>
+ </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n ýyl</numerusform>
+ <numerusform>%n ýyl</numerusform>
</translation>
</message>
</context>
@@ -604,6 +679,16 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Gapjygy ýap</translation>
</message>
<message>
+ <source>Restore Wallet…</source>
+ <extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
+ <translation type="unfinished">Gapjygy dikelt…</translation>
+ </message>
+ <message>
+ <source>Restore a wallet from a backup file</source>
+ <extracomment>Status tip for Restore Wallet menu item</extracomment>
+ <translation type="unfinished">Gapjygy ätiýaçlandyryş faýlyndan dikelt</translation>
+ </message>
+ <message>
<source>Close all wallets</source>
<translation type="unfinished">Ähli gapjyklary ýap</translation>
</message>
@@ -628,6 +713,21 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Elýeterli gapjyk ýok</translation>
</message>
<message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Gapjyk maglumatlary</translation>
+ </message>
+ <message>
+ <source>Load Wallet Backup</source>
+ <extracomment>The title for Restore Wallet File Windows</extracomment>
+ <translation type="unfinished">Gapjygyň ätiýaçlyk nusgasyny ýükle</translation>
+ </message>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
+ <translation type="unfinished">Gapjygy dikeltmek</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
<translation type="unfinished">Gapjygyň ady</translation>
@@ -685,6 +785,10 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Ulgamyň işjeňligini aç</translation>
</message>
<message>
+ <source>Pre-syncing Headers (%1%)…</source>
+ <translation type="unfinished">Baş atlar deslapdan sinhronlaşdyrylýar (%1%)…</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Ýalňyşlyk: %1</translation>
</message>
@@ -791,10 +895,6 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Gatanç:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Toz:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Soňundan gatanç:</translation>
</message>
@@ -883,10 +983,6 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Baýtlary göçür</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Tozy göçür</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Gaýtargyny göçür</translation>
</message>
@@ -895,18 +991,6 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">(%1 gulply)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">hawa</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ýok</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Islendik kabul ediji häzirki toz çäginden has kiçi möçberi kabul edip alsa, bu bellik gyzyla öwrülýär.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Her giriş üçin +/- %1 satosi üýtgäp biler.</translation>
</message>
@@ -947,7 +1031,24 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<source>Can't list signers</source>
<translation type="unfinished">Gol çekenleriň sanawyny görkezip bolanok</translation>
</message>
- </context>
+ <message>
+ <source>Too many external signers found</source>
+ <translation type="unfinished">Aşa köp daşyndan gol çeken tapyldy</translation>
+ </message>
+</context>
+<context>
+ <name>LoadWalletsActivity</name>
+ <message>
+ <source>Load Wallets</source>
+ <extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
+ <translation type="unfinished">Gapjyklary ýüklemek</translation>
+ </message>
+ <message>
+ <source>Loading wallets…</source>
+ <extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
+ <translation type="unfinished">Gapjyklar ýüklenýär...</translation>
+ </message>
+</context>
<context>
<name>OpenWalletActivity</name>
<message>
@@ -974,6 +1075,34 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
</message>
</context>
<context>
+ <name>RestoreWalletActivity</name>
+ <message>
+ <source>Restore Wallet</source>
+ <extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
+ <translation type="unfinished">Gapjygy dikeltmek</translation>
+ </message>
+ <message>
+ <source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
+ <translation type="unfinished">&lt;b&gt;%1&lt;/b&gt; Gapjyk dikeldilýär…</translation>
+ </message>
+ <message>
+ <source>Restore wallet failed</source>
+ <extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
+ <translation type="unfinished">Gapjygy dikeldip bolmady</translation>
+ </message>
+ <message>
+ <source>Restore wallet warning</source>
+ <extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
+ <translation type="unfinished">Gapjyk dikeltme duýduryşy</translation>
+ </message>
+ <message>
+ <source>Restore wallet message</source>
+ <extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
+ <translation type="unfinished">Gapjygy dikeltme habary</translation>
+ </message>
+</context>
+<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
@@ -1039,14 +1168,6 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Boş gapjyk emele getir</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">scriptPubKey dolandyryşy üçin beýan edijileri ulan</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Beýan ediji gapjyk</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Enjam gapjygy ýaly daşyndan gol çekilýän enjamy ulan. Ilki bilen gapjygyň ileri tutmalarynda daşyndan gol çekiji skriptini sazla.</translation>
</message>
@@ -1059,10 +1180,6 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Döret</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Sqlite goldawsyz (beýan ediji gapjyklar üçin gerek) düzüldi</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Daşyndan gol çekmek üçin goldawsyz (daşyndan gol çekmek üçin gerek) düzüldi</translation>
@@ -1155,25 +1272,29 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>%n GB ýer elýeter</numerusform>
+ <numerusform>%n GB ýer elýeter</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>(zerur bolan %n GB-den)</numerusform>
+ <numerusform>(zerur bolan %n GB-den)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
- <numerusform />
- <numerusform />
+ <numerusform>(Doly zynjyr üçin %n GB zerur)</numerusform>
+ <numerusform>(Doly zynjyr üçin %n GB zerur)</numerusform>
</translation>
</message>
<message>
+ <source>Choose data directory</source>
+ <translation type="unfinished">Maglumat katalogyny saýlaň</translation>
+ </message>
+ <message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
<translation type="unfinished">Bu sanawda azyndan %1 GB maglumat saklanar we ol wagtyň geçmegi bilen köpeler.</translation>
</message>
@@ -1234,6 +1355,10 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Bu başdaky utgaşdyrma örän çylşyrymlydyr we kompýuteriňiziň ozal üns berilmedik enjam näsazlyklaryny ýüze çykaryp biler. Her sapar %1 işledeniňizde ol säginen ýerinden ýükläp almaga dowam eder.</translation>
</message>
<message>
+ <source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
+ <translation type="unfinished">OK basanyňyzda, %1%4 başda işledilende %3-däki iň irki amallardan başlap doly %4blok zynjyryny (%2 GB) ýükläp we işläp başlar.</translation>
+ </message>
+ <message>
<source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
<translation type="unfinished">Blok zynjyrynyň saklanyşyny çäklendirmegi (kesip aýyrmagy) saýlan bolsaňyz, geçmiş maglumatlary ýene-de ýüklenip alynmaly we işlenmelidir, emma diskiňiziň ulanylyşyny azaltmak üçin soňundan pozular. </translation>
</message>
@@ -1286,45 +1411,917 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
<translation type="unfinished">Entek görkezilmedik geleşikleriň täsirine düşen bitkoinleri sarp etmek synanyşygy ulgam tarapyndan kabul edilmez.</translation>
</message>
- </context>
+ <message>
+ <source>Number of blocks left</source>
+ <translation type="unfinished">Galan bloklaryň sany</translation>
+ </message>
+ <message>
+ <source>Unknown…</source>
+ <translation type="unfinished">Näbelli...</translation>
+ </message>
+ <message>
+ <source>calculating…</source>
+ <translation type="unfinished">hasaplanýar...</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">Soňky blok wagty</translation>
+ </message>
+ <message>
+ <source>Progress increase per hour</source>
+ <translation type="unfinished">Progressiň sagatlaýyn ulalmagy</translation>
+ </message>
+ <message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">Sinhronlaşdyrmaga çenli takmynan galan wagt</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">Gizle</translation>
+ </message>
+ <message>
+ <source>Esc</source>
+ <translation type="unfinished">Aýyr</translation>
+ </message>
+ <message>
+ <source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
+ <translation type="unfinished">%1häzir sinhronlaşdyrylýar. Ol düwünlerden baş atlary we bloklary ýükläp alar we blok zynjyrynyň ujuna ýetýänçä olary barlar.</translation>
+ </message>
+ <message>
+ <source>Unknown. Syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Näbelli. (%1, %2 %) Baş atlar sinhronlaşdyrylýar...</translation>
+ </message>
+ <message>
+ <source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">Näbelli. (%1, %2 %) Baş atlar deslapdan sinhronlaşdyrylýar...</translation>
+ </message>
+</context>
+<context>
+ <name>OpenURIDialog</name>
+ <message>
+ <source>Open bitcoin URI</source>
+ <translation type="unfinished">Bitkoin URI aç</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">Salgyny alyş-çalyş tagtasyna giriz</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
+ <source>Options</source>
+ <translation type="unfinished">Opsiýalar</translation>
+ </message>
+ <message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">&amp;Esasy</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">Ulgama hasaba girilenden soň %1awtomatiki usulda başlat.</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation type="unfinished">&amp;Ulgama hasaba girilende %1 başlat</translation>
+ </message>
+ <message>
+ <source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
+ <translation type="unfinished">Kesmäniň açylmagy amallary saklamak üçin diskdäki boş ýer zerurlygyny düýpli azaldar. Bloklar öňküsi ýaly doly barlanar. Bu sazlamanyň öňki ýagdaýyna gaýtarylmagy tutuş blok zynjyrynyň gaýtadan ýüklenip alynmagyna getirer.</translation>
+ </message>
+ <message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">&amp;maglumat binýady keşiniň göwrümi</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">Skript &amp;tassyklama düzümleriniň sany</translation>
+ </message>
+ <message>
+ <source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
+ <translation type="unfinished">%1 gabat gelýän skripte doly ýol (meselem, C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Ägä boluň: zyýanly programmalar teňňeleriňizi ogurlap biler!</translation>
+ </message>
+ <message>
+ <source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
+ <translation type="unfinished">Proksiniň IP salgysy (meselem, IPv4: 127.0.0.1 / IPv6: ::1)</translation>
+ </message>
+ <message>
+ <source>Shows if the supplied default SOCKS5 proxy is used to reach peers via this network type.</source>
+ <translation type="unfinished">Bu tor görnüşiniň üsti bilen düwünlere aralaşmak üçin üpjün edilen belli SOCKS5 proksisiniň ulanylandygyny ýa-da ulanylmandygyny görkezýär.</translation>
+ </message>
+ <message>
+ <source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
+ <translation type="unfinished">Penjire ýapykka ykjam programmadan çykmagyň deregine kiçeldýär. Bu opsiýa işjeň wagty ykjam programma diňe menýudan Çyk saýlanandan soň ýapylar.</translation>
+ </message>
+ <message>
+ <source>Options set in this dialog are overridden by the command line:</source>
+ <translation type="unfinished">Bu gepleşikde bellenen opsiýalar tabşyryk setiri arkaly täzeden bellendi:</translation>
+ </message>
+ <message>
+ <source>Open the %1 configuration file from the working directory.</source>
+ <translation type="unfinished">Işleýän sanawdan %1 konfigurasiýa faýlyny açyň.</translation>
+ </message>
+ <message>
+ <source>Open Configuration File</source>
+ <translation type="unfinished">Konfigurasiýa faýlyny aç</translation>
+ </message>
+ <message>
+ <source>Reset all client options to default.</source>
+ <translation type="unfinished">Ähli müşderi opsiýalaryny başdaka geçir.</translation>
+ </message>
+ <message>
+ <source>&amp;Reset Options</source>
+ <translation type="unfinished">&amp;Opsiýalary başdaka belle</translation>
+ </message>
+ <message>
+ <source>&amp;Network</source>
+ <translation type="unfinished">&amp;Tor</translation>
+ </message>
+ <message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">&amp;Blok goruny çäklendir</translation>
+ </message>
+ <message>
+ <source>GB</source>
+ <translation type="unfinished">GB çenli</translation>
+ </message>
+ <message>
+ <source>Reverting this setting requires re-downloading the entire blockchain.</source>
+ <translation type="unfinished">Bu sazlama gaýdyp barmak üçin tutuş blok zynjyryny gaýtadan ýükläp almak zerur.</translation>
+ </message>
+ <message>
+ <source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
+ <extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
+ <translation type="unfinished">Maksimum maglumat binýadynyň keş göwrümi. Keş näçe uly boldugyça sinhronlaşdyrma şonça çalt bolmagyna goşant goşular, ondan soň peýdasy köplenç köp bildirmeýär. Keş göwrümini azaltmak ýadyň ulanylyşyny azaldar. Ulanylmaýan umumy ýat howuzy bu keş üçin paýlaşylýar. </translation>
+ </message>
+ <message>
+ <source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
+ <extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
+ <translation type="unfinished">Skript tassyklama akymlarynyň sanyny belläň. Otrisatel sanlar ulgam üçin boş galdyryljak ýadrolaryň sanyna gabat gelýär.</translation>
+ </message>
+ <message>
+ <source>(0 = auto, &lt;0 = leave that many cores free)</source>
+ <translation type="unfinished">(0 = awtomatik, &lt;0 = şonça sany ýadrony boş galdyr)</translation>
+ </message>
+ <message>
+ <source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
+ <extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
+ <translation type="unfinished">Bu size ýa-da üçünji tarap guralyna tabşyryk setiri we JSON-RPC tabşyryklary arkaly düwün bilen aragatnaşyk saklamaga ygtyýar berer.</translation>
+ </message>
+ <message>
+ <source>Enable R&amp;PC server</source>
+ <extracomment>An Options window setting to enable the RPC server.</extracomment>
+ <translation type="unfinished">R&amp;PC serwerini işlet</translation>
+ </message>
+ <message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">G&amp;apjyk</translation>
+ </message>
+ <message>
+ <source>Whether to set subtract fee from amount as default or not.</source>
+ <extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
+ <translation type="unfinished">Komissiýanyň möçberden aýtdyrman kesilmegini bellemelimi ýa-da ýok.</translation>
+ </message>
+ <message>
+ <source>Subtract &amp;fee from amount by default</source>
+ <extracomment>An Options window setting to set subtracting the fee from a sending amount as default.</extracomment>
+ <translation type="unfinished">Ko&amp;missiýany möçberden aýtdyrman kes</translation>
+ </message>
+ <message>
+ <source>Expert</source>
+ <translation type="unfinished">Bilermen</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">Teňňe &amp;dolandyryş aýratynlyklaryny işjeňleşdir</translation>
+ </message>
+ <message>
+ <source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
+ <translation type="unfinished">Tassyklanmadyk gaýtargynyň sowulmagyny ýapsaňyz, amaldan galan gaýtargyny tä şol amalda azyndan bir tassyklama bolýança ulanyp bolmaz. Bu şeýle-de balansyňyzyň hasaplanyşyna täsir eder.</translation>
+ </message>
+ <message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">Tassyklanmadyk gaýtargyny &amp;sow</translation>
+ </message>
+ <message>
+ <source>Enable &amp;PSBT controls</source>
+ <extracomment>An options window setting to enable PSBT controls.</extracomment>
+ <translation type="unfinished">&amp;PSBT dolandyryşyny işjeňleşdir</translation>
+ </message>
+ <message>
+ <source>Whether to show PSBT controls.</source>
+ <extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
+ <translation type="unfinished">PSBT dolandyryşyny görkezmelimi.</translation>
+ </message>
+ <message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">Daşyndan gol çekiji (meselem, enjamlaýyn gapjyk)</translation>
+ </message>
+ <message>
+ <source>&amp;External signer script path</source>
+ <translation type="unfinished">&amp;Daşyndan gol çekijiniň skript ýoly</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">Bitkoin müşderi portuny routerde awtomatik usulda aç. Bu diňe routeriňiz UPnP goldaýan bolsa we ol işjeň bolsa işleýär.</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">&amp;UPnP ulanyp porty aşyryň</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">Bitkoin müşderi portuny routerde awtomatik usulda açýar. Bu diňe routeriňiz NAT-PMP goldaýan we ol işjeňleşdirilen bolsa işleýär. Daşarky router tötänleýin bolup biler.</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">NA&amp;T-PMP ulanýan porty aşyryň</translation>
+ </message>
+ <message>
+ <source>Accept connections from outside.</source>
+ <translation type="unfinished">Daşyndan gelen birikmeleri kabul et.</translation>
+ </message>
+ <message>
+ <source>Allow incomin&amp;g connections</source>
+ <translation type="unfinished">Gele&amp;n birikmelere rugsat ber</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation type="unfinished">SOCKS5 proksi arkaly Bitkoin toruna baglan.</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation type="unfinished">SOCKS5 proksi (bellenen proksi) arkaly &amp;baglan:</translation>
+ </message>
+ <message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">Proksi &amp;IP:</translation>
+ </message>
+ <message>
+ <source>Port of the proxy (e.g. 9050)</source>
+ <translation type="unfinished">Proksiniň porty (meselem, 9050)</translation>
+ </message>
+ <message>
+ <source>Used for reaching peers via:</source>
+ <translation type="unfinished">Aşakdakylar arkaly düwünlere aralaşmak üçin ulanyldy:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
<translation type="unfinished">&amp;Penjire</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">Ulgamyň bildirişler panelinde suratjygy görkez.</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">Bildirişler paneliniň &amp;suratjygyny görkez</translation>
+ </message>
+ <message>
+ <source>Show only a tray icon after minimizing the window.</source>
+ <translation type="unfinished">Penjire kiçeldilenden soň diňe bildirişler paneliniň suratjygyny görkez.</translation>
+ </message>
+ <message>
+ <source>&amp;Minimize to the tray instead of the taskbar</source>
+ <translation type="unfinished">Tabşyryklar paneliniň deregine bildirişler paneline &amp;kiçelt</translation>
+ </message>
+ <message>
+ <source>M&amp;inimize on close</source>
+ <translation type="unfinished">Ýapylanda K&amp;içelt</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">&amp;Görkez</translation>
+ </message>
+ <message>
+ <source>User Interface &amp;language:</source>
+ <translation type="unfinished">Ulanyjy interfeýsiniň &amp;dili:</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation type="unfinished">Ulanyjy interfeýsiniň dilini bu ýerde belläp bolýar. Bu sazlama %1 gaýtadan başladylandan soň güýje girer.</translation>
+ </message>
+ <message>
+ <source>&amp;Unit to show amounts in:</source>
+ <translation type="unfinished">Möçberleri görkezmek üçin ölçeg &amp;birligi:</translation>
+ </message>
+ <message>
+ <source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
+ <translation type="unfinished">Interfeýsde we teňňeler iberilende görkezer ýaly bellenen ölçeg birligini saýlaň.</translation>
+ </message>
+ <message>
+ <source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
+ <translation type="unfinished">Amallar sahypasynda kontekst menýu birlikleri hökmünde görkezilýän üçünji tarap URL-salgylary (meselem, blok agtaryjynyňky). URL-däki %s amal heşi bilen çalşyrylar. Birden köp URL-ler dik | çyzgy bilen biri-birinden aýrylýar.</translation>
+ </message>
+ <message>
+ <source>&amp;Third-party transaction URLs</source>
+ <translation type="unfinished">&amp;Üçünji tarap amal URL-leri</translation>
+ </message>
+ <message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">Teňňe dolandyryş aýratynlyklary görkezilmelimi ýa-da ýok.</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
+ <translation type="unfinished">Tor onion hyzmatlary üçin aýratyn SOCKS5 proksi arkaly Bitkoin toruna baglan.</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">Tor onion hyzmatlary arkaly düwünlere aralaşmak üçin SOCKS&amp;5 proksisini ulan:</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">&amp;Ýatyr</translation>
+ </message>
+ <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Daşyndan gol çekmek üçin goldawsyz (daşyndan gol çekmek üçin gerek) düzüldi</translation>
</message>
<message>
+ <source>default</source>
+ <translation type="unfinished">bellenen</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation type="unfinished">hiçbiri</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">Opsiýalary başdaka geçirmekligi tassykla</translation>
+ </message>
+ <message>
+ <source>Client restart required to activate changes.</source>
+ <extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
+ <translation type="unfinished">Üýtgetmeleri işjeňleşdirmek üçin müşderiniň gaýtadan işletmegi zerur.</translation>
+ </message>
+ <message>
+ <source>Current settings will be backed up at "%1".</source>
+ <extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
+ <translation type="unfinished">Häzirki sazlamalar %1-de ätiýaçlykda saklanar.</translation>
+ </message>
+ <message>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
+ <translation type="unfinished">Müşderi ýapylar. Dowam etmek isleýärsiňizmi?</translation>
+ </message>
+ <message>
+ <source>Configuration options</source>
+ <extracomment>Window title text of pop-up box that allows opening up of configuration file.</extracomment>
+ <translation type="unfinished">Konfigurasiýa opsiýalary</translation>
+ </message>
+ <message>
+ <source>The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
+ <extracomment>Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</extracomment>
+ <translation type="unfinished">Konfigurasiýa faýly GUI sazlamalaryndan has ýokary bolan giňeldilen ulanyjy opsiýalaryny takyklamak üçin ulanylýar.</translation>
+ </message>
+ <message>
+ <source>Continue</source>
+ <translation type="unfinished">Dowam et</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Ýatyr</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">Ýalňyşlyk</translation>
</message>
- </context>
+ <message>
+ <source>The configuration file could not be opened.</source>
+ <translation type="unfinished">Konfigurasiýa faýlyny açyp bolanok.</translation>
+ </message>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">Bu üýtgetme üçin müşderi ýapyp açmaly bolar.</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">Berlen proksi salgysy dogry däl.</translation>
+ </message>
+</context>
+<context>
+ <name>OptionsModel</name>
+ <message>
+ <source>Could not read setting "%1", %2.</source>
+ <translation type="unfinished">%1, %2 sazlamasyny okap bolmady.</translation>
+ </message>
+</context>
<context>
<name>OverviewPage</name>
<message>
<source>Form</source>
<translation type="unfinished">Forma</translation>
</message>
- </context>
+ <message>
+ <source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
+ <translation type="unfinished">Görkezilýän maglumat könelen bolup biler. birikme ýerine ýetirilenden soň siziň gapjygyňyz awtomatiki usulda Bitkoin tory bilen sinhronlaşar, ýöne bu iş entäk gutarmady.</translation>
+ </message>
+ <message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">Diňe syn edip bolýar:</translation>
+ </message>
+ <message>
+ <source>Available:</source>
+ <translation type="unfinished">Elýeter:</translation>
+ </message>
+ <message>
+ <source>Your current spendable balance</source>
+ <translation type="unfinished">Siziň häzirki wagtda sowup bilýän balansyňyz</translation>
+ </message>
+ <message>
+ <source>Pending:</source>
+ <translation type="unfinished">Garaşylýar:</translation>
+ </message>
+ <message>
+ <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
+ <translation type="unfinished">Indi tassyklanmaly we entek sowup boljak balansa geçirilmedik amallaryň hemmesi</translation>
+ </message>
+ <message>
+ <source>Immature:</source>
+ <translation type="unfinished">Kemala gelmedik:</translation>
+ </message>
+ <message>
+ <source>Mined balance that has not yet matured</source>
+ <translation type="unfinished">Entek kemala gelmedik gazanylan balans</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation type="unfinished">Balanslar</translation>
+ </message>
+ <message>
+ <source>Total:</source>
+ <translation type="unfinished">Jemi:</translation>
+ </message>
+ <message>
+ <source>Your current total balance</source>
+ <translation type="unfinished">Siziň häzirki jemi balansyňyz</translation>
+ </message>
+ <message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">Diňe syn edip bolýan salgylardaky häzirki balansyňyz</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">Sowup bolýar:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation type="unfinished">Soňky amallar</translation>
+ </message>
+ <message>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation type="unfinished">Diňe syn edip bolýan salgylara tassyklanmadyk amallar</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">Diňe syn edip bolýan salgylarda gazanylan, ýöne entek kemala gelmedik balans</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation type="unfinished">Diňe syn edip bolýan salgylarda häzirki jemi balans</translation>
+ </message>
+ <message>
+ <source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
+ <translation type="unfinished">Gözden geçir sahypasy üçin Gizlinlik tertibi işjeňleşdirildi. Ýüzi örtülgi sanlary açmak üçin Sazlamalar-&gt;Sanlaryň ýüzüni ört-däki belligi aýyryň.</translation>
+ </message>
+</context>
+<context>
+ <name>PSBTOperationsDialog</name>
+ <message>
+ <source>PSBT Operations</source>
+ <translation type="unfinished">PSBT amallary</translation>
+ </message>
+ <message>
+ <source>Sign Tx</source>
+ <translation type="unfinished">Tx gol çek</translation>
+ </message>
+ <message>
+ <source>Broadcast Tx</source>
+ <translation type="unfinished">Tx ýaýlymyny ýerine ýetir</translation>
+ </message>
+ <message>
+ <source>Copy to Clipboard</source>
+ <translation type="unfinished">Alyş-çalyş buferine göçür</translation>
+ </message>
+ <message>
+ <source>Save…</source>
+ <translation type="unfinished">Ýatda sakla...</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished">Ýap</translation>
+ </message>
+ <message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">Amaly ýükläp bolmady: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">Amala gol çekip bolmady: %1</translation>
+ </message>
+ <message>
+ <source>Cannot sign inputs while wallet is locked.</source>
+ <translation type="unfinished">Gapjyk gulplyka girizilenlere gol çekip bolanok.</translation>
+ </message>
+ <message>
+ <source>Could not sign any more inputs.</source>
+ <translation type="unfinished">Başga hiç-hili girizilenlere gol çekip bolanok.</translation>
+ </message>
+ <message>
+ <source>Signed %1 inputs, but more signatures are still required.</source>
+ <translation type="unfinished">%1 girizilene gol çekildi, ýöne entegem has köp gol zerur.</translation>
+ </message>
+ <message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">Amala şowly gol çekildi. Amal ýaýlyma taýyn.</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">Amaly işlemekde näbelli ýalňyşlyk.</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast successfully! Transaction ID: %1</source>
+ <translation type="unfinished">Amal ýaýlymy şowly! Amal ID: %1</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast failed: %1</source>
+ <translation type="unfinished">Amal ýaýlymy şowsuz: %1</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">PSBT alyş-çalyş buferine göçürildi.</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">Amal maglumatyny ýatda sakla</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">Bölekleýin gol çekilen amal (binar)</translation>
+ </message>
+ <message>
+ <source>PSBT saved to disk.</source>
+ <translation type="unfinished">PSBT diskde ýatda saklandy.</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">Amal pajyny ýa-da jemi amal bahasyny hasaplap bolanok.</translation>
+ </message>
+ <message>
+ <source>Pays transaction fee: </source>
+ <translation type="unfinished">Tölenmeli amal pajy:</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">Jemi baha</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">ýa-da</translation>
+ </message>
+ <message>
+ <source>Transaction has %1 unsigned inputs.</source>
+ <translation type="unfinished">Amalyň %1 gol çekilmedik girizileni bar.</translation>
+ </message>
+ <message>
+ <source>Transaction is missing some information about inputs.</source>
+ <translation type="unfinished">Amalyň girizilenler barada käbir maglumaty ýok.</translation>
+ </message>
+ <message>
+ <source>Transaction still needs signature(s).</source>
+ <translation type="unfinished">Amal üçin entegem gol gerek.</translation>
+ </message>
+ <message>
+ <source>(But no wallet is loaded.)</source>
+ <translation type="unfinished">(Ýöne hiçhili gapjyk ýüklenmedik.)</translation>
+ </message>
+ <message>
+ <source>(But this wallet cannot sign transactions.)</source>
+ <translation type="unfinished">(Ýöne bu gapjyk amallara gol çekip bilenok.)</translation>
+ </message>
+ <message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(Ýöne bu gapjygyň dogry açarlary ýok.)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">Amala doly gol çekildi we ol ýaýlyma taýyn.</translation>
+ </message>
+ <message>
+ <source>Transaction status is unknown.</source>
+ <translation type="unfinished">Amalyň ýagdaýy näbelli.</translation>
+ </message>
+</context>
+<context>
+ <name>PaymentServer</name>
+ <message>
+ <source>Payment request error</source>
+ <translation type="unfinished">Töleg talabynda ýalňyşlyk</translation>
+ </message>
+ <message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">Bitkoini başlap bolanok: click-to-pay işleýjisi</translation>
+ </message>
+ <message>
+ <source>URI handling</source>
+ <translation type="unfinished">URI işlemeklik</translation>
+ </message>
+ <message>
+ <source>'bitcoin://' is not a valid URI. Use 'bitcoin:' instead.</source>
+ <translation type="unfinished">'bitcoin://' dogry URI däl. Onuň ýerine 'bitcoin:' ulanyň.</translation>
+ </message>
+ <message>
+ <source>Cannot process payment request because BIP70 is not supported.
+Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
+If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
+ <translation type="unfinished">BIP70 goldanmaýandygy sebäpli töleg talabyny işläp bolmaýar.
+BIP70-däki howpsuzlygyň giňden ýaýran gowşak taraplary sebäpli, täjirleriň gapjyklary çalyşmak baradaky islendik buýruklaryna üns bermäň.
+Size bu ýalňyşlyk gelýän bolsa, siz täjirden BIP21-e gabat gelýän URI-ni üpjün etmegini talap etmeli.</translation>
+ </message>
+ <message>
+ <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
+ <translation type="unfinished">URI-ni işläp bolmady! Munuň sebäbi nädogry Bitkoin salgysy ýa-da ýalňyş emele getirilen URI parametrleri bolup biler.</translation>
+ </message>
+ <message>
+ <source>Payment request file handling</source>
+ <translation type="unfinished">Töleg talaby faýllarynyň işlenmegi</translation>
+ </message>
+</context>
<context>
<name>PeerTableModel</name>
<message>
+ <source>User Agent</source>
+ <extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
+ <translation type="unfinished">Ulanyjy araçysy</translation>
+ </message>
+ <message>
+ <source>Peer</source>
+ <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
+ <translation type="unfinished">Düwün</translation>
+ </message>
+ <message>
+ <source>Age</source>
+ <extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
+ <translation type="unfinished">Möhlet</translation>
+ </message>
+ <message>
+ <source>Direction</source>
+ <extracomment>Title of Peers Table column which indicates the direction the peer connection was initiated from.</extracomment>
+ <translation type="unfinished">Ugur</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</extracomment>
+ <translation type="unfinished">Iberilen</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
+ <translation type="unfinished">Alnan</translation>
+ </message>
+ <message>
<source>Address</source>
<extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
<translation type="unfinished">Salgy</translation>
</message>
- </context>
+ <message>
+ <source>Type</source>
+ <extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
+ <translation type="unfinished">Görnüş</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
+ <translation type="unfinished">Tor</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An Inbound Connection from a Peer.</extracomment>
+ <translation type="unfinished">Girýän</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">Çykýan</translation>
+ </message>
+</context>
+<context>
+ <name>QRImageWidget</name>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Suraty ýatda sakla…</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">Suraty &amp;göçür</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">Netijedäki URI juda uzyn, etiketka/ýazgynyň tekstini azaldyp görüň.</translation>
+ </message>
+ <message>
+ <source>Error encoding URI into QR Code.</source>
+ <translation type="unfinished">URI-ni QR koda öwrüp bolmady.</translation>
+ </message>
+ <message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">QR kod goldawy elýeter däl.</translation>
+ </message>
+ <message>
+ <source>Save QR Code</source>
+ <translation type="unfinished">QR kody ýatda sakla</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
+ <translation type="unfinished">PNG surat</translation>
+ </message>
+</context>
<context>
<name>RPCConsole</name>
<message>
+ <source>N/A</source>
+ <translation type="unfinished">Elýeter däl</translation>
+ </message>
+ <message>
+ <source>Client version</source>
+ <translation type="unfinished">Müşderi wersiýasy</translation>
+ </message>
+ <message>
+ <source>&amp;Information</source>
+ <translation type="unfinished">&amp;Maglumat</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="unfinished">Umumy</translation>
+ </message>
+ <message>
+ <source>Datadir</source>
+ <translation type="unfinished">Maglumat binýady</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the data directory use the '%1' option.</source>
+ <translation type="unfinished">Maglumat binýadynyň deslapdan bellenmedik ýerini görkezmek üçin %1 opsiýasyny ulanyň.</translation>
+ </message>
+ <message>
+ <source>Blocksdir</source>
+ <translation type="unfinished">Blok binýadynyň deslapdan bellenmedik ýerini görkezmek üçin opsiýasyny ulanyň.</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">Blok binýadynyň deslapdan bellenmedik ýerini görkezmek üçin %1 opsiýasyny ulanyň.</translation>
+ </message>
+ <message>
+ <source>Startup time</source>
+ <translation type="unfinished">Başlatma wagty</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">Tor</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">At</translation>
+ </message>
+ <message>
+ <source>Number of connections</source>
+ <translation type="unfinished">Birikmeleriň sany</translation>
+ </message>
+ <message>
+ <source>Block chain</source>
+ <translation type="unfinished">Blok zynjyry</translation>
+ </message>
+ <message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">Ýat howuzy</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">Amallaryň häzirki sany</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished">Ýadyň ulanylyşy</translation>
+ </message>
+ <message>
+ <source>Wallet: </source>
+ <translation type="unfinished">Gapjyk:</translation>
+ </message>
+ <message>
+ <source>(none)</source>
+ <translation type="unfinished">(ýok)</translation>
+ </message>
+ <message>
+ <source>&amp;Reset</source>
+ <translation type="unfinished">&amp;Başdaka geçir</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <translation type="unfinished">Alnan</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation type="unfinished">Iberilen</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation type="unfinished">&amp;Düwünler</translation>
+ </message>
+ <message>
+ <source>Banned peers</source>
+ <translation type="unfinished">Gadagan edilen düwünler</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation type="unfinished">Jikme-jik maglumaty görmek üçin düwüni saýlaň.</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation type="unfinished">Wersiýa</translation>
+ </message>
+ <message>
+ <source>Whether we relay transactions to this peer.</source>
+ <translation type="unfinished">Amallary bu düwüne ýaýlyma geçirýärismi.</translation>
+ </message>
+ <message>
+ <source>Transaction Relay</source>
+ <translation type="unfinished">Amal ýaýlyma beriji</translation>
+ </message>
+ <message>
+ <source>Starting Block</source>
+ <translation type="unfinished">Blogy başlamak</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation type="unfinished">Sinhronlaşdyrylan baş atlar</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">Sinhronlaşdyrylan bloklar</translation>
+ </message>
+ <message>
+ <source>Last Transaction</source>
+ <translation type="unfinished">Soňky amal</translation>
+ </message>
+ <message>
+ <source>The mapped Autonomous System used for diversifying peer selection.</source>
+ <translation type="unfinished">Düwünleriň köpdürliligini üpjün etmek üçin ulanylýan birikdirilen Awtonom ulgam.</translation>
+ </message>
+ <message>
+ <source>Mapped AS</source>
+ <translation type="unfinished">Birikdirilen AU</translation>
+ </message>
+ <message>
+ <source>Whether we relay addresses to this peer.</source>
+ <extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
+ <translation type="unfinished">Salgylary bu düwüne ýaýlyma geçirýärismi.</translation>
+ </message>
+ <message>
+ <source>Address Relay</source>
+ <extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
+ <translation type="unfinished">Salgy ýaýlyma geçirmek</translation>
+ </message>
+ <message>
+ <source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
+ <extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
+ <translation type="unfinished">Bu düwünden alnan we işlenen salgylaryň jemi sany (akymyň çäklendirmesi sebäpli çykarylan sanlar hasaba alynmaýar)</translation>
+ </message>
+ <message>
+ <source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
+ <extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
+ <translation type="unfinished">Bu düwünlerden alnan we akymyň çäklendirmesi sebäpli çykarylan (işlenmedik) salgylaryň jemi sany</translation>
+ </message>
+ <message>
+ <source>Addresses Processed</source>
+ <extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
+ <translation type="unfinished">Işlenen salgylar</translation>
+ </message>
+ <message>
+ <source>Addresses Rate-Limited</source>
+ <extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
+ <translation type="unfinished">Akymy çäklendirilen salgylar</translation>
+ </message>
+ <message>
+ <source>User Agent</source>
+ <translation type="unfinished">Ulanyjy araçysy</translation>
+ </message>
+ <message>
<source>Node window</source>
<translation type="unfinished">Düwün penjiresi</translation>
</message>
<message>
+ <source>Current block height</source>
+ <translation type="unfinished">Häzirki blok boýy</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">Soňky blok wagty</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">&amp;Salgyny göçür</translation>
@@ -1359,6 +2356,10 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<source>Wallet:</source>
<translation type="unfinished">Gapjyk:</translation>
</message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">&amp;Suraty ýatda sakla…</translation>
+ </message>
</context>
<context>
<name>RecentRequestsTableModel</name>
@@ -1402,8 +2403,8 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Çalyş:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Toz:</translation>
+ <source>Hide</source>
+ <translation type="unfinished">Gizle</translation>
</message>
<message>
<source>Copy quantity</source>
@@ -1426,13 +2427,26 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Baýtlary göçür</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Tozy göçür</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Gaýtargyny göçür</translation>
</message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">Amal maglumatyny ýatda sakla</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">Bölekleýin gol çekilen amal (binar)</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">ýa-da</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">Jemi baha</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -1446,11 +2460,37 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
</message>
</context>
<context>
+ <name>SendCoinsEntry</name>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">Salgyny alyş-çalyş tagtasyna giriz</translation>
+ </message>
+ </context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">Salgyny alyş-çalyş tagtasyna giriz</translation>
+ </message>
+ <message>
+ <source>Reset all sign message fields</source>
+ <translation type="unfinished">Ähli gol habarly ýerleri başdaka geçir</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">Ähli tassyklaýyş habarly ýerleri başdaka geçir</translation>
+ </message>
+ </context>
+<context>
<name>TransactionDesc</name>
<message>
<source>Date</source>
<translation type="unfinished">Sene</translation>
</message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">näbelli</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -1470,6 +2510,10 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Sene</translation>
</message>
<message>
+ <source>Type</source>
+ <translation type="unfinished">Görnüş</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">Bellik</translation>
</message>
@@ -1510,6 +2554,10 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<translation type="unfinished">Sene</translation>
</message>
<message>
+ <source>Type</source>
+ <translation type="unfinished">Görnüş</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">Bellik</translation>
</message>
@@ -1550,7 +2598,16 @@ Diňe "miras" görnüşli salgylar bilen gol çekmek mümkin.</translation>
<source>Export the data in the current tab to a file</source>
<translation type="unfinished">Häzirki bellikdäki maglumaty faýla geçir</translation>
</message>
- </context>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">Gapjyk maglumatlary</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">Ýatyr</translation>
+ </message>
+</context>
<context>
<name>bitcoin-core</name>
<message>
diff --git a/src/qt/locale/bitcoin_tl.ts b/src/qt/locale/bitcoin_tl.ts
index 110c170993..aaa9d64ccd 100644
--- a/src/qt/locale/bitcoin_tl.ts
+++ b/src/qt/locale/bitcoin_tl.ts
@@ -3,19 +3,23 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">I-right-click upang i-edit ang address o label</translation>
+ <translation type="unfinished">pindutin lamang ang kanang pindutan upang i-edit ang address o label</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">Gumawa ng bagong ♦address♦</translation>
+ <translation type="unfinished">Lumikha ng bagong ♦address♦</translation>
</message>
<message>
<source>&amp;New</source>
- <translation type="unfinished">&amp;Bago</translation>
+ <translation type="unfinished">Panibago</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
- <translation type="unfinished">Kopyahin ang pinipiling ♦address♦ sa kasalakuyan sa ♦clipboard♦ ng sistema</translation>
+ <translation type="unfinished">Gayahin ang pinipiling ♦address♦ sa kasalakuyan sa ♦clipboard♦ ng sistem</translation>
+ </message>
+ <message>
+ <source>&amp;Copy</source>
+ <translation type="unfinished">Gayahin</translation>
</message>
<message>
<source>C&amp;lose</source>
@@ -23,7 +27,7 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">Tanggalin ang kasalukuyang napiling ♦address♦ sa listahan</translation>
+ <translation type="unfinished">Burahin ang kasalukuyang napiling ♦address♦ sa listahan</translation>
</message>
<message>
<source>Enter address or label to search</source>
@@ -39,11 +43,11 @@
</message>
<message>
<source>&amp;Delete</source>
- <translation type="unfinished">&amp;Tanggalin</translation>
+ <translation type="unfinished">&amp;Burahin</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">Piliin ang ♦address♦ kung saan ipapadala ang mga coin</translation>
+ <translation type="unfinished">Piliin ang ♦address♦ kung saan ipapadala ang mga barya</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
@@ -54,14 +58,6 @@
<translation type="unfinished">&amp;Pumili</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Pinapadala ang mga ♦address♦</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Tinatanggap ang mga ♦address♦</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Ito ang mga ♦address♦ ng ♦Bitcoin♦ mo para pagpapadala ng mga bayad. Palaging suriin mo ang halaga at address kung saan tatanggap bago magpadala ka ng mga ♦coin.</translation>
</message>
@@ -774,10 +770,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Bayad:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Alikabok:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Pagkatapos na Bayad:</translation>
</message>
@@ -862,10 +854,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopyahin ang ♦bytes♦</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopyahin ang ♦dust♦</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopyahin ang pagbabago</translation>
</message>
@@ -874,18 +862,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 naka-lock)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">oo</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">hindi</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ang tatak na ito ay nagiging pula kung ang sinomang tatanggap ay tatanggap ng halaga na mas maliit sa kasalukuyang ♦dust threshold♦</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Maaaring magbago ng +/- %1♦4satoshi(s)♦ kada ♦input♦.</translation>
</message>
@@ -1019,14 +995,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Gumawa ng Blankong Pitaka</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Gumawa ng mga ♦descriptors♦ para sa pamamahala sa ♦scriptPubKey♦</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">♦Descriptor♦ na pitaka</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Gumamit ng panlabas na pagpirmang ♦device♦ katulad ng ♦hardware♦ na pitaka. I-configure ang panlabas na ♦signer script♦ sa loob ng ♦preferences♦ ng pitaka n listahan. </translation>
</message>
@@ -1039,10 +1007,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Gumawa</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Pinagsama-sama na walang suporta ng ♦sqlite♦ (kailangan para sa ♦descriptor♦ na pitaka)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Pinagsama-sama na walang suporta ng ♦pag-pirma♦ (kailangan para sa panlabasna pagpirma)</translation>
@@ -1356,10 +1320,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Sukli:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Alikabok:</translation>
- </message>
- <message>
<source>Copy quantity</source>
<translation type="unfinished">Kopyahin ang dami</translation>
</message>
@@ -1380,10 +1340,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Kopyahin ang ♦bytes♦</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Kopyahin ang ♦dust♦</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Kopyahin ang pagbabago</translation>
</message>
diff --git a/src/qt/locale/bitcoin_tr.ts b/src/qt/locale/bitcoin_tr.ts
index f64ef41a01..ba3ecca680 100644
--- a/src/qt/locale/bitcoin_tr.ts
+++ b/src/qt/locale/bitcoin_tr.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">S&amp;eç</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Gönderici adresler</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Alıcı adresler</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Bunlar ödemeleri gönderdiğiniz Bitcoin adreslerinizdir. Para göndermeden önce her zaman tutarı ve alıcı adresi kontrol ediniz.</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Adres listesinin %1 konumuna kaydedilmesi sırasında bir hata meydana geldi. Lütfen tekrar deneyin.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Adresler gönderiliyor - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Adresler alınıyor - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Dışa Aktarım Başarısız Oldu</translation>
</message>
@@ -149,7 +149,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">kilidi açmakparolaBu işlemi yapabilmek için cüzdan parolanızı girmeniz gerekmektedir
+ <translation type="unfinished">Bu işlemi yapabilmek için cüzdan parolanızı girmeniz gerekmektedir
Cüzdan kilidini aç.</translation>
</message>
<message>
@@ -733,6 +733,11 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">daha fazla seçenek için tıklayın.</translation>
</message>
<message>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">Eşler sekmesini göster</translation>
+ </message>
+ <message>
<source>Disable network activity</source>
<extracomment>A context menu item.</extracomment>
<translation type="unfinished">Ağ etkinliğini devre dışı bırak</translation>
@@ -849,10 +854,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Ücret</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Toz:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Ücret sonrası:</translation>
</message>
@@ -933,10 +934,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Bitleri kopyala</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">toz kopyala</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Para üstünü kopyala</translation>
</message>
@@ -945,18 +942,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">(%1'i kilitli)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">evet</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">hayır</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Herhangi bir alıcı mevcut toz eşiğinden daha düşük bir miktar alırsa bu etiket kırmızıya döner.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Her girdi için +/- %1 satoshi değişebilir.</translation>
</message>
@@ -994,6 +979,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Cüzdan oluşturma uyarısı</translation>
</message>
<message>
+ <source>Can't list signers</source>
+ <translation type="unfinished">İmzalayanlar listelenmiyor</translation>
+ </message>
+ <message>
<source>Too many external signers found</source>
<translation type="unfinished">Çok fazla harici imzalayan bulundu</translation>
</message>
@@ -1130,21 +1119,17 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Boş Cüzdan Oluştur</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">scriptPubKey yönetimi için tanımlayıcıları kullanın</translation>
+ <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
+ <translation type="unfinished">Donanım cüzdanı gibi harici bir imzalama cihazı kullanın. Önce cüzdan tercihlerinde harici imzalayan komut dosyasını yapılandırın.</translation>
</message>
<message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Tanımlayıcı Cüzdan </translation>
+ <source>External signer</source>
+ <translation type="unfinished">Harici imzalaycı</translation>
</message>
<message>
<source>Create</source>
<translation type="unfinished">Oluştur</translation>
</message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Sqlite desteği olmadan derlenmiş. (tanımlayıcı cüzdanlar için gereklidir)</translation>
- </message>
</context>
<context>
<name>EditAddressDialog</name>
@@ -1323,7 +1308,7 @@ Cüzdan kilidini aç.</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
- <translation type="unfinished">Bu pencere kalkıncaya dek bilgisayarı kapatmayınız.</translation>
+ <translation type="unfinished">Bu pencere kapanıncaya dek bilgisayarı kapatmayınız.</translation>
</message>
</context>
<context>
@@ -1638,6 +1623,11 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Değişikliklerin uygulanması için istemcinin yeniden başlatılması lazımdır.</translation>
</message>
<message>
+ <source>Current settings will be backed up at "%1".</source>
+ <extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
+ <translation type="unfinished">Mevcut ayarlar şu adreste yedeklenecek: "%1".</translation>
+ </message>
+ <message>
<source>Client will be shut down. Do you want to proceed?</source>
<extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
<translation type="unfinished">İstemci kapanacaktır. Devam etmek istiyor musunuz?</translation>
@@ -1822,6 +1812,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">PSBT diske kaydedildi.</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">kendi adresiniz</translation>
+ </message>
+ <message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
<translation type="unfinished">İşlem ücretini veya toplam işlem miktarını hesaplayamıyor.</translation>
</message>
@@ -2062,6 +2056,10 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Ayrıntılı bilgi görmek için bir eş seçin.</translation>
</message>
<message>
+ <source>Transport</source>
+ <translation type="unfinished">Aktar</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Sürüm</translation>
</message>
@@ -2570,10 +2568,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Girdiler...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Toz:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Seç...</translation>
</message>
@@ -2622,10 +2616,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Bitleri kopyala</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">toz kopyala</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Para üstünü kopyala</translation>
</message>
@@ -3089,10 +3079,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Çıktı indeksi</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Sertifika doğrulanmadı)</translation>
- </message>
- <message>
<source>Merchant</source>
<translation type="unfinished">Tüccar</translation>
</message>
@@ -3191,10 +3177,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Gönderildiği adres</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Kendinize ödeme</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Madenden</translation>
</message>
@@ -3270,10 +3252,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Gönderildiği adres</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Kendinize</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Madenden</translation>
</message>
@@ -3440,7 +3418,7 @@ Cüzdan kilidini aç.</translation>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">Dışa aktar</translation>
+ <translation type="unfinished">&amp;Dışa aktar</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -3491,10 +3469,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">MIT yazılım lisansı altında dağıtılmıştır, beraberindeki %s ya da %s dosyasına bakınız.</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">%s dosyasının okunması sırasında bir hata meydana geldi! Tüm anahtarlar doğru bir şekilde okundu, ancak işlem verileri ya da adres defteri ögeleri hatalı veya eksik olabilir.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">%s okuma hatası! İşlem verileri eksik veya yanlış olabilir. Cüzdan yeniden taranıyor.</translation>
</message>
@@ -3527,14 +3501,14 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Blok veritabanı gelecekten gibi görünen bir blok içermektedir. Bu, bilgisayarınızın saat ve tarihinin yanlış ayarlanmış olmasından kaynaklanabilir. Blok veritabanını sadece bilgisayarınızın tarih ve saatinin doğru olduğundan eminseniz yeniden derleyin.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">Blok dizini db, eski bir 'txindex' içerir. Dolu disk alanını temizlemek için full -reindex çalıştırın, aksi takdirde bu hatayı yok sayın. Bu hata mesajı tekrar görüntülenmeyecek.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Bu işlem, tutar düşüldükten sonra göndermek için çok düşük</translation>
</message>
<message>
+ <source>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>
+ <translation type="unfinished">Bu hata, bu cüzdan düzgün bir şekilde kapatılmadıysa ve en son Berkeley DB'nin daha yeni bir sürümü kullanılarak yüklendiyse oluşabilir. Öyleyse, lütfen bu cüzdanı en son sürümünü kullanın.</translation>
+ </message>
+ <message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation type="unfinished">Bu kararlı sürümden önceki bir deneme sürümüdür. - risklerini bilerek kullanma sorumluluğu sizdedir - bitcoin oluşturmak ya da ticari uygulamalar için kullanmayınız</translation>
</message>
@@ -3575,10 +3549,6 @@ Cüzdan kilidini aç.</translation>
<translation type="unfinished">Veriler '%s' klasörüne yazılamıyor ; yetkilendirmeyi kontrol edin.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">Önceki bir sürüm tarafından başlatılan -txindex yükseltmesi tamamlanamaz. Önceki sürümle yeniden başlatın veya full -reindex çalıştırın.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Belirli bağlantılar sağlayamaz ve aynı anda addrman'ın giden bağlantıları bulmasını sağlayamaz.</translation>
</message>
@@ -3809,10 +3779,6 @@ Cüzdan yedeği geri yüklenemiyor.</translation>
<translation type="unfinished">İşlem değişikliği çıktı endeksi aralık dışında</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">İşlem çok uzun bir mempool zincirine sahip</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">İşlem en az bir adet alıcıya sahip olmalı.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ug.ts b/src/qt/locale/bitcoin_ug.ts
index be0a858cbf..bdb97112e4 100644
--- a/src/qt/locale/bitcoin_ug.ts
+++ b/src/qt/locale/bitcoin_ug.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">تاللا(&amp;H)</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">يوللاش ئادرېسى</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">تاپشۇرۇۋېلىش ئادرېسى</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">بۇلار سىز Bitcoin چىقىم قىلىدىغان ئادرېس. تەڭگە چىقىم قىلىشتىن ئىلگىرى، سومما ۋە تاپشۇرۇۋېلىش ئادرېسىنىڭ توغرا ئىكەنلىكىنى تەكشۈرۈشنى ئۇنۇتماڭ.</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">ئادرېس تىزىمىنى %1 غا ساقلاشنى سىناۋاتقاندا خاتالىق كۆرۈلدى. قايتا سىناڭ.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">يوللايدىغان ئادرېس-%1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">قوبۇللايدىغان ئادرېس-%1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">چىقىرالمىدى</translation>
</message>
@@ -175,6 +175,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Wallet encrypted</source>
<translation type="unfinished">ھەميان شىفىرلاندى</translation>
</message>
+ <message>
+ <source>Wallet to be encrypted</source>
+ <translation type="unfinished">ھەميان شىفىرلىنىدۇ</translation>
+ </message>
+ <message>
+ <source>Your wallet is about to be encrypted. </source>
+ <translation type="unfinished">ھەميانىڭىز شىفىرلىنىدۇ.</translation>
+ </message>
</context>
<context>
<name>QObject</name>
diff --git a/src/qt/locale/bitcoin_uk.ts b/src/qt/locale/bitcoin_uk.ts
index 62d65d660e..7679222848 100644
--- a/src/qt/locale/bitcoin_uk.ts
+++ b/src/qt/locale/bitcoin_uk.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Вибрати</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Адреси відправлення</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Адреси отримання</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Це ваші біткоїн-адреси для надсилання платежів. Завжди перевіряйте суму та адресу одержувача перед відправленням монет.</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Виникла помилка при спробі зберігання адрес до %1. Спробуйте ще раз.</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Адреси відправлення - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">Адреси отримання - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">Помилка експорту</translation>
</message>
@@ -169,7 +169,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">Ви справді бажаєте зашифрувати свій гаманець?</translation>
+ <translation type="unfinished">Ви впевнені, що бажаєте зашифрувати свій гаманець?</translation>
</message>
<message>
<source>Wallet encrypted</source>
@@ -303,6 +303,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">невідомо</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">Вбудований "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">Системний шрифт за замовчуванням "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">Настроюваний…</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">Кількість</translation>
</message>
@@ -547,7 +559,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Backup Wallet…</source>
- <translation type="unfinished">&amp;Резервне копіювання гаманця</translation>
+ <translation type="unfinished">&amp;Резервне копіювання гаманця…</translation>
</message>
<message>
<source>&amp;Change Passphrase…</source>
@@ -740,12 +752,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Закрити всі гаманці</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Перенести гаманець</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">Перенести гаманець</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">Показати довідку %1 для отримання переліку можливих параметрів командного рядка.</translation>
</message>
<message>
<source>&amp;Mask values</source>
- <translation type="unfinished">&amp;Приховати значення</translation>
+ <translation type="unfinished">При&amp;ховати значення</translation>
</message>
<message>
<source>Mask the values in the Overview tab</source>
@@ -837,6 +857,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Триває попередня синхронізація заголовків (%1%)…</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Помилка створення гаманця</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">Неможливо створити новий гаманець, програмне забезпечення було скомпільовано без підтримки sqlite (необхідно для гаманців з підтримкою дескрипторів)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Помилка: %1</translation>
</message>
@@ -943,10 +971,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Комісія:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Пил:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Після комісії:</translation>
</message>
@@ -1035,10 +1059,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Копіювати байти</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копіювати "пил"</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Копіювати решту</translation>
</message>
@@ -1047,18 +1067,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 заблоковано)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">так</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">ні</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Ця позначка стане червоною, якщо будь-який отримувач отримає суму, меншу за поточний поріг пилу.</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Може відрізнятися на +/- %1 сатоші за кожний вхід.</translation>
</message>
@@ -1118,6 +1126,56 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">Перенести гаманець</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">Ви впевнені, що бажаєте перенести гаманець &lt;i&gt;%1&lt;/i&gt;?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">Під час перенесення гаманця він буде перетворено на один або кілька гаманців з підтримкою дескрипторів. Необхідно буде створити нову резервну копію гаманця.
+Якщо цей гаманець містить будь-які скрипти "тільки для перегляду", буде створено новий гаманець, що містить такі скрипти.
+Якщо цей гаманець містить будь-які спроможні скрипти, але не "тільки для перегляду", буде створено інший новий гаманець, що містить такі скрипти.
+Процес перенесення створить резервну копію гаманця перед початком. Цей файл резервної копії буде названий &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak і знаходитиметься в каталозі для цього гаманця. У випадку неправильного перенесення резервну копію можна відновити за допомогою функціоналу "Відновити гаманець".</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">Перенести гаманець</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">Перенесення гаманця &lt;b&gt;%1&lt;/b&gt;…</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">Гаманець '%1' був успішно перенесений.</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Скрипти "тільки для перегляду" були перенесені в новий гаманець під назвою '%1'.</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">Спроможні скрипти, але не "тільки для перегляду", були перенесені в новий гаманець під назвою '%1'.</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">Перенесення не вдалося</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">Перенесення завершилося успішно</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1178,11 +1236,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
- <translation type="unfinished">Ви справді бажаєте закрити гаманець &lt;i&gt;%1&lt;/i&gt;?</translation>
+ <translation type="unfinished">Ви впевнені, що бажаєте закрити гаманець &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
<message>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
- <translation type="unfinished">Тримання гаманця закритим занадто довго може призвести до необхідності повторної синхронізації всього блокчейна, якщо скорочення (прунінг) ввімкнено.</translation>
+ <translation type="unfinished">Тримання гаманця закритим занадто довго може призвести до необхідності повторної синхронізації всього блокчейну, якщо скорочення (прунінг) ввімкнено.</translation>
</message>
<message>
<source>Close all wallets</source>
@@ -1190,7 +1248,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Are you sure you wish to close all wallets?</source>
- <translation type="unfinished">Ви справді бажаєте закрити всі гаманці?</translation>
+ <translation type="unfinished">Ви впевнені, що бажаєте закрити всі гаманці?</translation>
</message>
</context>
<context>
@@ -1200,8 +1258,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Створити гаманець</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">Ви на один крок від створення свого нового гаманця!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">Укажіть ім'я та, за бажанням, активуйте будь-які додаткові параметри.</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
- <translation type="unfinished">Назва Гаманця</translation>
+ <translation type="unfinished">Назва гаманця</translation>
</message>
<message>
<source>Wallet</source>
@@ -1221,7 +1287,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">Вимкнути приватні ключі для цього гаманця. Гаманці з вимкнутими приватними ключами не матимуть приватних ключів і не можуть мати набір HD або імпортовані приватні ключі. Це ідеально підходить лише для тільки-огляд гаманців.</translation>
+ <translation type="unfinished">Вимкнути приватні ключі для цього гаманця. Гаманці з вимкнутими приватними ключами не матимуть приватних ключів і не можуть мати набір HD або імпортовані приватні ключі. Це ідеально підходить для гаманців для спостереження.</translation>
</message>
<message>
<source>Disable Private Keys</source>
@@ -1236,14 +1302,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Створити пустий гаманець</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Використовуйте дескриптори для управління scriptPubKey</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Гаманець на базі дескрипторів</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Використовувати зовнішній підписуючий пристрій, наприклад, апаратний гаманець. Спочатку налаштуйте скрипт зовнішнього підписувача в параметрах гаманця.</translation>
</message>
@@ -1256,10 +1314,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Створити</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Скомпільовано без підтримки sqlite (потрібно для гаманців дескрипторів)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Скомпільовано без підтримки зовнішнього підписування (потрібно для зовнішнього підписування)</translation>
@@ -1392,7 +1446,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 will download and store a copy of the Bitcoin block chain.</source>
- <translation type="unfinished">%1 буде завантажувати та зберігати копію блокчейна.</translation>
+ <translation type="unfinished">%1 буде завантажувати та зберігати копію блокчейну.</translation>
</message>
<message>
<source>The wallet will also be stored in this directory.</source>
@@ -1501,7 +1555,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>calculating…</source>
- <translation type="unfinished">рахування…</translation>
+ <translation type="unfinished">підраховується…</translation>
</message>
<message>
<source>Last block time</source>
@@ -1545,7 +1599,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Paste address from clipboard</source>
<extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
- <translation type="unfinished">Вставити адресу</translation>
+ <translation type="unfinished">Вставити адресу з буфера обміну</translation>
</message>
</context>
<context>
@@ -1568,7 +1622,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">Увімкнення режиму скороченого блокчейна значно зменшує дисковий простір, що необхідний для збереження транзакцій. Всі блоки продовжують проходити повну перевірку. Вимкнення цього параметру потребує повторного завантаження всього блокчейна.</translation>
+ <translation type="unfinished">Увімкнення режиму скороченого блокчейну значно зменшує дисковий простір, що необхідний для збереження транзакцій. Всі блоки продовжують проходити повну перевірку. Вимкнення цього параметру потребує повторного завантаження всього блокчейну.</translation>
</message>
<message>
<source>Size of &amp;database cache</source>
@@ -1595,6 +1649,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Згортати замість закриття. Якщо ця опція включена, програма закриється лише після вибору відповідного пункту в меню.</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">Шрифт на вкладці Огляд:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Параметри, які задані в цьому вікні, змінені командним рядком:</translation>
</message>
@@ -1628,7 +1686,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">Повернення цього параметра вимагає перезавантаження вього блокчейна.</translation>
+ <translation type="unfinished">Повернення цього параметра вимагає перезавантаження всього блокчейну.</translation>
</message>
<message>
<source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
@@ -1819,18 +1877,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Використовувати окремий проксі-сервер SOCKS&amp;5, щоб дістатися до вузлів через сервіси Tor:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">Моноширинний шрифт на вкладці Огляд:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">вбудований "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">найбільш подібний "%1"</translation>
- </message>
- <message>
<source>&amp;Cancel</source>
<translation type="unfinished">&amp;Скасувати</translation>
</message>
@@ -1921,7 +1967,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Watch-only:</source>
- <translation type="unfinished">Тільки перегляд:</translation>
+ <translation type="unfinished">Тільки для перегляду:</translation>
</message>
<message>
<source>Available:</source>
@@ -1961,7 +2007,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Your current balance in watch-only addresses</source>
- <translation type="unfinished">Ваш поточний баланс в адресах "тільки перегляд"</translation>
+ <translation type="unfinished">Ваш поточний баланс на адресах "тільки для перегляду"</translation>
</message>
<message>
<source>Spendable:</source>
@@ -1973,15 +2019,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Unconfirmed transactions to watch-only addresses</source>
- <translation type="unfinished">Непідтверджені транзакції на адреси "тільки перегляд"</translation>
+ <translation type="unfinished">Непідтверджені транзакції на адреси "тільки для перегляду"</translation>
</message>
<message>
<source>Mined balance in watch-only addresses that has not yet matured</source>
- <translation type="unfinished">Баланс видобутих монет, що не досягли завершеності, на адресах "тільки перегляд"</translation>
+ <translation type="unfinished">Баланс видобутих монет, що не досягли завершеності, на адресах "тільки для перегляду"</translation>
</message>
<message>
<source>Current total balance in watch-only addresses</source>
- <translation type="unfinished">Поточний сукупний баланс в адресах "тільки перегляд"</translation>
+ <translation type="unfinished">Поточний сукупний баланс на адресах "тільки для перегляду"</translation>
</message>
<message>
<source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
@@ -2024,7 +2070,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Cannot sign inputs while wallet is locked.</source>
- <translation type="unfinished">Не вдалося підписати входи, поки гаманець заблокований.</translation>
+ <translation type="unfinished">Неможливо підписати входи, поки гаманець заблокований.</translation>
</message>
<message>
<source>Could not sign any more inputs.</source>
@@ -2068,8 +2114,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT-транзакцію збережено на диск.</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished">* Надсилає від %1 до %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">Відправляє %1 до %2</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">Власна адреса</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2142,7 +2192,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Cannot process payment request because BIP70 is not supported.
Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
- <translation type="unfinished">Не вдалося обробити запит на оплату, оскільки BIP70 не підтримується.
+ <translation type="unfinished">Неможливо обробити запит на оплату, оскільки BIP70 не підтримується.
Через поширені недоліки безпеки в BIP70 рекомендується ігнорувати будь -які вказівки продавців щодо перемикання гаманців.
Якщо ви отримуєте цю помилку, вам слід вимагати у продавця надати URI, який сумісний з BIP21.</translation>
</message>
@@ -2349,6 +2399,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Виберіть учасника для перегляду детальнішої інформації</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">Версія транспортного рівня: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">Траспорт</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">Ідентифікатор сесії BIP324 у hex форматі, якщо є.</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">ID сесії</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">Версія</translation>
</message>
@@ -2578,6 +2644,21 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Вихідний для отримання адрес: короткотривалий, для витребування адрес</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">визначення: з'єднання може бути v1 або v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: незашифрований транспортний протокол з відкритим текстом</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: шифрований транспортний протокол BIP324</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">ми обрали учасника для з'єднання з високою пропускною здатністю</translation>
</message>
@@ -2632,6 +2713,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Виконання команди без гаманця</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">Вікно вузла - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">Виконання команди з гаманцем "%1"</translation>
</message>
@@ -2955,7 +3040,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
- <translation type="unfinished">Використання зарезервованої комісії може призвести до відправлення транзакції, яка буде підтверджена через години або дні (або ніколи не буде підтверджена). Обміркуйте можливість вибору комісії вручну або зачекайте завершення валідації повного блокчейна.</translation>
+ <translation type="unfinished">Використання зарезервованої комісії може призвести до відправлення транзакції, яка буде підтверджена через години або дні (або ніколи не буде підтверджена). Обміркуйте можливість вибору комісії вручну або зачекайте завершення валідації повного блокчейну.</translation>
</message>
<message>
<source>Warning: Fee estimation is currently not possible.</source>
@@ -2994,10 +3079,6 @@ For more information on using this console, type %6.
<translation type="unfinished">Входи…</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Пил:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">Вибрати…</translation>
</message>
@@ -3074,10 +3155,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Копіювати байти</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Копіювати "пил"</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Копіювати решту</translation>
</message>
@@ -3108,10 +3185,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Створює частково підписану біткоїн-транзакцію (PSBT) для використання, наприклад, офлайн-гаманець %1 або гаманця, сумісного з PSBT.</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">з гаманця '%1'</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 до '%2'</translation>
</message>
@@ -3169,6 +3242,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Перевірте запропоновану транзакцію. Буде сформована частково підписана біткоїн-транзакція (PSBT), яку можна зберегти або скопіювати, а потім підписати з використанням, наприклад, офлайн гаманця %1 або апаратного PSBT-сумісного гаманця.</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 з гаманця '%2'</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Створити таку транзакцію?</translation>
@@ -3221,7 +3298,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Watch-only balance:</source>
- <translation type="unfinished">Баланс "тільки перегляд":</translation>
+ <translation type="unfinished">Баланс "тільки для перегляду":</translation>
</message>
<message>
<source>The recipient address is not valid. Please recheck.</source>
@@ -3308,7 +3385,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">Вставити адресу</translation>
+ <translation type="unfinished">Вставити адресу з буфера обміну</translation>
</message>
<message>
<source>Remove this entry</source>
@@ -3378,7 +3455,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Paste address from clipboard</source>
- <translation type="unfinished">Вставити адресу</translation>
+ <translation type="unfinished">Вставити адресу з буфера обміну</translation>
</message>
<message>
<source>Enter the message you want to sign here</source>
@@ -3581,7 +3658,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">тільки перегляд</translation>
+ <translation type="unfinished">тільки для перегляду</translation>
</message>
<message>
<source>label</source>
@@ -3648,8 +3725,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Вихідний індекс</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(Сертифікат не підтверджено)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1 (Сертифікат не підтверджено)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3657,7 +3734,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
- <translation type="unfinished">Згенеровані монети стануть доступні для використання після %1 підтверджень. Коли ви згенерували цей блок, його було відправлено в мережу для приєднання до блокчейна. Якщо блок не буде додано до блокчейна, його статус зміниться на «не підтверджено», і згенеровані монети неможливо буде витратити. Таке часом трапляється, якщо хтось згенерував інший блок на декілька секунд раніше.</translation>
+ <translation type="unfinished">Згенеровані монети стануть доступні для використання після %1 підтверджень. Коли ви згенерували цей блок, його було відправлено в мережу для приєднання до блокчейну. Якщо блок не буде додано до блокчейну, його статус зміниться на «не підтверджено», і згенеровані монети неможливо буде витратити. Таке часом трапляється, якщо хтось згенерував інший блок на декілька секунд раніше.</translation>
</message>
<message>
<source>Debug information</source>
@@ -3750,16 +3827,12 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Відправлені на</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Відправлено собі</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Добуті</translation>
</message>
<message>
<source>watch-only</source>
- <translation type="unfinished">тільки перегляд</translation>
+ <translation type="unfinished">тільки для перегляду</translation>
</message>
<message>
<source>(n/a)</source>
@@ -3783,7 +3856,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
- <translation type="unfinished">Чи було залучено адресу "тільки перегляд" в цій транзакції.</translation>
+ <translation type="unfinished">Чи було залучено адресу "тільки для перегляду" в цій транзакції.</translation>
</message>
<message>
<source>User-defined intent/purpose of the transaction.</source>
@@ -3829,10 +3902,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">Відправлені на</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Відправлені собі</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Добуті</translation>
</message>
@@ -3878,7 +3947,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>&amp;Show transaction details</source>
- <translation type="unfinished">&amp;Показати деталі транзакції</translation>
+ <translation type="unfinished">&amp;Показати подробиці транзакції</translation>
</message>
<message>
<source>Increase transaction &amp;fee</source>
@@ -3912,7 +3981,7 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
</message>
<message>
<source>Watch-only</source>
- <translation type="unfinished">Тільки перегляд</translation>
+ <translation type="unfinished">Тільки для перегляду</translation>
</message>
<message>
<source>Date</source>
@@ -4118,6 +4187,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s пошкоджено. Спробуйте скористатися інструментом гаманця bitcoin-wallet для виправлення або відновлення резервної копії.</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">Не вдалося перевірити стан знімка -assumeutxo для %s. Це вказує на проблему з обладнанням, або на помилку в програмному забезпеченні, або на неправильну модифікацію програми, яка дозволила завантажити неправильний знімок. Внаслідок цього вузол вимкнеться та припинить використовувати будь-який стан, побудований на знімку, скидаючи висоту блокчейну з %d на %d. При наступному запуску вузол буде продовжувати синхронізацію з %d, не використовуючи жодних даних зі знімка. Повідомте про цей випадок %s, включаючи інформацію про те, як знімок було отримано. Неправильний знімок стану блокчейну залишиться на диску у випадку, якщо він буде корисний при діагностиці проблеми, що викликала цю помилку.</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s прохання прослухати на порту %u . Цей порт вважається «поганим» і тому навряд чи до нього підключиться який-небудь бенкет. Перегляньте doc/p2p-bad-ports.md для отримання детальної інформації та повного списку.</translation>
</message>
@@ -4131,7 +4204,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<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">Не вдалося оновити розділений не-HD гаманець з версії %i до версії %i без оновлення для підтримки попередньо розділеного пула ключів. Використовуйте версію %i або не вказуйте версію.</translation>
+ <translation type="unfinished">Неможливо оновити розділений не-HD гаманець з версії %i до версії %i без оновлення для підтримки попередньо розділеного пула ключів. Використовуйте версію %i або не вказуйте версію.</translation>
</message>
<message>
<source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
@@ -4146,10 +4219,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Помилка завантаження гаманця. Гаманець вимагає завантаження блоків, і програмне забезпечення в даний час не підтримує завантаження гаманців, тоді як блоки завантажуються з ладу при використанні знімків assumeutxo. Гаманець повинен мати можливість успішно завантажуватися після того, як синхронізація вузлів досягне висоти %s</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">Помилка читання %s! Всі ключі зчитано правильно, але записи в адресній книзі, або дані транзакцій можуть бути відсутніми чи невірними.</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">Помилка читання %s! Дані транзакцій можуть бути відсутніми чи невірними. Повторне сканування гаманця.</translation>
</message>
@@ -4207,17 +4276,21 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
- <translation type="unfinished">Встановлений розмір скороченого блокчейна є замалим (меншим за %d МіБ). Використовуйте більший розмір.</translation>
+ <translation type="unfinished">Встановлений розмір скороченого блокчейну є замалим (меншим за %d МіБ). Використовуйте більший розмір.</translation>
</message>
<message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
- <translation type="unfinished">Режим скороченого блокчейна несумісний з -reindex-chainstate. Використовуйте натомість повний -reindex.</translation>
+ <translation type="unfinished">Режим скороченого блокчейну несумісний з -reindex-chainstate. Використовуйте натомість повний -reindex.</translation>
</message>
<message>
<source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
<translation type="unfinished">Скорочений блокчейн: остання синхронізація гаманця виходить за межі скорочених даних. Потрібно перезапустити з -reindex (заново завантажити весь блокчейн, якщо використовується скорочення)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">Не вдалося перейменувати '%s' -&gt; '%s'. Слід вирішити це, перемістивши або видаливши неправильний каталог знімків %sвручну, інакше ця помилка станеться при наступному запуску.</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: Невідома версія схеми гаманця %d. Підтримується лише версія %d</translation>
</message>
@@ -4226,10 +4299,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Схоже, що база даних блоків містить блок з майбутнього. Це може статися із-за некоректно встановленої дати та/або часу. Перебудовуйте базу даних блоків лише тоді, коли ви переконані, що встановлено правильну дату і час</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">База даних індексу блоків містить 'txindex', що не підтримується. Щоб звільнити місце на диску, запустить повний -reindex, або ігноруйте цю помилку. Це повідомлення більше не відображатиметься.</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">Залишок від суми транзакції зі сплатою комісії занадто малий</translation>
</message>
@@ -4266,14 +4335,22 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Вказано невідомий формат "%s" файлу гаманця. Укажіть "bdb" або "sqlite".</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">Непідтримуваний рівень журналювання для категорії %1$s=%2$s. Очікуване значення %1$s=&lt;category&gt;:&lt;loglevel&gt;. Припустимі категорії: %3$s. Припустимі рівні журналювання: %4$s.</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
- <translation type="unfinished">Виявлено несумісний формат бази даних стану блокчейна. Перезапустіть з -reindex-chainstate. Це перебудує базу даних стану блокчейна.</translation>
+ <translation type="unfinished">Виявлено несумісний формат бази даних стану блокчейну. Перезапустіть з -reindex-chainstate. Це перебудує базу даних стану блокчейну.</translation>
</message>
<message>
<source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
<translation type="unfinished">Гаманець успішно створено. Підтримка гаманців застарілого типу припиняється, і можливість створення та відкриття таких гаманців буде видалена.</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">Гаманець успішно завантажено. Гаманці застарілого типу виводяться з обігу, і підтримка створення та відкриття таких гаманців буде припинена у майбутньому. Застарілі гаманці можна перенести до гаманця з підтримкою дескрипторів за допомогою команди migratewallet.</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">Попередження: Формат "%s" файлу дампа гаманця не збігається з форматом "%s", що зазначений у командному рядку.</translation>
</message>
@@ -4291,7 +4368,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
- <translation type="unfinished">Вам необхідно перебудувати базу даних з використанням -reindex для завантаження повного блокчейна.</translation>
+ <translation type="unfinished">Вам необхідно перебудувати базу даних з використанням -reindex для завантаження повного блокчейну.</translation>
</message>
<message>
<source>%s is set very high!</source>
@@ -4311,49 +4388,33 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <translation type="unfinished">Не вдалося встановити для параметра -forcednsseed значення "true", коли параметр -dnsseed має значення "false".</translation>
+ <translation type="unfinished">Неможливо встановити для параметра -forcednsseed значення "true", коли параметр -dnsseed має значення "false".</translation>
</message>
<message>
<source>Cannot set -peerblockfilters without -blockfilterindex.</source>
- <translation type="unfinished">Не вдалося встановити -peerblockfilters без -blockfilterindex.</translation>
+ <translation type="unfinished">Неможливо встановити -peerblockfilters без -blockfilterindex.</translation>
</message>
<message>
<source>Cannot write to data directory '%s'; check permissions.</source>
<translation type="unfinished">Неможливо записати до каталогу даних '%s'; перевірте дозвіли.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">Оновлення -txindex, що було почате попередньою версією, не вдалося завершити. Перезапустіть попередню версію або виконайте повний -reindex.</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s Не вдалося перевірити стан знімка -assumeutxo. Це вказує на проблему з обладнанням, помилку в програмному забезпеченні або некоректну модифікацію програмного забезпечення, що дозволила завантажити недійсний знімок. В результаті цього клієнт буде вимкнено та припинить використовувати будь-який стан, який було побудовано на основі знімка, скидаючи висоту блокчейна від %d до %d. Після наступного запуску клієнт продовжить синхронізацію з %d, не використовуючи будь-які дані зі знімка. Будь ласка, повідомте %s про цей випадок та вкажіть, як ви отримали знімок. Недійсний знімок повинен залишатися на диску на випадок, якщо він буде корисним при діагностиці проблеми, що призвела до цієї помилки.</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">Встановлено дуже велике значення %s! Такі великі комісії можуть бути сплачені окремою транзакцією.</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Параметр -reindex-chainstate несумісний з -blockfilterindex. Тимчасово вимкніть blockfilterindex під час використання -reindex-chainstate, або замінить -reindex-chainstate на -reindex для повної перебудови всіх індексів.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Параметр -reindex-chainstate несумісний з -coinstatsindex. Тимчасово вимкніть coinstatsindex під час використання -reindex-chainstate, або замінить -reindex-chainstate на -reindex для повної перебудови всіх індексів.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">Параметр -reindex-chainstate несумісний з -txindex. Тимчасово вимкніть txindex під час використання -reindex-chainstate, або замінить -reindex-chainstate на -reindex для повної перебудови всіх індексів.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
- <translation type="unfinished">Не вдалося встановити визначені з'єднання і одночасно використовувати addrman для встановлення вихідних з'єднань.</translation>
+ <translation type="unfinished">Неможливо встановити визначені з'єднання та одночасно використовувати addrman для встановлення вихідних з'єднань.</translation>
</message>
<message>
<source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
<translation type="unfinished">Помилка завантаження %s: Завантаження гаманця зі зовнішнім підписувачем, але скомпільовано без підтримки зовнішнього підписування</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">Помилка читання %s! Всі записи вірно зчитані, але дані транзакцій або метадані адрес можуть бути відсутніми або неправильними.</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">Помилка: Дані адресної книги в гаманці не можна ідентифікувати як належні до перенесених гаманців</translation>
</message>
@@ -4366,6 +4427,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">Помилка: Транзакцію %s в гаманці не можна ідентифікувати як належну до перенесених гаманців</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">Не вдалося розрахувати підвищені комісії, оскільки непідтверджені UTXO залежать від величезного кластеру непідтверджених транзакцій.</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">Не вдалося перейменувати недійсний файл peers.dat. Будь ласка, перемістіть його та повторіть спробу </translation>
</message>
@@ -4440,10 +4505,6 @@ Please try running the latest software version.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Непідтримуваний категорійний рівень журналювання -loglevel=%s. Очікується -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Припустимі категорії: %s. Припустимі рівні: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4496,6 +4557,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Файл дампа %s не існує.</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">Помилка при здійсненні транзакції БД для видалення транзакцій гаманця</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">Помилка створення %s</translation>
</message>
@@ -4544,16 +4609,12 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Помилка зчитування наступного запису з бази даних гаманця</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">Помилка: не вдається встановити призначення зі створеного сценарію scriptpubkey</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Помилка: Не вдалося додати транзакцію "тільки перегляд" до гаманця-для-перегляду</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">Помилка при початку транзакції БД для видалення транзакцій гаманця</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Помилка: Не вдалося видалити транзакції "тільки перегляд"</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">Помилка: не вдається встановити призначення зі створеного сценарію scriptpubkey</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4569,7 +4630,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">Помилка: Не вдалося створити новий гаманець-для-перегляду</translation>
+ <translation type="unfinished">Помилка: Не вдалося створити новий гаманець для спостереження</translation>
</message>
<message>
<source>Error: Got key that was not hex: %s</source>
@@ -4592,10 +4653,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Помилка: Немає доступних %s адрес.</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Помилка: Не всі транзакції "тільки перегляд" вдалося видалити</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Помилка; Цей гаманець вже використовує SQLite</translation>
</message>
@@ -4620,14 +4677,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Помилка: Не вдалося зчитати всі записи бази даних</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">Помилка: Не вдалося прочитати запис гаманця про локатор найкращого блока</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">Помилка: Не вдалося видалити дані "тільки перегляд" з адресної книги</translation>
+ <translation type="unfinished">Помилка: Не вдалося видалити дані "тільки для перегляду" з адресної книги</translation>
</message>
<message>
<source>Error: Unable to write record to new wallet</source>
<translation type="unfinished">Помилка: Не вдалося додати запис до нового гаманця</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">Помилка: Не вдалося записати запис спроможного гаманця про локатор найкращого блока</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">Помилка: Не вдалося записати запис гаманця для спостереження про локатор найкращого блока</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">Помилка: копіювання адресної книги не вдалося для гаманця %s</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">Помилка: транзакцію бази даних не вдалося виконати для гаманця %s</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">Не вдалося слухати на жодному порту. Використовуйте -listen=0, якщо ви хочете цього.</translation>
</message>
@@ -4636,10 +4713,18 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Помилка повторного сканування гаманця під час ініціалізації</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">Не вдалося запустити індекси, завершення роботи.</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">Не вдалося перевірити базу даних</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">Помилка при видаленні транзакції: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">Ставка комісії (%s) нижча за встановлену мінімальну ставку комісії (%s)</translation>
</message>
@@ -4757,15 +4842,15 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">Не знайдено попередньо вибраних вхідних даних %s</translation>
+ <translation type="unfinished">Неспроможний попередньо вибраний вхід %s</translation>
</message>
<message>
<source>Prune cannot be configured with a negative value.</source>
- <translation type="unfinished">Розмір скороченого блокчейна не може бути від'ємним.</translation>
+ <translation type="unfinished">Розмір скороченого блокчейну не може бути від'ємним.</translation>
</message>
<message>
<source>Prune mode is incompatible with -txindex.</source>
- <translation type="unfinished">Режим скороченого блокчейна несумісний з -txindex.</translation>
+ <translation type="unfinished">Режим скороченого блокчейну несумісний з -txindex.</translation>
</message>
<message>
<source>Pruning blockstore…</source>
@@ -4860,6 +4945,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Це транзакційна комісія, яку ви сплатите, якщо будете надсилати транзакцію.</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">Транзакція %s не належить до цього гаманця</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">Сума транзакції занадто мала</translation>
</message>
@@ -4872,10 +4961,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">У транзакції індекс виходу решти поза діапазоном</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">Транзакція має занадто довгий ланцюг у пулі транзакцій</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">У транзакції повинен бути щонайменше один одержувач</translation>
</message>
@@ -4952,14 +5037,30 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">Активовані невідомі нові правила (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Непідтримуваний глобальний рівень журналювання -loglevel=%s. Припустимі значення: %s.</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">Непідтримуваний глобальний рівень журналювання %s=%s. Припустимі значення: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">Помилка створення файлу гаманця: %s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">acceptstalefeeestimates не підтримується для %s блокчейну.</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">Непідтримувана категорія ведення журналу %s=%s.</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">Помилка: Не вдалося додати транзакцію "тільки для перегляду" %s до гаманця для спостереження</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">Помилка: Не вдалося видалити транзакції "тільки для перегляду".</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">Коментар до Агента користувача (%s) містить небезпечні символи.</translation>
</message>
diff --git a/src/qt/locale/bitcoin_ur.ts b/src/qt/locale/bitcoin_ur.ts
index 6bd87e672b..c0ff575864 100644
--- a/src/qt/locale/bitcoin_ur.ts
+++ b/src/qt/locale/bitcoin_ur.ts
@@ -2,10 +2,6 @@
<context>
<name>AddressBookPage</name>
<message>
- <source>Right-click to edit address or label</source>
- <translation type="unfinished">پتہ یا لیبل کی تصیح کیلیئے داہنا کلک</translation>
- </message>
- <message>
<source>Create a new address</source>
<translation type="unfinished">نیا پتہ تخلیق کریں</translation>
</message>
@@ -58,14 +54,6 @@
<translation type="unfinished">چننا</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">پتے ارسال کیے جارہے ہیں</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">پتے موصول ہورہے ہیں</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">یہ آپ کے ادائیگی بھیجنے کے لئے بٹ کوائن ایڈریس ہیں.سکے بھیجنے سے پہلے ہمیشہ رقم اور وصول کنندہ پتہ چیک کریں۔</translation>
</message>
@@ -227,6 +215,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">والیٹ کا پاسفریز کامیابی کے ساتھ تبدیل کردیا گیا تھا۔</translation>
</message>
<message>
+ <source>Passphrase change failed</source>
+ <translation type="unfinished">پاس فریز کی تبدیلی ناکام ہوگئی</translation>
+ </message>
+ <message>
+ <source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
+ <translation type="unfinished">بٹوے کے ڈکرپشن کے لیے درج کیا گیا پرانا پاس فریز غلط ہے۔ اس میں ایک خالی کریکٹر ہے (یعنی - ایک صفر بائٹ)۔ اگر پاس فریز 25.0 سے پہلے اس سافٹ ویئر کے ورژن کے ساتھ سیٹ کیا گیا تھا، تو براہ کرم صرف حروف کے ساتھ دوبارہ کوشش کریں — لیکن شامل نہیں — پہلے خالی کریکٹر۔</translation>
+ </message>
+ <message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">انتباہ: کیپس لاک کی آن ہے!</translation>
</message>
@@ -774,10 +770,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">فیس:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">نہ ہونے کے برابر</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">فیس کے بعد:</translation>
</message>
@@ -862,10 +854,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">بائٹس کاپی کریں</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">باقی شدہ کاپی کریں</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">تبدیلی کاپی کریں</translation>
</message>
@@ -874,18 +862,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">مقفل'%1</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">جی ہاں</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">نہیں</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">یہ لیبل سرخ ہو جاتا ہے اگر کوئی وصول کنندہ موجودہ کم سے کم مقرر کردہ حد سے کم رقم وصول کرتا ہے۔</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">مختلف ہو سکتے ہیں%1 +/- ساتوشی فی ان پٹ۔</translation>
</message>
@@ -1009,14 +985,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">خالی والیٹ بنائیں</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">ScriptPubKeys کے انتظام کے لیے وضاحت کنندگان کا استعمال کریں۔</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">وضاحتی والیٹ</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">بیرونی دستخط کرنے والا آلہ استعمال کریں جیسے ہارڈ ویئر والیٹ۔ پہلے والیٹ کی ترجیحات میں بیرونی دستخط کنندہ اسکرپٹ کو ترتیب دیں۔</translation>
</message>
@@ -1029,10 +997,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">بنائیں</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished"> SQliteسپورٹ کے بغیر مرتب کیا گیا (ڈسکرپٹر والیٹس کے لیے درکار)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">بیرونی دستخطی معاونت کے بغیر مرتب کیا گیا (بیرونی دستخط کے لیے درکار)</translation>
@@ -1950,10 +1914,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">ایک ساتھ متعدد وصول کنندگان کو بھیجیں۔</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">نہ ہونے کے برابر</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">منتخب کریں…</translation>
</message>
@@ -1998,10 +1958,6 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">بائٹس کاپی کریں</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">باقی شدہ کاپی کریں</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">تبدیلی کاپی کریں</translation>
</message>
diff --git a/src/qt/locale/bitcoin_uz.ts b/src/qt/locale/bitcoin_uz.ts
index e23476fcff..b7193d36b8 100644
--- a/src/qt/locale/bitcoin_uz.ts
+++ b/src/qt/locale/bitcoin_uz.ts
@@ -54,14 +54,6 @@
<translation type="unfinished">tanlamoq</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Yuboriladigan manzillar</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Qabul qilinadigan manzillar</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Quyidagilar to'lovlarni yuborish uchun Bitcoin manzillaringizdir. Har doim yuborishdan oldin yuborilayotgan tangalar sonini va qabul qiluvchi manzilni tekshirib ko'ring.</translation>
</message>
@@ -740,7 +732,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Date: %1
</source>
- <translation type="unfinished">Sana: %1</translation>
+ <translation type="unfinished">Sana: %1
+</translation>
</message>
<message>
<source>Amount: %1
@@ -774,7 +767,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Sent transaction</source>
- <translation type="unfinished">Yuborilgan tranzaksiya</translation>
+ <translation type="unfinished">Жўнатилган операция</translation>
</message>
<message>
<source>Incoming transaction</source>
@@ -782,7 +775,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">HD kalit yaratish &lt;b&gt;imkonsiz&lt;/b&gt;</translation>
+ <translation type="unfinished">HD kalit yaratish &lt;b&gt;yoqilgan&lt;/b&gt;</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -794,11 +787,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
- <translation type="unfinished">Hamyon &lt;b&gt;shifrlangan&lt;/b&gt; va hozircha &lt;b&gt;ochiq&lt;/b&gt;</translation>
+ <translation type="unfinished">Ҳамён &lt;b&gt;кодланган&lt;/b&gt; ва вақтинча &lt;b&gt;қулфдан чиқарилган&lt;/b&gt;</translation>
</message>
<message>
<source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
- <translation type="unfinished">Hamyon &lt;b&gt;shifrlangan&lt;/b&gt; va hozirda&lt;b&gt;qulflangan&lt;/b&gt;</translation>
+ <translation type="unfinished">Ҳамён &lt;b&gt;кодланган&lt;/b&gt; ва вақтинча &lt;b&gt;қулфланган&lt;/b&gt;</translation>
</message>
<message>
<source>Original message:</source>
@@ -835,10 +828,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Солиқ:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Ахлат қутиси:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">To'lovdan keyin:</translation>
</message>
@@ -927,36 +916,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Нусха байти</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">'Dust' larni nusxalash</translation>
- </message>
- <message>
<source>Copy change</source>
- <translation type="unfinished">Нусха қайтими</translation>
+ <translation type="unfinished">O'zgarishni nusxalash</translation>
</message>
<message>
<source>(%1 locked)</source>
<translation type="unfinished">(%1 qulflangan)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ha</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">yo'q</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Agar qabul qiluvchi joriy 'dust' chegarasidan kichikroq miqdor olsa, bu yorliq qizil rangga aylanadi</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Har bir kiruvchi +/- %1 satoshiga farq qilishi mumkin.</translation>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(Yorliqlar mavjud emas)</translation>
+ <translation type="unfinished">(Ёрлиқ мавжуд эмас)</translation>
</message>
<message>
<source>change from %1 (%2)</source>
@@ -1022,7 +995,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Hamyonni ochish</translation>
+ <translation type="unfinished">Ochiq hamyon</translation>
</message>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1096,14 +1069,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Bo'sh hamyon yaratish</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">scriptPubKey yaratishda izohlovchidan foydalanish</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Izohlovchi hamyon</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Uskuna hamyoni kabi tashqi signing qurilmasidan foydalaning. Avval hamyon sozlamalarida tashqi signer skriptini sozlang.</translation>
</message>
@@ -1116,10 +1081,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Yaratmoq</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Sqlite yordamisiz tuzilgan (deskriptor hamyonlari uchun talab qilinadi)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Tashqi signing yordamisiz tuzilgan (tashqi signing uchun zarur)</translation>
@@ -1595,7 +1556,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Xatolik</translation>
+ <translation type="unfinished">Хатолик</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1680,6 +1641,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>PSBTOperationsDialog</name>
<message>
+ <source>own address</source>
+ <translation type="unfinished">ўз манзили</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">ёки</translation>
</message>
@@ -1816,7 +1781,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">Oxirgi bloklash vaqti</translation>
+ <translation type="unfinished">Сўнгги блок вақти</translation>
</message>
<message>
<source>&amp;Open</source>
@@ -1948,7 +1913,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Could not unlock wallet.</source>
- <translation type="unfinished">Hamyonni ochish imkonsiz.</translation>
+ <translation type="unfinished">Ҳамён қулфдан чиқмади.</translation>
</message>
</context>
<context>
@@ -1994,7 +1959,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(Yorliqlar mavjud emas)</translation>
+ <translation type="unfinished">(Ёрлиқ мавжуд эмас)</translation>
</message>
<message>
<source>(no message)</source>
@@ -2076,10 +2041,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Шаклнинг барча майдончаларини тозалаш</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Ахлат қутиси:</translation>
- </message>
- <message>
<source>Clear &amp;All</source>
<translation type="unfinished">Барчасини &amp; Тозалаш</translation>
</message>
@@ -2116,12 +2077,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Нусха байти</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">'Dust' larni nusxalash</translation>
- </message>
- <message>
<source>Copy change</source>
- <translation type="unfinished">Нусха қайтими</translation>
+ <translation type="unfinished">O'zgarishni nusxalash</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2160,7 +2117,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(Yorliqlar mavjud emas)</translation>
+ <translation type="unfinished">(Ёрлиқ мавжуд эмас)</translation>
</message>
</context>
<context>
@@ -2359,10 +2316,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Жўнатиш</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Ўзингизга тўлов</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Фойда</translation>
</message>
@@ -2372,7 +2325,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(no label)</source>
- <translation type="unfinished">(Yorliqlar mavjud emas)</translation>
+ <translation type="unfinished">(Ёрлиқ мавжуд эмас)</translation>
</message>
<message>
<source>Transaction status. Hover over this field to show number of confirmations.</source>
@@ -2426,10 +2379,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Жўнатиш</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Ўзингизга</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Фойда</translation>
</message>
@@ -2488,7 +2437,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Exporting Failed</source>
- <translation type="unfinished">Eksport qilish amalga oshmadi</translation>
+ <translation type="unfinished">Экспорт қилиб бўлмади</translation>
</message>
<message>
<source>The transaction history was successfully saved to %1.</source>
@@ -2511,7 +2460,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Xatolik</translation>
+ <translation type="unfinished">Хатолик</translation>
</message>
</context>
<context>
diff --git a/src/qt/locale/bitcoin_uz@Cyrl.ts b/src/qt/locale/bitcoin_uz@Cyrl.ts
index b9dbc2ee65..f335cb39ab 100644
--- a/src/qt/locale/bitcoin_uz@Cyrl.ts
+++ b/src/qt/locale/bitcoin_uz@Cyrl.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Танлаш</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Жўнатиладиган манзиллар</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Қабул қилинадиган манзиллар</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Улар тўловларни жўнатиш учун сизнинг Bitcoin манзилларингиз. Доимо тангаларни жўнатишдан олдин сумма ва қабул қилувчи манзилни текшириб кўринг. </translation>
</message>
@@ -745,7 +737,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Date: %1
</source>
- <translation type="unfinished">Sana: %1</translation>
+ <translation type="unfinished">Sana: %1
+</translation>
</message>
<message>
<source>Amount: %1
@@ -787,7 +780,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
- <translation type="unfinished">HD kalit yaratish &lt;b&gt;imkonsiz&lt;/b&gt;</translation>
+ <translation type="unfinished">HD kalit yaratish &lt;b&gt;yoqilgan&lt;/b&gt;</translation>
</message>
<message>
<source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
@@ -840,10 +833,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Солиқ:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Ахлат қутиси:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">Солиқдан сўнг:</translation>
</message>
@@ -932,10 +921,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Нусха байти</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Нусха чангги</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Нусха қайтими</translation>
</message>
@@ -944,18 +929,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1 қулфланган)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ҳа</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">йўқ</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Agar qabul qiluvchi joriy 'dust' chegarasidan kichikroq miqdor olsa, bu yorliq qizil rangga aylanadi</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Ҳар бир кирим +/- %1 сатоши(лар) билан ўзгариши мумкин.</translation>
</message>
@@ -1027,7 +1000,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">Hamyonni ochish</translation>
+ <translation type="unfinished">Ochiq hamyon</translation>
</message>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1101,14 +1074,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Bo'sh hamyon yaratish</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">scriptPubKey yaratishda izohlovchidan foydalanish</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Izohlovchi hamyon</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Uskuna hamyoni kabi tashqi signing qurilmasidan foydalaning. Avval hamyon sozlamalarida tashqi signer skriptini sozlang.</translation>
</message>
@@ -1121,10 +1086,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Yaratmoq</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Sqlite yordamisiz tuzilgan (deskriptor hamyonlari uchun talab qilinadi)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Tashqi signing yordamisiz tuzilgan (tashqi signing uchun zarur)</translation>
@@ -1685,6 +1646,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>PSBTOperationsDialog</name>
<message>
+ <source>own address</source>
+ <translation type="unfinished">ўз манзили</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">ёки</translation>
</message>
@@ -2081,10 +2046,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Шаклнинг барча майдончаларини тозалаш</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">Ахлат қутиси:</translation>
- </message>
- <message>
<source>Clear &amp;All</source>
<translation type="unfinished">Барчасини &amp; Тозалаш</translation>
</message>
@@ -2121,10 +2082,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Нусха байти</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">Нусха чангги</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">Нусха қайтими</translation>
</message>
@@ -2364,10 +2321,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Жўнатиш</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Ўзингизга тўлов</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Фойда</translation>
</message>
@@ -2431,10 +2384,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Жўнатиш</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Ўзингизга</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Фойда</translation>
</message>
diff --git a/src/qt/locale/bitcoin_uz@Latn.ts b/src/qt/locale/bitcoin_uz@Latn.ts
index 7b3b660a69..823b21be06 100644
--- a/src/qt/locale/bitcoin_uz@Latn.ts
+++ b/src/qt/locale/bitcoin_uz@Latn.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">&amp;Tanlash</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Manzillarni yuborish</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Qabul qiluvchi manzillari</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">Quyida to'lovlarni yuborish uchun Bitcoin manzillaringiz. Coinlarni yuborishdan oldin har doim miqdor va qabul qilish manzilini tekshiring.</translation>
</message>
@@ -929,10 +921,6 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">Baytlarni nusxalash</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">'Dust' larni nusxalash</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">O'zgarishni nusxalash</translation>
</message>
@@ -941,18 +929,6 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">(%1 qulflangan)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">ha</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">yo'q</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">Agar qabul qiluvchi joriy 'dust' chegarasidan kichikroq miqdor olsa, bu yorliq qizil rangga aylanadi</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">Har bir kiruvchi +/- %1 satoshiga farq qilishi mumkin.</translation>
</message>
@@ -1098,14 +1074,6 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">Bo'sh hamyon yaratish</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">scriptPubKey yaratishda izohlovchidan foydalanish</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">Deskriptor hamyon</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Uskuna hamyoni kabi tashqi signing qurilmasidan foydalaning. Avval hamyon sozlamalarida tashqi signer skriptini sozlang.</translation>
</message>
@@ -1118,10 +1086,6 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">Yaratmoq</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">Sqlite yordamisiz tuzilgan (deskriptor hamyonlari uchun talab qilinadi)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">Tashqi signing yordamisiz tuzilgan (tashqi signing uchun zarur)</translation>
@@ -1597,7 +1561,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Xatolik</translation>
+ <translation type="unfinished">Хатолик</translation>
</message>
<message>
<source>This change would require a client restart.</source>
@@ -1682,6 +1646,10 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<context>
<name>PSBTOperationsDialog</name>
<message>
+ <source>own address</source>
+ <translation type="unfinished">ўз манзили</translation>
+ </message>
+ <message>
<source>or</source>
<translation type="unfinished">ёки</translation>
</message>
@@ -1818,7 +1786,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Last block time</source>
- <translation type="unfinished">Oxirgi bloklash vaqti</translation>
+ <translation type="unfinished">Сўнгги блок вақти</translation>
</message>
<message>
<source>&amp;Open</source>
@@ -1950,7 +1918,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
- <translation type="unfinished">Hamyonni ochish imkonsiz.</translation>
+ <translation type="unfinished">Ҳамён қулфдан чиқмади.</translation>
</message>
</context>
<context>
@@ -2114,10 +2082,6 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">Baytlarni nusxalash</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">'Dust' larni nusxalash</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">O'zgarishni nusxalash</translation>
</message>
@@ -2357,10 +2321,6 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">Жўнатиш</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">Ўзингизга тўлов</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Фойда</translation>
</message>
@@ -2424,10 +2384,6 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
<translation type="unfinished">Жўнатиш</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">Ўзингизга</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">Фойда</translation>
</message>
@@ -2509,7 +2465,7 @@ Kirish faqat 'legacy' turidagi manzillar uchun.</translation>
</message>
<message>
<source>Error</source>
- <translation type="unfinished">Xatolik</translation>
+ <translation type="unfinished">Хатолик</translation>
</message>
</context>
<context>
diff --git a/src/qt/locale/bitcoin_vi.ts b/src/qt/locale/bitcoin_vi.ts
index 083fc4a8c7..fe69b4c1f3 100644
--- a/src/qt/locale/bitcoin_vi.ts
+++ b/src/qt/locale/bitcoin_vi.ts
@@ -22,6 +22,10 @@
<translation type="unfinished">&amp;Sao chép</translation>
</message>
<message>
+ <source>C&amp;lose</source>
+ <translation type="unfinished">Đ&amp;óng</translation>
+ </message>
+ <message>
<source>Delete the currently selected address from the list</source>
<translation type="unfinished">Xoá địa chỉ được chọn khỏi danh sách</translation>
</message>
@@ -30,16 +34,24 @@
<translation type="unfinished">Nhập địa chỉ hoặc nhãn để tìm kiếm</translation>
</message>
<message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Xuất dữ liệu ở thẻ hiện tại ra tập tin.</translation>
+ </message>
+ <message>
<source>&amp;Export</source>
<translation type="unfinished">&amp;Xuất</translation>
</message>
<message>
+ <source>&amp;Delete</source>
+ <translation type="unfinished">&amp;Xoá</translation>
+ </message>
+ <message>
<source>Choose the address to send coins to</source>
<translation type="unfinished">Chọn địa chỉ để gửi coin đến</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">Đang gửi địa chỉ</translation>
+ <source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
+ <translation type="unfinished">Các địa chỉ này là các địa chỉ Bitcoin dùng để thanh toán.Luôn luôn kiểm tra số dư và địa chỉ nhận trước khi gởi chuyển tiền ảo. </translation>
</message>
<message>
<source>&amp;Copy Address</source>
@@ -57,7 +69,15 @@
<source>Export Address List</source>
<translation type="unfinished">Xuất danh sách địa chỉ</translation>
</message>
- </context>
+ <message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">Địa chỉ gửi%1</translation>
+ </message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Quá trình xuất dữ liệu đã thất bại</translation>
+ </message>
+</context>
<context>
<name>AddressTableModel</name>
<message>
@@ -433,6 +453,22 @@
</translation>
</message>
<message>
+ <source>%1 behind</source>
+ <translation type="unfinished">%1 phía sau</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">Lỗi</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation type="unfinished">Thông tin</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation type="unfinished">cập nhật</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction</source>
<translation type="unfinished">Tải một phần giao dịch Bitcoin đã ký</translation>
</message>
@@ -495,6 +531,14 @@
<translation type="unfinished">Hiển thị %1 tin nhắn hỗ trợ để nhận được danh sách Bitcoin command-line khả dụng</translation>
</message>
<message>
+ <source>&amp;Mask values</source>
+ <translation type="unfinished">&amp;Giá trị mặt nạ</translation>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">Che các giá trị trong tab Tổng quan</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">ví mặc định</translation>
</message>
@@ -556,6 +600,10 @@
<translation type="unfinished">Tiền đồng bộ hóa Headers (%1%)…</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">Lỗi tạo ví</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">Lỗi: %1</translation>
</message>
@@ -619,6 +667,18 @@
</message>
</context>
<context>
+ <name>OpenWalletActivity</name>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">ví mặc định</translation>
+ </message>
+ <message>
+ <source>Open Wallet</source>
+ <extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
+ <translation type="unfinished">Mớ ví</translation>
+ </message>
+ </context>
+<context>
<name>RestoreWalletActivity</name>
<message>
<source>Restore Wallet</source>
@@ -656,14 +716,14 @@
<source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
<translation type="unfinished">Bạn có chắc chắn muốn đóng ví không &lt;i&gt;%1&lt;/i&gt;?</translation>
</message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">Đóng tất cả ví</translation>
+ </message>
</context>
<context>
<name>CreateWalletDialog</name>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">Sử dụng bộ mô tả để quản lý scriptPubKey</translation>
- </message>
- <message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
<translation type="unfinished">Sử dụng thiết bị ký bên ngoài chẳng hạn như ví phần cứng. Trước tiên, hãy định cấu hình tập lệnh người ký bên ngoài trong tùy chọn ví.</translation>
</message>
@@ -1178,10 +1238,18 @@
<source>Address</source>
<translation type="unfinished">Địa chỉ</translation>
</message>
+ <message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">Quá trình xuất dữ liệu đã thất bại</translation>
+ </message>
</context>
<context>
<name>WalletFrame</name>
<message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">Tạo một ví mới</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">Lỗi</translation>
</message>
@@ -1193,13 +1261,21 @@
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">Đã sao chép vào bảng tạm.</translation>
</message>
- </context>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">ví mặc định</translation>
+ </message>
+</context>
<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
<translation type="unfinished">&amp;Xuất</translation>
</message>
+ <message>
+ <source>Export the data in the current tab to a file</source>
+ <translation type="unfinished">Xuất dữ liệu ở thẻ hiện tại ra tập tin.</translation>
+ </message>
</context>
<context>
<name>bitcoin-core</name>
@@ -1216,10 +1292,6 @@
<translation type="unfinished">Chế độ rút gọn không tương thích với -reindex-chainstate. Sử dụng -reindex ở chế độ đầy đủ.</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">Chỉ mục khối db chứa một 'txindex' kế thừa. Để xóa dung lượng ổ đĩa bị chiếm dụng, hãy chạy -reindex đầy đủ, nếu không, hãy bỏ qua lỗi này. Thông báo lỗi này sẽ không được hiển thị lại.</translation>
- </message>
- <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">Tìm thấy định dạng cơ sở dữ liệu trạng thái chuỗi không được hỗ trợ. Vui lòng khỏi động lại với -reindex-chainstate. Việc này sẽ tái thiết lập cơ sở dữ liệu trạng thái chuỗi.</translation>
</message>
@@ -1232,22 +1304,6 @@
<translation type="unfinished">Không thể đặt -forcednsseed thành true khi đặt -dnsseed thành false.</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">Không thể hoàn tất nâng cấp -txindex được bắt đầu bởi phiên bản trước. Khởi động lại với phiên bản trước đó hoặc chạy -reindex đầy đủ.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">reindex-chainstate tùy chọn không tương thích với -blockfilterindex. Vui lòng tạp thời vô hiệu hóa blockfilterindex trong khi sử dụng -reindex-chainstate, hoặc thay thế -reindex-chainstate bởi -reindex để tái thiết lập đẩy đủ tất cả các chỉ số.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">reindex-chainstate tùy chọn không tương thích với -coinstatsindex. Vui lòng tạp thời vô hiệu hóa coinstatsindex trong khi sử dụng -reindex-chainstate, hoặc thay thế -reindex-chainstate bởi -reindex để tái thiết lập đẩy đủ tất cả các chỉ số.</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">reindex-chainstate tùy chọn không tương thích với -txindex. Vui lòng tạp thời vô hiệu hóa txindex trong khi sử dụng -reindex-chainstate, hoặc thay thế -reindex-chainstate bởi -reindex để tái thiết lập đẩy đủ tất cả các chỉ số.</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">Không thể cung cấp các kết nối cụ thể và yêu cầu addrman tìm các kết nối gửi đi cùng một lúc.</translation>
</message>
@@ -1282,10 +1338,6 @@ Vui lòng thử chạy phiên bản phần mềm mới nhất.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">Mức độ ghi chú theo danh mục không được hỗ trợ -loglevel=%s. Kỳ vọng -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Các danh mục hợp lệ: %s. Các giá trị loglevels hợp lệ: %s.</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -1310,22 +1362,10 @@ Không thể khôi phục bản sao lưu của ví.</translation>
<translation type="unfinished">Lỗi: Không thể trích xuất điểm đến trong mã khóa công khai đã tạo</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">Lỗi: Không thể thêm giao dịch chỉ xem vào ví chỉ xem</translation>
- </message>
- <message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">Lỗi: Không thể xóa các giao dịch chỉ xem</translation>
- </message>
- <message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">Lỗi: Tạo ví chỉ xem mới thất bại</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">Lỗi: Không phải giao dịch chỉ xem nào cũng xóa được</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">Lỗi: Ví này đã dùng SQLite</translation>
</message>
@@ -1426,10 +1466,6 @@ Không thể khôi phục bản sao lưu của ví.</translation>
<translation type="unfinished">Không thể gỡ ví trước khi chuyển</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">Mức độ ghi chú không được hỗ trợ -loglevel=%s. Các giá trị hợp lệ: %s.</translation>
- </message>
- <message>
<source>Settings file could not be read</source>
<translation type="unfinished">Không thể đọc tệp cài đặt</translation>
</message>
diff --git a/src/qt/locale/bitcoin_yue.ts b/src/qt/locale/bitcoin_yue.ts
index 94f4b5694a..1ed37d36ce 100644
--- a/src/qt/locale/bitcoin_yue.ts
+++ b/src/qt/locale/bitcoin_yue.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">选择(&amp;H)</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">发送地址</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">收款地址</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">这些是你的比特币支付地址。在发送之前,一定要核对金额和接收地址。</translation>
</message>
@@ -101,6 +93,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">儲存地址列表到 %1 時發生錯誤。請再試一次。</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">付款地址 - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">收款地址 - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">导出失败</translation>
</message>
@@ -294,15 +294,45 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">请输入一个比特币地址 (例如 %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
<message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
<translation type="unfinished">区块转发</translation>
@@ -313,6 +343,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手册</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 天</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation type="unfinished">%1 小时</translation>
</message>
@@ -321,6 +365,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 分</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation type="unfinished">未知</translation>
</message>
@@ -560,6 +612,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Connecting to peers…</source>
<translation type="unfinished">连到同行...</translation>
</message>
+ <message>
+ <source>Request payments (generates QR codes and bitcoin: URIs)</source>
+ <translation type="unfinished">请求支付 (生成二维码和 bitcoin: URI)</translation>
+ </message>
+ <message>
+ <source>Show the list of used sending addresses and labels</source>
+ <translation type="unfinished">显示用过的付款地址和标签的列表</translation>
+ </message>
+ <message>
+ <source>Show the list of used receiving addresses and labels</source>
+ <translation type="unfinished">顯示已使用過的接收地址和標籤清單</translation>
+ </message>
+ <message>
+ <source>&amp;Command-line options</source>
+ <translation type="unfinished">命令行选项(&amp;C)</translation>
+ </message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
@@ -567,10 +635,38 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>%1 behind</source>
+ <translation type="unfinished">落后 %1</translation>
+ </message>
+ <message>
<source>Catching up…</source>
<translation type="unfinished">赶上...</translation>
</message>
<message>
+ <source>Last received block was generated %1 ago.</source>
+ <translation type="unfinished">最新接收到的区块是在%1之前生成的。</translation>
+ </message>
+ <message>
+ <source>Transactions after this will not yet be visible.</source>
+ <translation type="unfinished">在此之后的交易尚不可见。</translation>
+ </message>
+ <message>
+ <source>Error</source>
+ <translation type="unfinished">错误</translation>
+ </message>
+ <message>
+ <source>Warning</source>
+ <translation type="unfinished">警告</translation>
+ </message>
+ <message>
+ <source>Information</source>
+ <translation type="unfinished">資訊</translation>
+ </message>
+ <message>
+ <source>Up to date</source>
+ <translation type="unfinished">已是最新</translation>
+ </message>
+ <message>
<source>Load Partially Signed Bitcoin Transaction</source>
<translation type="unfinished">加载部分签名比特币交易(PSBT)</translation>
</message>
@@ -629,8 +725,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">关闭所有钱包</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">迁移一个钱包</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示%1帮助消息以获得可能包含Bitcoin命令行选项的列表</translation>
+ <translation type="unfinished">显示 %1 帮助信息,获取可用命令行选项列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -724,6 +828,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">預先同步標頭(%1%)</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">创建钱包时出错</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">无法创建新钱包,软件编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">錯誤: %1</translation>
</message>
@@ -732,12 +844,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">警告: %1</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">日期: %1
+</translation>
+ </message>
+ <message>
<source>Amount: %1
</source>
<translation type="unfinished">金額: %1
</translation>
</message>
<message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">錢包: %1
+</translation>
+ </message>
+ <message>
<source>Type: %1
</source>
<translation type="unfinished">種類: %1
@@ -756,6 +880,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
<source>Incoming transaction</source>
<translation type="unfinished">收款交易</translation>
</message>
@@ -776,6 +904,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
<message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Original message:</source>
<translation type="unfinished">原消息:</translation>
</message>
@@ -794,14 +926,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手动选币</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
</message>
<message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
<source>Tree mode</source>
<translation type="unfinished">树状模式</translation>
</message>
@@ -814,10 +966,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
<source>Received with address</source>
<translation type="unfinished">收款地址</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
@@ -842,6 +1006,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">锁定未花费(&amp;O)</translation>
</message>
<message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -858,10 +1026,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -870,14 +1034,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1已锁定)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">是</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">當任何一個收款金額小於目前的灰塵金額上限時,文字會變紅色。</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">每个输入可能有 +/- %1 聪 (satoshi) 的误差。</translation>
</message>
@@ -889,7 +1045,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- </context>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -920,6 +1080,57 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您确定想要迁移钱包&lt;i&gt;%1&lt;/i&gt;吗?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">迁移钱包将会把这个钱包转换成一个或多个输出描述符钱包。将会需要创建一个新的钱包备份。
+如果这个钱包包含仅观察脚本,将会创建包含那些仅观察脚本的新钱包。
+如果这个钱包包含可解但又未被监视的脚本,将会创建一个不同的钱包以包含那些脚本。
+
+迁移过程开始前将会创建一个钱包备份。备份文件将会被命名为 &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak 然后被保存在该钱包所在目录下。如果迁移过程出错,可以使用“恢复钱包”功能恢复备份。</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">迁移钱包 &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">迁移失败</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">迁移成功</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -930,9 +1141,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">打開錢包警告</translation>
</message>
<message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+ <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">開啟錢包</translation>
+ <translation type="unfinished">打开钱包</translation>
</message>
</context>
<context>
@@ -969,6 +1184,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Close wallet</source>
<translation type="unfinished">卸载钱包</translation>
</message>
+ <message>
+ <source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
+ <translation type="unfinished">启用修剪时,如果一个钱包被卸载太久,就必须重新同步整条区块链才能再次加载它。</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">关闭所有钱包</translation>
+ </message>
</context>
<context>
<name>CreateWalletDialog</name>
@@ -977,8 +1200,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">新增錢包</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">距离创建您的新钱包只有一步之遥了!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">请指定一个名字,如果需要的话还可以启用高级选项</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
- <translation type="unfinished">錢包名稱</translation>
+ <translation type="unfinished">钱包名称</translation>
</message>
<message>
<source>Wallet</source>
@@ -989,10 +1220,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">加密錢包。 錢包將使用您選擇的密碼進行加密。</translation>
</message>
<message>
+ <source>Advanced Options</source>
+ <translation type="unfinished">进阶设定</translation>
+ </message>
+ <message>
<source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
<translation type="unfinished">禁用此錢包的私鑰。取消了私鑰的錢包將沒有私鑰,並且不能有HD種子或匯入的私鑰。這是只能看的錢包的理想選擇。</translation>
</message>
<message>
+ <source>Disable Private Keys</source>
+ <translation type="unfinished">禁用私鑰</translation>
+ </message>
+ <message>
<source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
<translation type="unfinished">製作一個空白的錢包。空白錢包最初沒有私鑰或腳本。以後可以匯入私鑰和地址,或者可以設定HD種子。</translation>
</message>
@@ -1004,10 +1243,26 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>EditAddressDialog</name>
<message>
+ <source>Edit Address</source>
+ <translation type="unfinished">編輯地址</translation>
+ </message>
+ <message>
+ <source>&amp;Label</source>
+ <translation type="unfinished">标签(&amp;L)</translation>
+ </message>
+ <message>
+ <source>The label associated with this address list entry</source>
+ <translation type="unfinished">与此地址关联的标签</translation>
+ </message>
+ <message>
<source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
<translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
</message>
<message>
+ <source>New sending address</source>
+ <translation type="unfinished">新建付款地址</translation>
+ </message>
+ <message>
<source>Edit receiving address</source>
<translation type="unfinished">編輯接收地址</translation>
</message>
@@ -1016,6 +1271,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>The entered address "%1" is already in the address book with label "%2".</source>
+ <translation type="unfinished">輸入的地址 %1 已經在地址簿中了,標籤為 "%2"。</translation>
+ </message>
+ <message>
+ <source>Could not unlock wallet.</source>
+ <translation type="unfinished">无法解锁钱包。</translation>
+ </message>
+ <message>
<source>New key generation failed.</source>
<translation type="unfinished">產生新的密鑰失敗了。</translation>
</message>
@@ -1030,7 +1293,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished">已經有這個目錄了。如果你要在裡面造出新的目錄的話,請加上 %1.</translation>
</message>
- </context>
+ <message>
+ <source>Cannot create data directory here.</source>
+ <translation type="unfinished">沒辦法在這裡造出資料目錄。</translation>
+ </message>
+</context>
<context>
<name>Intro</name>
<message numerus="yes">
@@ -1099,6 +1366,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
</message>
<message>
+ <source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
+ <translation type="unfinished">初始化同步过程是非常吃力的,同时可能会暴露您之前没有注意到的电脑硬件问题。你每次启动%1时,它都会从之前中断的地方继续下载。</translation>
+ </message>
+ <message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
<translation type="unfinished">當你點擊「確認」,%1會開始下載,並從%3年最早的交易,處裡整個%4區塊鏈(大小:%2GB)</translation>
</message>
@@ -1206,7 +1477,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Open bitcoin URI</source>
<translation type="unfinished">打开比特币URI</translation>
</message>
- </context>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -1214,6 +1490,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">選項</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
<translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
</message>
@@ -1222,6 +1506,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
</message>
<message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -1238,6 +1530,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1262,6 +1558,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -1290,6 +1590,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -1300,10 +1604,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -1314,10 +1630,30 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
<translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">使用 &amp;UPnP 映射端口</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1334,6 +1670,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
</message>
<message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
<source>Port of the proxy (e.g. 9050)</source>
<translation type="unfinished">代理伺服器的通訊埠(像是 9050)</translation>
</message>
@@ -1346,6 +1690,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口(&amp;W)</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1358,6 +1710,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
</message>
<message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
<source>User Interface &amp;language:</source>
<translation type="unfinished">使用界面語言(&amp;L):</translation>
</message>
@@ -1382,22 +1738,39 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
</message>
<message>
<source>default</source>
<translation type="unfinished">預設值</translation>
</message>
<message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished">需要重新開始客戶端軟體來讓改變生效。</translation>
@@ -1438,7 +1811,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>The configuration file could not be opened.</source>
<translation type="unfinished">无法打开配置文件。</translation>
</message>
- </context>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -1457,6 +1838,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">顯示的資訊可能是過期的。跟 Bitcoin 網路的連線建立後,你的錢包會自動和網路同步,但是這個步驟還沒完成。</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation type="unfinished">可用金額:</translation>
</message>
@@ -1485,10 +1870,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">餘額</translation>
</message>
<message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
<source>Your current total balance</source>
<translation type="unfinished">您当前的总余额</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation type="unfinished">最近的交易</translation>
</message>
@@ -1497,6 +1894,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">仅观察地址的未确认交易</translation>
</message>
<message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
<source>Current total balance in watch-only addresses</source>
<translation type="unfinished">仅观察地址中的当前总余额</translation>
</message>
@@ -1532,6 +1933,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">關閉</translation>
</message>
<message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
@@ -1544,6 +1953,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
</message>
<message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -1553,6 +1978,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
<source>Pays transaction fee: </source>
<translation type="unfinished">支付交易费用:</translation>
</message>
@@ -1581,6 +2018,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(但这个钱包不能签名交易)</translation>
</message>
<message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
<source>Transaction status is unknown.</source>
<translation type="unfinished">交易状态未知。</translation>
</message>
@@ -1592,6 +2037,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">支付请求出错</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
<source>URI handling</source>
<translation type="unfinished">URI 處理</translation>
</message>
@@ -1668,7 +2117,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<extracomment>An Inbound Connection from a Peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
- </context>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1676,10 +2130,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
<source>Error encoding URI into QR Code.</source>
<translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
</message>
<message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
<source>Save QR Code</source>
<translation type="unfinished">儲存 QR 碼</translation>
</message>
@@ -1704,6 +2170,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">資訊(&amp;I)</translation>
</message>
<message>
+ <source>General</source>
+ <translation type="unfinished">常规</translation>
+ </message>
+ <message>
<source>Datadir</source>
<translation type="unfinished">数据目录</translation>
</message>
@@ -1716,6 +2186,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">区块存储目录</translation>
</message>
<message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">啓動時間</translation>
</message>
@@ -1724,6 +2198,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络</translation>
</message>
<message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation type="unfinished">連線數</translation>
</message>
@@ -1732,10 +2210,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">區塊鏈</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
<source>Memory usage</source>
<translation type="unfinished">内存使用</translation>
</message>
<message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
<source>(none)</source>
<translation type="unfinished">(无)</translation>
</message>
@@ -1764,6 +2254,26 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">选择节点查看详细信息。</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">传输层版本: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">传输</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">十六进制格式的BIP324会话ID,如果有的话。</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">会话ID</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">是否要将交易转发给这个节点。</translation>
</message>
@@ -1772,10 +2282,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation type="unfinished">已同步前導資料</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
@@ -1830,6 +2348,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">当前区块高度</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
<source>Decrease font size</source>
<translation type="unfinished">缩小字体大小</translation>
</message>
@@ -1866,10 +2388,23 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">高带宽</translation>
</message>
<message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
<source>Last Block</source>
<translation type="unfinished">上一个区块</translation>
</message>
<message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">最近送出</translation>
</message>
@@ -1878,6 +2413,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">上次接收</translation>
</message>
<message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
<source>The duration of a currently outstanding ping.</source>
<translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
</message>
@@ -1886,6 +2425,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ping 等待</translation>
</message>
<message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>&amp;Open</source>
<translation type="unfinished">打开(&amp;O)</translation>
</message>
@@ -1902,6 +2453,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">總計</translation>
</message>
<message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
<source>Clear console</source>
<translation type="unfinished">清主控台</translation>
</message>
@@ -1939,6 +2494,26 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
</message>
<message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: 未加密,明文传输协议</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324加密传输协议</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">我们选择了用于高带宽转发的节点</translation>
</message>
@@ -1947,15 +2522,35 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">对端选择了我们用于高带宽转发</translation>
</message>
<message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">复制地址(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation type="unfinished">1 小时(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
@@ -1965,6 +2560,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">解封(&amp;U)</translation>
</message>
<message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -1987,6 +2598,10 @@ For more information on using this console, type %6.
<translation type="unfinished">执行中……</translation>
</message>
<message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">經由 %1</translation>
</message>
@@ -1995,6 +2610,10 @@ For more information on using this console, type %6.
<translation type="unfinished">是</translation>
</message>
<message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">到</translation>
</message>
@@ -2022,6 +2641,10 @@ For more information on using this console, type %6.
<translation type="unfinished">金额(&amp;A):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
<source>&amp;Message:</source>
<translation type="unfinished">訊息(&amp;M):</translation>
</message>
@@ -2030,6 +2653,10 @@ For more information on using this console, type %6.
<translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
</message>
<message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
</message>
@@ -2042,10 +2669,18 @@ For more information on using this console, type %6.
<translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
</message>
<message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
<source>&amp;Create new receiving address</source>
<translation type="unfinished">&amp;產生新的接收地址</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
<source>Clear</source>
<translation type="unfinished">清空</translation>
</message>
@@ -2066,6 +2701,10 @@ For more information on using this console, type %6.
<translation type="unfinished">从列表中移除选中的条目</translation>
</message>
<message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">複製 &amp;URI</translation>
</message>
@@ -2121,6 +2760,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请求支付至...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
<source>Label:</source>
<translation type="unfinished">标签:</translation>
</message>
@@ -2141,10 +2788,22 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
<source>Request payment to %1</source>
<translation type="unfinished">付款給 %1 的要求</translation>
</message>
@@ -2152,14 +2811,26 @@ For more information on using this console, type %6.
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
<message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
<source>(no amount requested)</source>
<translation type="unfinished">(無要求金額)</translation>
</message>
@@ -2187,14 +2858,38 @@ For more information on using this console, type %6.
<translation type="unfinished">金额不足!</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished">如果這項有打開,但是找零地址是空的或無效,那麼找零會送到一個產生出來的地址去。</translation>
</message>
<message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
<source>Transaction Fee:</source>
<translation type="unfinished">交易手续费:</translation>
</message>
@@ -2207,6 +2902,10 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -2219,12 +2918,20 @@ For more information on using this console, type %6.
<translation type="unfinished">自訂:</translation>
</message>
<message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
<source>Add &amp;Recipient</source>
<translation type="unfinished">增加收款人(&amp;R)</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
</message>
<message>
<source>Choose…</source>
@@ -2235,18 +2942,54 @@ For more information on using this console, type %6.
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
<translation type="unfinished">手續費太低的話可能會造成永遠無法確認的交易(請參考提示)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation type="unfinished">餘額:</translation>
</message>
<message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -2267,10 +3010,6 @@ For more information on using this console, type %6.
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -2279,12 +3018,26 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 (%2个块)</translation>
</message>
<message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2300,6 +3053,10 @@ For more information on using this console, type %6.
<translation type="unfinished">外部签名器失败</translation>
</message>
<message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -2313,6 +3070,10 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -2328,6 +3089,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请检查您的交易。</translation>
</message>
<message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">總金額</translation>
</message>
@@ -2362,6 +3131,22 @@ For more information on using this console, type %6.
<translation type="unfinished">支付金额必须大于0。</translation>
</message>
<message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
</message>
@@ -2376,10 +3161,18 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 比特币地址无效</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
<source>Confirm custom change address</source>
<translation type="unfinished">确认自定义找零地址</translation>
</message>
<message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
@@ -2395,14 +3188,34 @@ For more information on using this console, type %6.
<translation type="unfinished">付給(&amp;T):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
<source>The Bitcoin address to send the payment to</source>
<translation type="unfinished">將支付發送到的比特幣地址給</translation>
</message>
<message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
<source>The amount to send in the selected unit</source>
<translation type="unfinished">用被选单位表示的待发送金额</translation>
</message>
<message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
<source>S&amp;ubtract fee from amount</source>
<translation type="unfinished">從付款金額減去手續費(&amp;U)</translation>
</message>
@@ -2449,6 +3262,22 @@ For more information on using this console, type %6.
<translation type="unfinished">您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。</translation>
</message>
<message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
<source>Signature</source>
<translation type="unfinished">簽章</translation>
</message>
@@ -2469,10 +3298,18 @@ For more information on using this console, type %6.
<translation type="unfinished">清空所有签名消息栏</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Verify Message</source>
<translation type="unfinished">消息验证(&amp;V)</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation type="unfinished">用来签名消息的地址</translation>
</message>
@@ -2489,6 +3326,14 @@ For more information on using this console, type %6.
<translation type="unfinished">驗證這個訊息來確定是用指定的比特幣地址簽名的</translation>
</message>
<message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
<source>Click "Sign Message" to generate signature</source>
<translation type="unfinished">請按一下「簽署訊息」來產生簽章</translation>
</message>
@@ -2505,6 +3350,10 @@ For more information on using this console, type %6.
<translation type="unfinished">找不到与输入地址相关的密钥。</translation>
</message>
<message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
<source>No error</source>
<translation type="unfinished">沒有錯誤</translation>
</message>
@@ -2517,6 +3366,14 @@ For more information on using this console, type %6.
<translation type="unfinished">消息签名失败。</translation>
</message>
<message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
<source>Please check the signature and try again.</source>
<translation type="unfinished">请检查签名后重试。</translation>
</message>
@@ -2525,6 +3382,10 @@ For more information on using this console, type %6.
<translation type="unfinished">這個簽章跟訊息的數位摘要不符。</translation>
</message>
<message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
<source>Message verified.</source>
<translation type="unfinished">消息验证成功。</translation>
</message>
@@ -2558,6 +3419,11 @@ For more information on using this console, type %6.
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
<message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>%1/unconfirmed</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
<translation type="unfinished">%1 次/未確認</translation>
@@ -2572,10 +3438,18 @@ For more information on using this console, type %6.
<translation type="unfinished">状态</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Source</source>
<translation type="unfinished">來源</translation>
</message>
<message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
<source>From</source>
<translation type="unfinished">來源</translation>
</message>
@@ -2588,6 +3462,10 @@ For more information on using this console, type %6.
<translation type="unfinished">到</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
<source>watch-only</source>
<translation type="unfinished">只能看</translation>
</message>
@@ -2595,6 +3473,10 @@ For more information on using this console, type %6.
<source>label</source>
<translation type="unfinished">标签</translation>
</message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2602,18 +3484,46 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
<source>Total debit</source>
<translation type="unfinished">总支出</translation>
</message>
<message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
<source>Net amount</source>
<translation type="unfinished">淨額</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
<source>Transaction ID</source>
<translation type="unfinished">交易 ID</translation>
</message>
<message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
<source>Transaction virtual size</source>
<translation type="unfinished">交易擬真大小</translation>
</message>
@@ -2622,14 +3532,26 @@ For more information on using this console, type %6.
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
<translation type="unfinished">商家</translation>
</message>
<message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
+ </message>
+ <message>
<source>Inputs</source>
<translation type="unfinished">輸入</translation>
</message>
@@ -2641,7 +3563,11 @@ For more information on using this console, type %6.
<source>true</source>
<translation type="unfinished">是</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
@@ -2656,6 +3582,10 @@ For more information on using this console, type %6.
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2664,6 +3594,14 @@ For more information on using this console, type %6.
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
<translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
</message>
@@ -2672,6 +3610,18 @@ For more information on using this console, type %6.
<translation type="unfinished">已確認(%1 次)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2684,10 +3634,6 @@ For more information on using this console, type %6.
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">付給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -2712,6 +3658,10 @@ For more information on using this console, type %6.
<translation type="unfinished">收到交易的日期和時間。</translation>
</message>
<message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
<translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
</message>
@@ -2727,6 +3677,10 @@ For more information on using this console, type %6.
<translation type="unfinished">全部</translation>
</message>
<message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
<source>This week</source>
<translation type="unfinished">這星期</translation>
</message>
@@ -2735,6 +3689,14 @@ For more information on using this console, type %6.
<translation type="unfinished">這個月</translation>
</message>
<message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2743,10 +3705,6 @@ For more information on using this console, type %6.
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -2759,6 +3717,10 @@ For more information on using this console, type %6.
<translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
</message>
<message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
<source>Range…</source>
<translation type="unfinished">范围...</translation>
</message>
@@ -2783,10 +3745,22 @@ For more information on using this console, type %6.
<translation type="unfinished">复制原始交易(&amp;R)</translation>
</message>
<message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
<source>Increase transaction &amp;fee</source>
<translation type="unfinished">增加矿工费(&amp;F)</translation>
</message>
<message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
<source>&amp;Edit address label</source>
<translation type="unfinished">编辑地址标签(&amp;E)</translation>
</message>
@@ -2796,10 +3770,27 @@ For more information on using this console, type %6.
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
+ <source>Comma separated file</source>
+ <extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
+ <translation type="unfinished">逗號分隔文件</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Watch-only</source>
<translation type="unfinished">只能觀看的</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2816,6 +3807,10 @@ For more information on using this console, type %6.
<translation type="unfinished">識別碼</translation>
</message>
<message>
+ <source>Exporting Failed</source>
+ <translation type="unfinished">导出失败</translation>
+ </message>
+ <message>
<source>There was an error trying to save the transaction history to %1.</source>
<translation type="unfinished">儲存交易記錄到 %1 時發生錯誤。</translation>
</message>
@@ -2831,7 +3826,11 @@ For more information on using this console, type %6.
<source>Range:</source>
<translation type="unfinished">範圍:</translation>
</message>
- </context>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2843,6 +3842,10 @@ Go to File &gt; Open Wallet to load a wallet.
- 或者 -</translation>
</message>
<message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">创建一个新的钱包</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">错误</translation>
</message>
@@ -2858,7 +3861,15 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Partially Signed Transaction (*.psbt)</source>
<translation type="unfinished">部分签名交易 (*.psbt)</translation>
</message>
- </context>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
@@ -2866,6 +3877,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">付款</translation>
</message>
<message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
<translation type="unfinished">想要提高手續費嗎?</translation>
@@ -2875,6 +3894,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">当前手续费:</translation>
</message>
<message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
<source>New fee:</source>
<translation type="unfinished">新的費用:</translation>
</message>
@@ -2891,6 +3914,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">無法草擬交易。</translation>
</message>
<message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
@@ -2903,12 +3930,20 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Could not commit transaction</source>
<translation type="unfinished">沒辦法提交交易</translation>
</message>
- </context>
+ <message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+</context>
<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;匯出</translation>
+ <translation type="unfinished">导出(E)</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -2951,6 +3986,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s请求监听端口%u。此端口被认为是“坏的”,所以不太可能有其他节点会连接过来。详情以及完整的端口列表请参见 doc/p2p-bad-ports.md 。</translation>
</message>
@@ -2959,6 +3998,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
<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">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
</message>
@@ -2983,26 +4026,58 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
</message>
<message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
</message>
<message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">錯誤: 舊式錢包只支援 "legacy", "p2sh-segwit", 和 "bech32" 這三種位址類型</translation>
+ </message>
+ <message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>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>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
<translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
</message>
<message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
<translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
</message>
<message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
@@ -3011,6 +4086,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">修剪:上次同步钱包的位置已经超出(落后于)现有修剪后数据的范围。你需要进行-reindex(对于已经启用修剪节点,就需要重新下载整个区块链)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">重命名 '%s' -&gt; '%s' 失败。您需要手动移走或删除无效的快照目录 %s来解决这个问题,不然的话您就会在下一次启动时遇到相同的错误。</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: SQLite钱包schema版本%d未知。只支持%d版本</translation>
</message>
@@ -3019,14 +4098,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">區塊資料庫中有來自未來的區塊。可能是你電腦的日期時間不對。如果確定電腦日期時間沒錯的話,就重建區塊資料庫看看。</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">区块索引数据库含有历史遗留的 'txindex' 。可以运行完整的 -reindex 来清理被占用的磁盘空间;也可以忽略这个错误。这个错误消息将不会再次显示。</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">扣除手續費後的交易金額太少而不能傳送</translation>
</message>
<message>
+ <source>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>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation type="unfinished">這是個還沒發表的測試版本 - 使用請自負風險 - 請不要用來開採或做商業應用</translation>
</message>
@@ -3055,6 +4134,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">提供了未知的钱包格式 "%s" 。请使用 "bdb" 或 "sqlite" 中的一种。</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">不支持的类别限定日志等级 %1$s=%2$s 。 预期参数 %1$s=&lt;category&gt;:&lt;loglevel&gt;。 有效的类别: %3$s 。有效的日志等级: %4$s 。</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">找到了不受支持的 chainstate 数据库格式。请使用 -reindex-chainstate 参数重启。这将会重建 chainstate 数据库。</translation>
</message>
@@ -3063,6 +4146,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">钱包创建成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">钱包加载成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。可以使用 migratewallet 命令将旧式钱包迁移至输出描述符钱包。</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">警告: 转储文件的钱包格式 "%s" 与命令行指定的格式 "%s" 不符。</translation>
</message>
@@ -3071,6 +4158,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
<translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
</message>
@@ -3087,6 +4178,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">參數 -maxmempool 至少要給 %d 百萬位元組(MB)</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">沒辦法解析 -%s 參數指定的地址: '%s'</translation>
</message>
@@ -3103,30 +4198,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">不能写入到数据目录'%s';请检查文件权限。</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">无法完成由之前版本启动的 -txindex 升级。请用之前的版本重新启动,或者进行一次完整的 -reindex 。</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上以供诊断问题的原因。</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -blockfilterindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 blockfilterindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -coinstatsindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 coinstatsindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -txindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 txindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">在使用地址管理器(addrman)寻找出站连接时,无法同时提供特定的连接。</translation>
</message>
@@ -3135,6 +4210,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">加载%s时出错: 编译时未启用外部签名器支持,却仍然试图加载外部签名器钱包</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">读取 %s 时出错! 所有密钥都被正确读取,但交易数据或地址元数据可能缺失或有误。</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">错误:钱包中的地址簿数据无法被识别为属于迁移后的钱包</translation>
</message>
@@ -3147,6 +4226,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误:钱包中的交易%s无法被识别为属于迁移后的钱包</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">计算追加手续费失败,因为未确认UTXO依赖了大量未确认交易的簇集。</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">无法重命名无效的 peers.dat 文件。 请移动或删除它,然后重试。</translation>
</message>
@@ -3221,10 +4304,6 @@ Please try running the latest software version.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">不支持的类别限定日志等级 -loglevel=%s。预期参数 -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s。有效的类别: %s。</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -3245,6 +4324,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
<source>Do you want to rebuild the block database now?</source>
<translation type="unfinished">你想现在就重建区块数据库吗?</translation>
</message>
@@ -3257,6 +4356,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -3265,6 +4368,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化区块数据库时出错</translation>
</message>
<message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
<source>Error loading %s</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤</translation>
</message>
@@ -3281,6 +4388,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤: 這個錢包需要新版的 %s</translation>
</message>
<message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
@@ -3289,16 +4404,16 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3317,10 +4432,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -3345,6 +4456,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -3353,10 +4468,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">无法启动索引,关闭中...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -3525,6 +4664,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">这是你每次交易付款时最少要付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amounts must not be negative</source>
<translation type="unfinished">交易金额不不可为负数</translation>
</message>
@@ -3593,14 +4736,30 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">在 -onlynet 指定了不明的網路別: '%s'</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">不支持的全局日志等级 -loglevel=%s 。有效的数值:%s 。</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh-Hans.ts b/src/qt/locale/bitcoin_zh-Hans.ts
index 3e924d436e..4b2769a0c5 100644
--- a/src/qt/locale/bitcoin_zh-Hans.ts
+++ b/src/qt/locale/bitcoin_zh-Hans.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">选择(&amp;H)</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">付款地址</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">收款地址</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">您可以给这些比特币地址付款。在付款之前,务必要检查金额和收款地址是否正确。</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">尝试保存地址列表到 %1 时发生错误。请再试一次。</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">付款地址 - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">收款地址 - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">导出失败</translation>
</message>
@@ -303,6 +303,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
@@ -714,8 +726,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">关闭所有钱包</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">迁移一个钱包</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示%1帮助消息以获得可能包含Bitcoin命令行选项的列表</translation>
+ <translation type="unfinished">显示 %1 帮助信息,获取可用命令行选项列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -781,7 +801,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform>%n active connection(s) to Bitcoin network.</numerusform>
+ <numerusform>%n 条到比特币网络的活动连接</numerusform>
</translation>
</message>
<message>
@@ -809,6 +829,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">预同步区块头 (%1%)…</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">创建钱包时出错</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">无法创建新钱包,软件编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">错误: %1</translation>
</message>
@@ -915,10 +943,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">费用:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">粉尘:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">加上交易费用后:</translation>
</message>
@@ -1007,10 +1031,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">复制粉尘金额</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">复制找零金额</translation>
</message>
@@ -1019,18 +1039,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1已锁定)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">是</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">否</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">当任何一个收款金额小于目前的粉尘金额阈值时,文字会变红色。</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">每个输入可能有 +/- %1 聪 (satoshi) 的误差。</translation>
</message>
@@ -1090,14 +1098,65 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您确定想要迁移钱包&lt;i&gt;%1&lt;/i&gt;吗?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">迁移钱包将会把这个钱包转换成一个或多个输出描述符钱包。将会需要创建一个新的钱包备份。
+如果这个钱包包含仅观察脚本,将会创建包含那些仅观察脚本的新钱包。
+如果这个钱包包含可解但又未被监视的脚本,将会创建一个不同的钱包以包含那些脚本。
+
+迁移过程开始前将会创建一个钱包备份。备份文件将会被命名为 &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak 然后被保存在该钱包所在目录下。如果迁移过程出错,可以使用“恢复钱包”功能恢复备份。</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">迁移钱包 &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">迁移失败</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">迁移成功</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
- <translation type="unfinished">打開錢包失敗</translation>
+ <translation type="unfinished">打开钱包失败</translation>
</message>
<message>
<source>Open wallet warning</source>
- <translation type="unfinished">打開錢包警告</translation>
+ <translation type="unfinished">打开钱包警告</translation>
</message>
<message>
<source>default wallet</source>
@@ -1106,7 +1165,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">開啟錢包</translation>
+ <translation type="unfinished">打开钱包</translation>
</message>
<message>
<source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
@@ -1169,19 +1228,27 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>CreateWalletDialog</name>
<message>
<source>Create Wallet</source>
- <translation type="unfinished">新增錢包</translation>
+ <translation type="unfinished">创建钱包</translation>
+ </message>
+ <message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">距离创建您的新钱包只有一步之遥了!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">请指定一个名字,如果需要的话还可以启用高级选项</translation>
</message>
<message>
<source>Wallet Name</source>
- <translation type="unfinished">錢包名稱</translation>
+ <translation type="unfinished">钱包名称</translation>
</message>
<message>
<source>Wallet</source>
- <translation type="unfinished">錢包</translation>
+ <translation type="unfinished">钱包</translation>
</message>
<message>
<source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
- <translation type="unfinished">加密錢包。 錢包將使用您選擇的密碼進行加密。</translation>
+ <translation type="unfinished">加密钱包。将会使用您指定的密码将钱包加密。</translation>
</message>
<message>
<source>Encrypt Wallet</source>
@@ -1193,7 +1260,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
- <translation type="unfinished">禁用此錢包的私鑰。取消了私鑰的錢包將沒有私鑰,並且不能有HD種子或匯入的私鑰。這是只能看的錢包的理想選擇。</translation>
+ <translation type="unfinished">禁用此钱包的私钥。被禁用私钥的钱包将不会含有任何私钥,而且也不能含有HD种子或导入的私钥。作为仅观察钱包,这是比较理想的。</translation>
</message>
<message>
<source>Disable Private Keys</source>
@@ -1201,19 +1268,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
- <translation type="unfinished">製作一個空白的錢包。空白錢包最初沒有私鑰或腳本。以後可以匯入私鑰和地址,或者可以設定HD種子。</translation>
+ <translation type="unfinished">创建一个空白的钱包。空白钱包最初不含有任何私钥或脚本。可以以后再导入私钥和地址,或设置HD种子。</translation>
</message>
<message>
<source>Make Blank Wallet</source>
- <translation type="unfinished">製作空白錢包</translation>
- </message>
- <message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">使用输出描述符进行scriptPubKey管理</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">输出描述符钱包</translation>
+ <translation type="unfinished">创建空白钱包</translation>
</message>
<message>
<source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
@@ -1228,10 +1287,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">创建</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
- </message>
- <message>
<source>Compiled without external signing support (required for external signing)</source>
<extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
<translation type="unfinished">编译时未启用外部签名支持 (外部签名需要这个功能)</translation>
@@ -1265,7 +1320,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Edit receiving address</source>
- <translation type="unfinished">編輯接收地址</translation>
+ <translation type="unfinished">编辑收款地址</translation>
</message>
<message>
<source>Edit sending address</source>
@@ -1289,14 +1344,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>New key generation failed.</source>
- <translation type="unfinished">產生新的密鑰失敗了。</translation>
+ <translation type="unfinished">生成新密钥失败。</translation>
</message>
</context>
<context>
<name>FreespaceChecker</name>
<message>
<source>A new data directory will be created.</source>
- <translation type="unfinished">就要產生新的資料目錄。</translation>
+ <translation type="unfinished">一个新的数据目录将被创建。</translation>
</message>
<message>
<source>name</source>
@@ -1304,7 +1359,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
- <translation type="unfinished">已經有這個目錄了。如果你要在裡面造出新的目錄的話,請加上 %1.</translation>
+ <translation type="unfinished">目录已存在。如果您打算在这里创建一个新目录,请添加 %1。</translation>
</message>
<message>
<source>Path already exists, and is not a directory.</source>
@@ -1317,6 +1372,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</context>
<context>
<name>Intro</name>
+ <message>
+ <source>Bitcoin</source>
+ <translation type="unfinished">比特币</translation>
+ </message>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
@@ -1555,6 +1614,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1771,18 +1834,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
- </message>
- <message>
- <source>closest matching "%1"</source>
- <translation type="unfinished">与 "%1" 最接近的匹配</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">确定(&amp;O)</translation>
</message>
@@ -2024,8 +2075,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
- <source> * Sends %1 to %2</source>
- <translation type="unfinished"> * 发送 %1 至 %2</translation>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
</message>
<message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
@@ -2300,6 +2355,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">选择节点查看详细信息。</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">传输层版本: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">传输</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">十六进制格式的BIP324会话ID,如果有的话。</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">会话ID</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">版本</translation>
</message>
@@ -2529,6 +2600,21 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">出站地址取回: 短暂,用于请求取回地址</translation>
</message>
<message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: 未加密,明文传输协议</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324加密传输协议</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">我们选择了用于高带宽转发的节点</translation>
</message>
@@ -2583,6 +2669,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">不使用任何钱包执行命令</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">使用“%1”钱包执行命令</translation>
</message>
@@ -2945,10 +3035,6 @@ For more information on using this console, type %6.
<translation type="unfinished">输入...</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">粉尘:</translation>
- </message>
- <message>
<source>Choose…</source>
<translation type="unfinished">选择...</translation>
</message>
@@ -3025,10 +3111,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">复制粉尘金额</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">复制找零金额</translation>
</message>
@@ -3059,10 +3141,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">从钱包%1</translation>
- </message>
- <message>
<source>%1 to '%2'</source>
<translation type="unfinished">%1 到 '%2'</translation>
</message>
@@ -3120,6 +3198,10 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">请务必仔细检查您的交易请求。这会产生一个部分签名比特币交易(PSBT),可以把保存下来或复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -3578,8 +3660,8 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(证书未被验证)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3680,10 +3762,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">支付给自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">挖矿所得</translation>
</message>
@@ -3759,10 +3837,6 @@ Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satos
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">给自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">挖矿所得</translation>
</message>
@@ -4044,6 +4118,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s损坏。请尝试用bitcoin-wallet钱包工具来对其进行急救。或者用一个备份进行还原。</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s请求监听端口%u。此端口被认为是“坏的”,所以不太可能有其他节点会连接过来。详情以及完整的端口列表请参见 doc/p2p-bad-ports.md 。</translation>
</message>
@@ -4072,10 +4150,6 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">加载钱包时出错。需要下载区块才能加载钱包,而且在使用assumeutxo快照时,下载区块是不按顺序的,这个时候软件不支持加载钱包。在节点同步至高度%s之后就应该可以加载钱包了。</translation>
</message>
<message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">读取 %s 时发生错误!所有的密钥都可以正确读取,但是交易记录或地址簿数据可能已经丢失或出错。</translation>
- </message>
- <message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
<translation type="unfinished">读取%s出错!交易数据可能丢失或有误。重新扫描钱包中。</translation>
</message>
@@ -4144,16 +4218,16 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">修剪:上次同步钱包的位置已经超出(落后于)现有修剪后数据的范围。你需要进行-reindex(对于已经启用修剪节点,就需要重新下载整个区块链)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">重命名 '%s' -&gt; '%s' 失败。您需要手动移走或删除无效的快照目录 %s来解决这个问题,不然的话您就会在下一次启动时遇到相同的错误。</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: SQLite钱包schema版本%d未知。只支持%d版本</translation>
</message>
<message>
<source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
- <translation type="unfinished">区块数据库包含未来的交易,这可能是由本机错误的日期时间引起。若确认本机日期时间正确,请重新建立区块数据库。</translation>
- </message>
- <message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">区块索引数据库含有历史遗留的 'txindex' 。可以运行完整的 -reindex 来清理被占用的磁盘空间;也可以忽略这个错误。这个错误消息将不会再次显示。</translation>
+ <translation type="unfinished">区块数据库包含未来的交易,这可能是由本机的日期时间错误引起。若确认本机日期时间正确,请重新建立区块数据库。</translation>
</message>
<message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
@@ -4192,6 +4266,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">提供了未知的钱包格式 "%s" 。请使用 "bdb" 或 "sqlite" 中的一种。</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">不支持的类别限定日志等级 %1$s=%2$s 。 预期参数 %1$s=&lt;category&gt;:&lt;loglevel&gt;。 有效的类别: %3$s 。有效的日志等级: %4$s 。</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">找到了不受支持的 chainstate 数据库格式。请使用 -reindex-chainstate 参数重启。这将会重建 chainstate 数据库。</translation>
</message>
@@ -4200,6 +4278,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">钱包创建成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">钱包加载成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。可以使用 migratewallet 命令将旧式钱包迁移至输出描述符钱包。</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">警告: 转储文件的钱包格式 "%s" 与命令行指定的格式 "%s" 不符。</translation>
</message>
@@ -4248,30 +4330,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">不能写入到数据目录'%s';请检查文件权限。</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">无法完成由之前版本启动的 -txindex 升级。请用之前的版本重新启动,或者进行一次完整的 -reindex 。</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -blockfilterindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 blockfilterindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -coinstatsindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 coinstatsindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -txindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 txindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">在使用地址管理器(addrman)寻找出站连接时,无法同时提供特定的连接。</translation>
</message>
@@ -4280,6 +4342,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">加载%s时出错: 编译时未启用外部签名器支持,却仍然试图加载外部签名器钱包</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">读取 %s 时出错! 所有密钥都被正确读取,但交易数据或地址元数据可能缺失或有误。</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">错误:钱包中的地址簿数据无法被识别为属于迁移后的钱包</translation>
</message>
@@ -4292,6 +4358,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误:钱包中的交易%s无法被识别为属于迁移后的钱包</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">计算追加手续费失败,因为未确认UTXO依赖了大量未确认交易的簇集。</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">无法重命名无效的 peers.dat 文件。 请移动或删除它,然后重试。</translation>
</message>
@@ -4366,10 +4436,6 @@ Please try running the latest software version.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">不支持的类别限定日志等级 -loglevel=%s。预期参数 -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s。有效的类别: %s。</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -4422,6 +4488,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -4470,16 +4540,12 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">从钱包数据库读取下一条记录时出错</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
- </message>
- <message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -4518,10 +4584,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 没有可用的%s地址。</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -4546,6 +4608,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -4554,6 +4620,22 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
<translation type="unfinished">监听端口失败。如果你愿意的话,请使用 -listen=0 参数。</translation>
</message>
@@ -4562,10 +4644,18 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化时重扫描钱包失败</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">无法启动索引,关闭中...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">删除交易时失败: %s</translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -4786,6 +4876,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">如果发送交易,这将是你要支付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">交易金额太小</translation>
</message>
@@ -4798,10 +4892,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易找零输出项编号超出范围</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">此交易在内存池中的存在过长的链条</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">交易必须包含至少一个收款人</translation>
</message>
@@ -4878,14 +4968,30 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">不明的交易规则已经激活 (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">不支持的全局日志等级 -loglevel=%s 。有效的数值:%s 。</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s 。</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:%s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">%s链上 acceptstalefeeestimates 不受支持。</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh-Hant.ts b/src/qt/locale/bitcoin_zh-Hant.ts
index b08172bbc2..9fe760619b 100644
--- a/src/qt/locale/bitcoin_zh-Hant.ts
+++ b/src/qt/locale/bitcoin_zh-Hant.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">选择(&amp;H)</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">发送地址</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">收款地址</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">这些是你的比特币支付地址。在发送之前,一定要核对金额和接收地址。</translation>
</message>
@@ -101,6 +93,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">儲存地址列表到 %1 時發生錯誤。請再試一次。</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">付款地址 - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">收款地址 - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">导出失败</translation>
</message>
@@ -294,15 +294,45 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">请输入一个比特币地址 (例如 %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
<message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
<translation type="unfinished">区块转发</translation>
@@ -313,6 +343,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手册</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 天</translation>
+ </message>
+ <message>
<source>%1 h</source>
<translation type="unfinished">%1 小时</translation>
</message>
@@ -321,6 +365,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">%1 分</translation>
</message>
<message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
<source>N/A</source>
<translation type="unfinished">未知</translation>
</message>
@@ -673,8 +725,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">关闭所有钱包</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">迁移一个钱包</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示%1帮助消息以获得可能包含Bitcoin命令行选项的列表</translation>
+ <translation type="unfinished">显示 %1 帮助信息,获取可用命令行选项列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -768,6 +828,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">預先同步標頭(%1%)</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">创建钱包时出错</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">无法创建新钱包,软件编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">錯誤: %1</translation>
</message>
@@ -776,12 +844,24 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">警告: %1</translation>
</message>
<message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">日期: %1
+</translation>
+ </message>
+ <message>
<source>Amount: %1
</source>
<translation type="unfinished">金額: %1
</translation>
</message>
<message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">錢包: %1
+</translation>
+ </message>
+ <message>
<source>Type: %1
</source>
<translation type="unfinished">種類: %1
@@ -800,6 +880,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
<source>Incoming transaction</source>
<translation type="unfinished">收款交易</translation>
</message>
@@ -820,6 +904,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
<message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Original message:</source>
<translation type="unfinished">原消息:</translation>
</message>
@@ -838,14 +926,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手动选币</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
</message>
<message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
<source>Tree mode</source>
<translation type="unfinished">树状模式</translation>
</message>
@@ -858,10 +966,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
<source>Received with address</source>
<translation type="unfinished">收款地址</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
@@ -886,6 +1006,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">锁定未花费(&amp;O)</translation>
</message>
<message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -902,10 +1026,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -914,14 +1034,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1已锁定)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">是</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">當任何一個收款金額小於目前的灰塵金額上限時,文字會變紅色。</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">每个输入可能有 +/- %1 聪 (satoshi) 的误差。</translation>
</message>
@@ -933,7 +1045,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- </context>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -964,6 +1080,57 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您确定想要迁移钱包&lt;i&gt;%1&lt;/i&gt;吗?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">迁移钱包将会把这个钱包转换成一个或多个输出描述符钱包。将会需要创建一个新的钱包备份。
+如果这个钱包包含仅观察脚本,将会创建包含那些仅观察脚本的新钱包。
+如果这个钱包包含可解但又未被监视的脚本,将会创建一个不同的钱包以包含那些脚本。
+
+迁移过程开始前将会创建一个钱包备份。备份文件将会被命名为 &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak 然后被保存在该钱包所在目录下。如果迁移过程出错,可以使用“恢复钱包”功能恢复备份。</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">迁移钱包 &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">迁移失败</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">迁移成功</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -974,9 +1141,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">打開錢包警告</translation>
</message>
<message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+ <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
- <translation type="unfinished">開啟錢包</translation>
+ <translation type="unfinished">打开钱包</translation>
</message>
</context>
<context>
@@ -1017,7 +1188,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
<translation type="unfinished">启用修剪时,如果一个钱包被卸载太久,就必须重新同步整条区块链才能再次加载它。</translation>
</message>
- </context>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">关闭所有钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">您确定想要关闭所有钱包吗?</translation>
+ </message>
+</context>
<context>
<name>CreateWalletDialog</name>
<message>
@@ -1025,8 +1204,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">新增錢包</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">距离创建您的新钱包只有一步之遥了!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">请指定一个名字,如果需要的话还可以启用高级选项</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
- <translation type="unfinished">錢包名稱</translation>
+ <translation type="unfinished">钱包名称</translation>
</message>
<message>
<source>Wallet</source>
@@ -1057,12 +1244,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">製作空白錢包</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">使用输出描述符进行scriptPubKey管理</translation>
- </message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ <source>Create</source>
+ <translation type="unfinished">创建</translation>
</message>
</context>
<context>
@@ -1084,6 +1267,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
</message>
<message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">地址(&amp;A)</translation>
+ </message>
+ <message>
<source>New sending address</source>
<translation type="unfinished">新建付款地址</translation>
</message>
@@ -1096,6 +1283,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">地址“%1”已经存在,它是一个收款地址,标签为“%2”,所以它不能作为一个付款地址被添加进来。</translation>
+ </message>
+ <message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">输入的地址“%1”已经存在于地址簿中,标签为“%2”。</translation>
</message>
@@ -1115,10 +1306,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">就要產生新的資料目錄。</translation>
</message>
<message>
+ <source>name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished">已經有這個目錄了。如果你要在裡面造出新的目錄的話,請加上 %1.</translation>
</message>
<message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">路径已存在,并且不是一个目录。</translation>
+ </message>
+ <message>
<source>Cannot create data directory here.</source>
<translation type="unfinished">无法在此创建数据目录。</translation>
</message>
@@ -1191,6 +1390,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
</message>
<message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">取消此设置需要重新下载整个区块链。先完整下载整条链再进行修剪会更快。这会禁用一些高级功能。</translation>
+ </message>
+ <message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
<translation type="unfinished">初始化同步过程是非常吃力的,同时可能会暴露您之前没有注意到的电脑硬件问题。你每次启动%1时,它都会从之前中断的地方继续下载。</translation>
</message>
@@ -1302,7 +1505,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Open bitcoin URI</source>
<translation type="unfinished">打开比特币URI</translation>
</message>
- </context>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -1310,6 +1518,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">選項</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
<translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
</message>
@@ -1318,6 +1534,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
</message>
<message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -1334,6 +1558,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1358,6 +1586,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -1386,6 +1618,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -1396,10 +1632,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -1410,10 +1658,30 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
<translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">使用 &amp;UPnP 映射端口</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1430,6 +1698,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
</message>
<message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
<source>Port of the proxy (e.g. 9050)</source>
<translation type="unfinished">代理伺服器的通訊埠(像是 9050)</translation>
</message>
@@ -1442,6 +1718,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口(&amp;W)</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1454,6 +1738,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
</message>
<message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
<source>User Interface &amp;language:</source>
<translation type="unfinished">使用界面語言(&amp;L):</translation>
</message>
@@ -1478,22 +1766,39 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
</message>
<message>
<source>default</source>
<translation type="unfinished">預設值</translation>
</message>
<message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished">需要重新開始客戶端軟體來讓改變生效。</translation>
@@ -1534,7 +1839,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>The configuration file could not be opened.</source>
<translation type="unfinished">无法打开配置文件。</translation>
</message>
- </context>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -1553,6 +1866,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">顯示的資訊可能是過期的。跟 Bitcoin 網路的連線建立後,你的錢包會自動和網路同步,但是這個步驟還沒完成。</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation type="unfinished">可用金額:</translation>
</message>
@@ -1581,10 +1898,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">餘額</translation>
</message>
<message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
<source>Your current total balance</source>
<translation type="unfinished">您当前的总余额</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation type="unfinished">最近的交易</translation>
</message>
@@ -1593,6 +1922,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">仅观察地址的未确认交易</translation>
</message>
<message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
<source>Current total balance in watch-only addresses</source>
<translation type="unfinished">仅观察地址中的当前总余额</translation>
</message>
@@ -1628,6 +1961,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">關閉</translation>
</message>
<message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
@@ -1640,6 +1981,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
</message>
<message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -1649,6 +2006,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
<source>Pays transaction fee: </source>
<translation type="unfinished">支付交易费用:</translation>
</message>
@@ -1677,6 +2046,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(但这个钱包不能签名交易)</translation>
</message>
<message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
<source>Transaction status is unknown.</source>
<translation type="unfinished">交易状态未知。</translation>
</message>
@@ -1688,6 +2065,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">支付请求出错</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
<source>URI handling</source>
<translation type="unfinished">URI 處理</translation>
</message>
@@ -1764,7 +2145,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<extracomment>An Inbound Connection from a Peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
- </context>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1772,10 +2158,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
<source>Error encoding URI into QR Code.</source>
<translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
</message>
<message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
<source>Save QR Code</source>
<translation type="unfinished">儲存 QR 碼</translation>
</message>
@@ -1800,6 +2198,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">資訊(&amp;I)</translation>
</message>
<message>
+ <source>General</source>
+ <translation type="unfinished">常规</translation>
+ </message>
+ <message>
<source>Datadir</source>
<translation type="unfinished">数据目录</translation>
</message>
@@ -1812,6 +2214,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">区块存储目录</translation>
</message>
<message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">啓動時間</translation>
</message>
@@ -1820,6 +2226,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络</translation>
</message>
<message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation type="unfinished">連線數</translation>
</message>
@@ -1828,10 +2238,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">區塊鏈</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
<source>Memory usage</source>
<translation type="unfinished">内存使用</translation>
</message>
<message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
<source>(none)</source>
<translation type="unfinished">(无)</translation>
</message>
@@ -1860,6 +2282,26 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">选择节点查看详细信息。</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">传输层版本: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">传输</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">十六进制格式的BIP324会话ID,如果有的话。</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">会话ID</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">是否要将交易转发给这个节点。</translation>
</message>
@@ -1868,10 +2310,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation type="unfinished">已同步前導資料</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
@@ -1926,6 +2376,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">当前区块高度</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
<source>Decrease font size</source>
<translation type="unfinished">缩小字体大小</translation>
</message>
@@ -1962,10 +2416,23 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">高带宽</translation>
</message>
<message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
<source>Last Block</source>
<translation type="unfinished">上一个区块</translation>
</message>
<message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">最近送出</translation>
</message>
@@ -1974,6 +2441,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">上次接收</translation>
</message>
<message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
<source>The duration of a currently outstanding ping.</source>
<translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
</message>
@@ -1982,6 +2453,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ping 等待</translation>
</message>
<message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>&amp;Open</source>
<translation type="unfinished">打开(&amp;O)</translation>
</message>
@@ -1998,6 +2481,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">總計</translation>
</message>
<message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
<source>Clear console</source>
<translation type="unfinished">清主控台</translation>
</message>
@@ -2035,6 +2522,26 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
</message>
<message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: 未加密,明文传输协议</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324加密传输协议</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">我们选择了用于高带宽转发的节点</translation>
</message>
@@ -2043,15 +2550,35 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">对端选择了我们用于高带宽转发</translation>
</message>
<message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">复制地址(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation type="unfinished">1 小时(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
@@ -2061,6 +2588,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">解封(&amp;U)</translation>
</message>
<message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2083,6 +2626,10 @@ For more information on using this console, type %6.
<translation type="unfinished">执行中……</translation>
</message>
<message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">經由 %1</translation>
</message>
@@ -2091,6 +2638,10 @@ For more information on using this console, type %6.
<translation type="unfinished">是</translation>
</message>
<message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">到</translation>
</message>
@@ -2118,6 +2669,10 @@ For more information on using this console, type %6.
<translation type="unfinished">金额(&amp;A):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
<source>&amp;Message:</source>
<translation type="unfinished">訊息(&amp;M):</translation>
</message>
@@ -2126,6 +2681,10 @@ For more information on using this console, type %6.
<translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
</message>
<message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
</message>
@@ -2138,10 +2697,18 @@ For more information on using this console, type %6.
<translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
</message>
<message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
<source>&amp;Create new receiving address</source>
<translation type="unfinished">&amp;產生新的接收地址</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
<source>Clear</source>
<translation type="unfinished">清空</translation>
</message>
@@ -2162,6 +2729,10 @@ For more information on using this console, type %6.
<translation type="unfinished">从列表中移除选中的条目</translation>
</message>
<message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">複製 &amp;URI</translation>
</message>
@@ -2217,6 +2788,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请求支付至...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
<source>Label:</source>
<translation type="unfinished">标签:</translation>
</message>
@@ -2237,10 +2816,22 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
<source>Request payment to %1</source>
<translation type="unfinished">付款給 %1 的要求</translation>
</message>
@@ -2248,14 +2839,26 @@ For more information on using this console, type %6.
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
<message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
<source>(no amount requested)</source>
<translation type="unfinished">(無要求金額)</translation>
</message>
@@ -2283,14 +2886,38 @@ For more information on using this console, type %6.
<translation type="unfinished">金额不足!</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished">如果這項有打開,但是找零地址是空的或無效,那麼找零會送到一個產生出來的地址去。</translation>
</message>
<message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
<source>Transaction Fee:</source>
<translation type="unfinished">交易手续费:</translation>
</message>
@@ -2303,6 +2930,10 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -2315,12 +2946,20 @@ For more information on using this console, type %6.
<translation type="unfinished">自訂:</translation>
</message>
<message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
<source>Add &amp;Recipient</source>
<translation type="unfinished">增加收款人(&amp;R)</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
</message>
<message>
<source>Choose…</source>
@@ -2331,18 +2970,54 @@ For more information on using this console, type %6.
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
<translation type="unfinished">手續費太低的話可能會造成永遠無法確認的交易(請參考提示)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation type="unfinished">餘額:</translation>
</message>
<message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -2363,10 +3038,6 @@ For more information on using this console, type %6.
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -2375,12 +3046,26 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 (%2个块)</translation>
</message>
<message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2396,6 +3081,10 @@ For more information on using this console, type %6.
<translation type="unfinished">外部签名器失败</translation>
</message>
<message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -2409,6 +3098,10 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -2424,6 +3117,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请检查您的交易。</translation>
</message>
<message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">總金額</translation>
</message>
@@ -2458,6 +3159,22 @@ For more information on using this console, type %6.
<translation type="unfinished">支付金额必须大于0。</translation>
</message>
<message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
</message>
@@ -2472,10 +3189,18 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 比特币地址无效</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
<source>Confirm custom change address</source>
<translation type="unfinished">确认自定义找零地址</translation>
</message>
<message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
@@ -2491,14 +3216,34 @@ For more information on using this console, type %6.
<translation type="unfinished">付給(&amp;T):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
<source>The Bitcoin address to send the payment to</source>
<translation type="unfinished">將支付發送到的比特幣地址給</translation>
</message>
<message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
<source>The amount to send in the selected unit</source>
<translation type="unfinished">用被选单位表示的待发送金额</translation>
</message>
<message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
<source>S&amp;ubtract fee from amount</source>
<translation type="unfinished">從付款金額減去手續費(&amp;U)</translation>
</message>
@@ -2545,6 +3290,22 @@ For more information on using this console, type %6.
<translation type="unfinished">您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。</translation>
</message>
<message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
<source>Signature</source>
<translation type="unfinished">簽章</translation>
</message>
@@ -2565,10 +3326,18 @@ For more information on using this console, type %6.
<translation type="unfinished">清空所有签名消息栏</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Verify Message</source>
<translation type="unfinished">消息验证(&amp;V)</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation type="unfinished">用来签名消息的地址</translation>
</message>
@@ -2585,6 +3354,14 @@ For more information on using this console, type %6.
<translation type="unfinished">驗證這個訊息來確定是用指定的比特幣地址簽名的</translation>
</message>
<message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
<source>Click "Sign Message" to generate signature</source>
<translation type="unfinished">請按一下「簽署訊息」來產生簽章</translation>
</message>
@@ -2601,6 +3378,10 @@ For more information on using this console, type %6.
<translation type="unfinished">找不到与输入地址相关的密钥。</translation>
</message>
<message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
<source>No error</source>
<translation type="unfinished">沒有錯誤</translation>
</message>
@@ -2613,6 +3394,14 @@ For more information on using this console, type %6.
<translation type="unfinished">消息签名失败。</translation>
</message>
<message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
<source>Please check the signature and try again.</source>
<translation type="unfinished">请检查签名后重试。</translation>
</message>
@@ -2621,6 +3410,10 @@ For more information on using this console, type %6.
<translation type="unfinished">這個簽章跟訊息的數位摘要不符。</translation>
</message>
<message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
<source>Message verified.</source>
<translation type="unfinished">消息验证成功。</translation>
</message>
@@ -2654,6 +3447,11 @@ For more information on using this console, type %6.
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
<message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>%1/unconfirmed</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
<translation type="unfinished">%1 次/未確認</translation>
@@ -2668,10 +3466,18 @@ For more information on using this console, type %6.
<translation type="unfinished">状态</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Source</source>
<translation type="unfinished">來源</translation>
</message>
<message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
<source>From</source>
<translation type="unfinished">來源</translation>
</message>
@@ -2684,6 +3490,10 @@ For more information on using this console, type %6.
<translation type="unfinished">到</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
<source>watch-only</source>
<translation type="unfinished">只能看</translation>
</message>
@@ -2691,6 +3501,10 @@ For more information on using this console, type %6.
<source>label</source>
<translation type="unfinished">标签</translation>
</message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2698,18 +3512,46 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
<source>Total debit</source>
<translation type="unfinished">总支出</translation>
</message>
<message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
<source>Net amount</source>
<translation type="unfinished">淨額</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
<source>Transaction ID</source>
<translation type="unfinished">交易 ID</translation>
</message>
<message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
<source>Transaction virtual size</source>
<translation type="unfinished">交易擬真大小</translation>
</message>
@@ -2718,14 +3560,26 @@ For more information on using this console, type %6.
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
<translation type="unfinished">商家</translation>
</message>
<message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
+ </message>
+ <message>
<source>Inputs</source>
<translation type="unfinished">輸入</translation>
</message>
@@ -2737,7 +3591,11 @@ For more information on using this console, type %6.
<source>true</source>
<translation type="unfinished">是</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
@@ -2752,6 +3610,10 @@ For more information on using this console, type %6.
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2760,6 +3622,14 @@ For more information on using this console, type %6.
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
<translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
</message>
@@ -2768,6 +3638,18 @@ For more information on using this console, type %6.
<translation type="unfinished">已確認(%1 次)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2780,10 +3662,6 @@ For more information on using this console, type %6.
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">付給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -2808,6 +3686,10 @@ For more information on using this console, type %6.
<translation type="unfinished">收到交易的日期和時間。</translation>
</message>
<message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
<translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
</message>
@@ -2823,6 +3705,10 @@ For more information on using this console, type %6.
<translation type="unfinished">全部</translation>
</message>
<message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
<source>This week</source>
<translation type="unfinished">這星期</translation>
</message>
@@ -2831,6 +3717,14 @@ For more information on using this console, type %6.
<translation type="unfinished">這個月</translation>
</message>
<message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2839,10 +3733,6 @@ For more information on using this console, type %6.
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -2855,6 +3745,10 @@ For more information on using this console, type %6.
<translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
</message>
<message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
<source>Range…</source>
<translation type="unfinished">范围...</translation>
</message>
@@ -2879,10 +3773,22 @@ For more information on using this console, type %6.
<translation type="unfinished">复制原始交易(&amp;R)</translation>
</message>
<message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
<source>Increase transaction &amp;fee</source>
<translation type="unfinished">增加矿工费(&amp;F)</translation>
</message>
<message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
<source>&amp;Edit address label</source>
<translation type="unfinished">编辑地址标签(&amp;E)</translation>
</message>
@@ -2892,15 +3798,27 @@ For more information on using this console, type %6.
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗號分隔文件</translation>
</message>
<message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Watch-only</source>
<translation type="unfinished">只能觀看的</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2936,7 +3854,11 @@ For more information on using this console, type %6.
<source>Range:</source>
<translation type="unfinished">範圍:</translation>
</message>
- </context>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -2967,7 +3889,15 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Partially Signed Transaction (*.psbt)</source>
<translation type="unfinished">部分签名交易 (*.psbt)</translation>
</message>
- </context>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
@@ -2975,6 +3905,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">付款</translation>
</message>
<message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
<translation type="unfinished">想要提高手續費嗎?</translation>
@@ -2984,6 +3922,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">当前手续费:</translation>
</message>
<message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
<source>New fee:</source>
<translation type="unfinished">新的費用:</translation>
</message>
@@ -3000,6 +3942,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">無法草擬交易。</translation>
</message>
<message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
@@ -3012,12 +3958,20 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Could not commit transaction</source>
<translation type="unfinished">沒辦法提交交易</translation>
</message>
- </context>
+ <message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+</context>
<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
- <translation type="unfinished">&amp;匯出</translation>
+ <translation type="unfinished">导出(E)</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
@@ -3060,6 +4014,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s请求监听端口%u。此端口被认为是“坏的”,所以不太可能有其他节点会连接过来。详情以及完整的端口列表请参见 doc/p2p-bad-ports.md 。</translation>
</message>
@@ -3068,6 +4026,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
<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">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
</message>
@@ -3092,26 +4054,58 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
</message>
<message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
</message>
<message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">错误: 旧式钱包只支持 "legacy", "p2sh-segwit", 和 "bech32" 这三种地址类型</translation>
+ </message>
+ <message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>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>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
<translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
</message>
<message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
<translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
</message>
<message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
@@ -3120,6 +4114,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">修剪:上次同步钱包的位置已经超出(落后于)现有修剪后数据的范围。你需要进行-reindex(对于已经启用修剪节点,就需要重新下载整个区块链)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">重命名 '%s' -&gt; '%s' 失败。您需要手动移走或删除无效的快照目录 %s来解决这个问题,不然的话您就会在下一次启动时遇到相同的错误。</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: SQLite钱包schema版本%d未知。只支持%d版本</translation>
</message>
@@ -3128,14 +4126,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">區塊資料庫中有來自未來的區塊。可能是你電腦的日期時間不對。如果確定電腦日期時間沒錯的話,就重建區塊資料庫看看。</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">区块索引数据库含有历史遗留的 'txindex' 。可以运行完整的 -reindex 来清理被占用的磁盘空间;也可以忽略这个错误。这个错误消息将不会再次显示。</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">扣除手續費後的交易金額太少而不能傳送</translation>
</message>
<message>
+ <source>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>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation type="unfinished">這是個還沒發表的測試版本 - 使用請自負風險 - 請不要用來開採或做商業應用</translation>
</message>
@@ -3164,6 +4162,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">提供了未知的钱包格式 "%s" 。请使用 "bdb" 或 "sqlite" 中的一种。</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">不支持的类别限定日志等级 %1$s=%2$s 。 预期参数 %1$s=&lt;category&gt;:&lt;loglevel&gt;。 有效的类别: %3$s 。有效的日志等级: %4$s 。</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">找到了不受支持的 chainstate 数据库格式。请使用 -reindex-chainstate 参数重启。这将会重建 chainstate 数据库。</translation>
</message>
@@ -3172,6 +4174,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">钱包创建成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">钱包加载成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。可以使用 migratewallet 命令将旧式钱包迁移至输出描述符钱包。</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">警告: 转储文件的钱包格式 "%s" 与命令行指定的格式 "%s" 不符。</translation>
</message>
@@ -3180,6 +4186,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
<translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
</message>
@@ -3196,6 +4206,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">參數 -maxmempool 至少要給 %d 百萬位元組(MB)</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">沒辦法解析 -%s 參數指定的地址: '%s'</translation>
</message>
@@ -3212,30 +4226,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">不能写入到数据目录'%s';请检查文件权限。</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">无法完成由之前版本启动的 -txindex 升级。请用之前的版本重新启动,或者进行一次完整的 -reindex 。</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上以供诊断问题的原因。</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -blockfilterindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 blockfilterindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -coinstatsindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 coinstatsindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -txindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 txindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">在使用地址管理器(addrman)寻找出站连接时,无法同时提供特定的连接。</translation>
</message>
@@ -3244,6 +4238,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">加载%s时出错: 编译时未启用外部签名器支持,却仍然试图加载外部签名器钱包</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">读取 %s 时出错! 所有密钥都被正确读取,但交易数据或地址元数据可能缺失或有误。</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">错误:钱包中的地址簿数据无法被识别为属于迁移后的钱包</translation>
</message>
@@ -3256,6 +4254,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误:钱包中的交易%s无法被识别为属于迁移后的钱包</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">计算追加手续费失败,因为未确认UTXO依赖了大量未确认交易的簇集。</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">无法重命名无效的 peers.dat 文件。 请移动或删除它,然后重试。</translation>
</message>
@@ -3330,10 +4332,6 @@ Please try running the latest software version.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">不支持的类别限定日志等级 -loglevel=%s。预期参数 -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s。有效的类别: %s。</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -3354,6 +4352,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
<source>Do you want to rebuild the block database now?</source>
<translation type="unfinished">你想现在就重建区块数据库吗?</translation>
</message>
@@ -3366,6 +4384,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -3374,6 +4396,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化区块数据库时出错</translation>
</message>
<message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
<source>Error loading %s</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤</translation>
</message>
@@ -3390,6 +4416,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤: 這個錢包需要新版的 %s</translation>
</message>
<message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
@@ -3398,16 +4432,16 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3426,10 +4460,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -3454,6 +4484,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -3462,10 +4496,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">无法启动索引,关闭中...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -3634,6 +4692,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">这是你每次交易付款时最少要付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amounts must not be negative</source>
<translation type="unfinished">交易金额不不可为负数</translation>
</message>
@@ -3702,14 +4764,30 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">在 -onlynet 指定了不明的網路別: '%s'</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">不支持的全局日志等级 -loglevel=%s 。有效的数值:%s 。</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh.ts b/src/qt/locale/bitcoin_zh.ts
index e7b203da47..0b2297d0b7 100644
--- a/src/qt/locale/bitcoin_zh.ts
+++ b/src/qt/locale/bitcoin_zh.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">选择(&amp;H)</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">发送地址</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">接收地址</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">这些是你的比特币支付地址。在发送之前,一定要核对金额和接收地址。</translation>
</message>
@@ -102,6 +94,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">试图将地址列表保存到 %1时出错,请再试一次。</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">付款地址 - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">收款地址 - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">导出失败</translation>
</message>
@@ -298,6 +298,97 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 didn't yet exit safely…</source>
<translation type="unfinished">%1尚未安全退出…</translation>
</message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">未知</translation>
+ </message>
+ <message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">金额</translation>
+ </message>
+ <message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">请输入一个比特币地址 (例如 %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
+ <translation type="unfinished">傳入</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
+ <source>Block Relay</source>
+ <extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">區塊轉發</translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <extracomment>Peer connection type established manually through one of several methods.</extracomment>
+ <translation type="unfinished">手冊</translation>
+ </message>
+ <message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 天</translation>
+ </message>
+ <message>
+ <source>%1 h</source>
+ <translation type="unfinished">%1 小时</translation>
+ </message>
+ <message>
+ <source>%1 m</source>
+ <translation type="unfinished">%1 分钟</translation>
+ </message>
+ <message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>N/A</source>
+ <translation type="unfinished">不可用</translation>
+ </message>
+ <message>
+ <source>%1 ms</source>
+ <translation type="unfinished">%1 毫秒</translation>
+ </message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
@@ -328,16 +419,36 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n 周</numerusform>
</translation>
</message>
+ <message>
+ <source>%1 and %2</source>
+ <translation type="unfinished">%1 和 %2</translation>
+ </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
<numerusform>%n年</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>%1 B</source>
+ <translation type="unfinished">%1 字节</translation>
+ </message>
+ <message>
+ <source>%1 MB</source>
+ <translation type="unfinished">%1 MB (百萬位元組)</translation>
+ </message>
+ <message>
+ <source>%1 GB</source>
+ <translation type="unfinished">%1 GB (十億位元組)</translation>
+ </message>
+</context>
<context>
<name>BitcoinGUI</name>
<message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">關於%1(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Minimize</source>
<translation type="unfinished">最小化</translation>
</message>
@@ -358,6 +469,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">标签工具栏</translation>
</message>
<message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">正在跟其他節點連線中...</translation>
+ </message>
+ <message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
<translation type="unfinished">请求支付 (生成二维码和 bitcoin: URI)</translation>
</message>
@@ -384,6 +499,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">落后 %1</translation>
</message>
<message>
+ <source>Catching up…</source>
+ <translation type="unfinished">追上中...</translation>
+ </message>
+ <message>
<source>Last received block was generated %1 ago.</source>
<translation type="unfinished">最新接收到的区块是在%1之前生成的。</translation>
</message>
@@ -454,12 +573,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">從備份檔案中恢復錢包</translation>
</message>
<message>
- <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示%1帮助消息以获得可能包含Bitcoin命令行选项的列表</translation>
+ <source>Close all wallets</source>
+ <translation type="unfinished">关闭所有钱包</translation>
</message>
<message>
- <source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">迁移一个钱包</translation>
+ </message>
+ <message>
+ <source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
+ <translation type="unfinished">显示%1帮助消息以获得可能包含Bitcoin命令行选项的列表</translation>
</message>
<message>
<source>No wallets available</source>
@@ -511,57 +638,329 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">預先同步標頭(%1%)</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">创建钱包时出错</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">无法创建新钱包,软件编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">错误: %1</translation>
</message>
- </context>
+ <message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">警告: %1</translation>
+ </message>
+ <message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">日期: %1
+</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation type="unfinished">金額: %1
+</translation>
+ </message>
+ <message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">錢包: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation type="unfinished">種類: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation type="unfinished">標記: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation type="unfinished">地址: %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation type="unfinished">收款交易</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
+ <translation type="unfinished">產生 HD 金鑰&lt;b&gt;已經啟用&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">HD密钥生成&lt;b&gt;禁用&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">私钥&lt;b&gt;禁用&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Original message:</source>
+ <translation type="unfinished">原消息:</translation>
+ </message>
+</context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation type="unfinished">金额单位。单击选择别的单位。</translation>
+ </message>
+</context>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation type="unfinished">手动选币</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">加上交易费用后:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
+ <source>Tree mode</source>
+ <translation type="unfinished">树状模式</translation>
+ </message>
+ <message>
+ <source>List mode</source>
+ <translation type="unfinished">列表模式</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">金额</translation>
+ </message>
+ <message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation type="unfinished">收款地址</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Confirmations</source>
+ <translation type="unfinished">确认</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;複製地址</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">複製 &amp;label</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">複製 &amp;amount</translation>
+ </message>
+ <message>
<source>Copy transaction &amp;ID and output index</source>
<translation type="unfinished">複製交易&amp;ID與輸出序號</translation>
</message>
<message>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">锁定未花费(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">复制数目</translation>
+ </message>
+ <message>
<source>Copy fee</source>
<translation type="unfinished">复制手续费</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">是</translation>
+ <source>Copy after fee</source>
+ <translation type="unfinished">复制含交易费的金额</translation>
</message>
<message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">当任何一个收款金额小于目前的粉尘金额阈值时,文字会变红色。</translation>
+ <source>Copy bytes</source>
+ <translation type="unfinished">复制字节数</translation>
+ </message>
+ <message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation type="unfinished">每个输入可能有 +/- %1 聪 (satoshi) 的误差。</translation>
</message>
<message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
- </context>
+ <message>
+ <source>change from %1 (%2)</source>
+ <translation type="unfinished">来自 %1 的找零 (%2)</translation>
+ </message>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
+ <source>Create Wallet</source>
+ <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
+ <translation type="unfinished">创建钱包</translation>
+ </message>
+ <message>
<source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
<translation type="unfinished">正在创建钱包&lt;b&gt;%1&lt;/b&gt;...</translation>
</message>
<message>
+ <source>Create wallet failed</source>
+ <translation type="unfinished">创建钱包失败</translation>
+ </message>
+ <message>
+ <source>Create wallet warning</source>
+ <translation type="unfinished">创建钱包警告</translation>
+ </message>
+ <message>
+ <source>Can't list signers</source>
+ <translation type="unfinished">无法列出签名器</translation>
+ </message>
+ <message>
<source>Too many external signers found</source>
<translation type="unfinished">偵測到的外接簽名器過多</translation>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您确定想要迁移钱包&lt;i&gt;%1&lt;/i&gt;吗?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">迁移钱包将会把这个钱包转换成一个或多个输出描述符钱包。将会需要创建一个新的钱包备份。
+如果这个钱包包含仅观察脚本,将会创建包含那些仅观察脚本的新钱包。
+如果这个钱包包含可解但又未被监视的脚本,将会创建一个不同的钱包以包含那些脚本。
+
+迁移过程开始前将会创建一个钱包备份。备份文件将会被命名为 &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak 然后被保存在该钱包所在目录下。如果迁移过程出错,可以使用“恢复钱包”功能恢复备份。</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">迁移钱包 &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">迁移失败</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">迁移成功</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
+ <source>Open wallet failed</source>
+ <translation type="unfinished">打开钱包失败</translation>
+ </message>
+ <message>
+ <source>Open wallet warning</source>
+ <translation type="unfinished">打开钱包警告</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+ <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">打开钱包</translation>
</message>
- </context>
+ <message>
+ <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
+ <translation type="unfinished">打开钱包&lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+</context>
<context>
<name>RestoreWalletActivity</name>
<message>
@@ -597,29 +996,90 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">关闭钱包</translation>
</message>
<message>
+ <source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您确定想要关闭钱包&lt;i&gt;%1&lt;/i&gt;吗?</translation>
+ </message>
+ <message>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
<translation type="unfinished">启用修剪时,如果一个钱包被卸载太久,就必须重新同步整条区块链才能再次加载它。</translation>
</message>
- </context>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">关闭所有钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">您确定想要关闭所有钱包吗?</translation>
+ </message>
+</context>
<context>
<name>CreateWalletDialog</name>
<message>
+ <source>Create Wallet</source>
+ <translation type="unfinished">创建钱包</translation>
+ </message>
+ <message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">距离创建您的新钱包只有一步之遥了!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">请指定一个名字,如果需要的话还可以启用高级选项</translation>
+ </message>
+ <message>
+ <source>Wallet Name</source>
+ <translation type="unfinished">錢包名稱</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation type="unfinished">钱包</translation>
+ </message>
+ <message>
+ <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
+ <translation type="unfinished">加密钱包。将会使用您指定的密码将钱包加密。</translation>
+ </message>
+ <message>
+ <source>Encrypt Wallet</source>
+ <translation type="unfinished">加密钱包</translation>
+ </message>
+ <message>
<source>Advanced Options</source>
<translation type="unfinished">进阶设定</translation>
</message>
<message>
+ <source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
+ <translation type="unfinished">禁用此钱包的私钥。被禁用私钥的钱包将不会含有任何私钥,而且也不能含有HD种子或导入的私钥。作为仅观察钱包,这是比较理想的。</translation>
+ </message>
+ <message>
<source>Disable Private Keys</source>
<translation type="unfinished">禁用私钥</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">使用输出描述符进行scriptPubKey管理</translation>
+ <source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
+ <translation type="unfinished">创建一个空白的钱包。空白钱包最初不含有任何私钥或脚本。可以以后再导入私钥和地址,或设置HD种子。</translation>
+ </message>
+ <message>
+ <source>Make Blank Wallet</source>
+ <translation type="unfinished">创建空白钱包</translation>
+ </message>
+ <message>
+ <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
+ <translation type="unfinished">使用像是硬件钱包这样的外部签名设备。请在钱包偏好设置中先配置号外部签名器脚本。</translation>
+ </message>
+ <message>
+ <source>External signer</source>
+ <translation type="unfinished">外部签名器</translation>
+ </message>
+ <message>
+ <source>Create</source>
+ <translation type="unfinished">创建</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">编译时未启用外部签名支持 (外部签名需要这个功能)</translation>
</message>
- </context>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -635,14 +1095,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">与此地址关联的标签</translation>
</message>
<message>
+ <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
+ <translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">地址(&amp;A)</translation>
+ </message>
+ <message>
<source>New sending address</source>
<translation type="unfinished">新建付款地址</translation>
</message>
<message>
+ <source>Edit receiving address</source>
+ <translation type="unfinished">编辑收款地址</translation>
+ </message>
+ <message>
<source>Edit sending address</source>
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>The entered address "%1" is not a valid Bitcoin address.</source>
+ <translation type="unfinished">输入的地址 %1 并不是有效的比特币地址。</translation>
+ </message>
+ <message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">地址“%1”已经存在,它是一个收款地址,标签为“%2”,所以它不能作为一个付款地址被添加进来。</translation>
+ </message>
+ <message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">输入的地址“%1”已经存在于地址簿中,标签为“%2”。</translation>
</message>
@@ -650,16 +1130,40 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Could not unlock wallet.</source>
<translation type="unfinished">无法解锁钱包。</translation>
</message>
- </context>
+ <message>
+ <source>New key generation failed.</source>
+ <translation type="unfinished">生成新密钥失败。</translation>
+ </message>
+</context>
<context>
<name>FreespaceChecker</name>
<message>
+ <source>A new data directory will be created.</source>
+ <translation type="unfinished">一个新的数据目录将被创建。</translation>
+ </message>
+ <message>
+ <source>name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
+ <source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
+ <translation type="unfinished">目录已存在。如果您打算在这里创建一个新目录,请添加 %1。</translation>
+ </message>
+ <message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">路径已存在,并且不是一个目录。</translation>
+ </message>
+ <message>
<source>Cannot create data directory here.</source>
<translation type="unfinished">无法在此创建数据目录。</translation>
</message>
</context>
<context>
<name>Intro</name>
+ <message>
+ <source>Bitcoin</source>
+ <translation type="unfinished">比特币</translation>
+ </message>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
@@ -682,18 +1186,58 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Choose data directory</source>
<translation type="unfinished">选择数据目录</translation>
</message>
+ <message>
+ <source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
+ <translation type="unfinished">此目录中至少会保存 %1 GB 的数据,并且大小还会随着时间增长。</translation>
+ </message>
+ <message>
+ <source>Approximately %1 GB of data will be stored in this directory.</source>
+ <translation type="unfinished">会在此目录中存储约 %1 GB 的数据。</translation>
+ </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
- <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(足以恢复 %n 天之内的备份)</numerusform>
</translation>
</message>
<message>
+ <source>%1 will download and store a copy of the Bitcoin block chain.</source>
+ <translation type="unfinished">%1 将会下载并存储比特币区块链。</translation>
+ </message>
+ <message>
+ <source>The wallet will also be stored in this directory.</source>
+ <translation type="unfinished">钱包也会被保存在这个目录中。</translation>
+ </message>
+ <message>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation type="unfinished">错误:无法创建指定的数据目录 "%1"</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">错误</translation>
</message>
<message>
+ <source>Welcome</source>
+ <translation type="unfinished">欢迎</translation>
+ </message>
+ <message>
+ <source>Welcome to %1.</source>
+ <translation type="unfinished">欢迎使用 %1</translation>
+ </message>
+ <message>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
+ </message>
+ <message>
+ <source>Limit block chain storage to</source>
+ <translation type="unfinished">將區塊鏈儲存限制為</translation>
+ </message>
+ <message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">取消此设置需要重新下载整个区块链。先完整下载整条链再进行修剪会更快。这会禁用一些高级功能。</translation>
+ </message>
+ <message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
<translation type="unfinished">初始化同步过程是非常吃力的,同时可能会暴露您之前没有注意到的电脑硬件问题。你每次启动%1时,它都会从之前中断的地方继续下载。</translation>
</message>
@@ -701,17 +1245,147 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
<translation type="unfinished">當你點擊「確認」,%1會開始下載,並從%3年最早的交易,處裡整個%4區塊鏈(大小:%2GB)</translation>
</message>
- </context>
+ <message>
+ <source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
+ <translation type="unfinished">如果你选择限制区块链存储大小(区块链裁剪模式),程序依然会下载并处理全部历史数据,只是不必须的部分会在使用后被删除,以占用最少的存储空间。</translation>
+ </message>
+ <message>
+ <source>Use the default data directory</source>
+ <translation type="unfinished">使用默认的数据目录</translation>
+ </message>
+ <message>
+ <source>Use a custom data directory:</source>
+ <translation type="unfinished">使用自定义的数据目录:</translation>
+ </message>
+</context>
+<context>
+ <name>HelpMessageDialog</name>
+ <message>
+ <source>version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
+ <source>About %1</source>
+ <translation type="unfinished">关于 %1</translation>
+ </message>
+ <message>
+ <source>Command-line options</source>
+ <translation type="unfinished">命令行选项</translation>
+ </message>
+</context>
+<context>
+ <name>ShutdownWindow</name>
+ <message>
+ <source>%1 is shutting down…</source>
+ <translation type="unfinished">%1正在關閉..</translation>
+ </message>
+ <message>
+ <source>Do not shut down the computer until this window disappears.</source>
+ <translation type="unfinished">在此窗口消失前不要关闭计算机。</translation>
+ </message>
+</context>
<context>
<name>ModalOverlay</name>
<message>
+ <source>Form</source>
+ <translation type="unfinished">窗体</translation>
+ </message>
+ <message>
+ <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
+ <translation type="unfinished">近期交易可能尚未显示,因此当前余额可能不准确。以上信息将在与比特币网络完全同步后更正。详情如下</translation>
+ </message>
+ <message>
+ <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
+ <translation type="unfinished">尝试使用受未可见交易影响的余额将不被网络接受。</translation>
+ </message>
+ <message>
+ <source>Number of blocks left</source>
+ <translation type="unfinished">剩余区块数量</translation>
+ </message>
+ <message>
+ <source>Unknown…</source>
+ <translation type="unfinished">未知...</translation>
+ </message>
+ <message>
+ <source>calculating…</source>
+ <translation type="unfinished">計算...</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
+ <source>Progress</source>
+ <translation type="unfinished">进度</translation>
+ </message>
+ <message>
+ <source>Progress increase per hour</source>
+ <translation type="unfinished">每小时进度增加</translation>
+ </message>
+ <message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">预计剩余同步时间</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">隐藏</translation>
+ </message>
+ <message>
+ <source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
+ <translation type="unfinished">%1目前正在同步中。它会从其他节点下载区块头和区块数据并进行验证,直到抵达区块链尖端。</translation>
+ </message>
+ <message>
+ <source>Unknown. Syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">未知。同步區塊標頭(%1, %2%)中...</translation>
+ </message>
+ <message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
<translation type="unfinished">不明。正在預先同步標頭(%1, %2%)...</translation>
</message>
</context>
<context>
+ <name>OpenURIDialog</name>
+ <message>
+ <source>Open bitcoin URI</source>
+ <translation type="unfinished">打开比特币URI</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
+<context>
<name>OptionsDialog</name>
<message>
+ <source>Options</source>
+ <translation type="unfinished">选项</translation>
+ </message>
+ <message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
+ </message>
+ <message>
+ <source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
+ <translation type="unfinished">啟用區塊修剪(pruning)會顯著減少儲存交易對儲存空間的需求。 所有的區塊仍然會被完整校驗。 取消這個設定需要再重新下載整個區塊鏈。</translation>
+ </message>
+ <message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -728,30 +1402,38 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
<message>
<source>Open the %1 configuration file from the working directory.</source>
- <translation type="unfinished">從工作目錄開啟設定檔 %1。</translation>
+ <translation type="unfinished">从工作目录下打开配置文件 %1。</translation>
</message>
<message>
<source>Open Configuration File</source>
- <translation type="unfinished">開啟設定檔</translation>
+ <translation type="unfinished">打开配置文件</translation>
</message>
<message>
<source>Reset all client options to default.</source>
- <translation type="unfinished">重設所有客戶端軟體選項成預設值。</translation>
+ <translation type="unfinished">恢复客户端的缺省设置</translation>
</message>
<message>
<source>&amp;Reset Options</source>
- <translation type="unfinished">重設選項(&amp;R)</translation>
+ <translation type="unfinished">恢复缺省设置(&amp;R)</translation>
</message>
<message>
<source>&amp;Network</source>
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -767,7 +1449,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
- <translation type="unfinished">(0 表示程式自動決定,小於 0 表示保留處理器核心不用的數目)</translation>
+ <translation type="unfinished">(0 = 自动, &lt;0 = 保持指定数量的CPU核心空闲)</translation>
</message>
<message>
<source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
@@ -780,6 +1462,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -790,10 +1476,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -804,14 +1502,106 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
- <translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
+ <translation type="unfinished">外接簽證設備執行檔路徑(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">使用 &amp;UPnP 映射端口</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
+ <source>Accept connections from outside.</source>
+ <translation type="unfinished">接受外部连接。</translation>
+ </message>
+ <message>
+ <source>Allow incomin&amp;g connections</source>
+ <translation type="unfinished">允许传入连接(&amp;G)</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation type="unfinished">通过 SOCKS5 代理连接比特币网络。</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
+ </message>
+ <message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
+ <source>Port of the proxy (e.g. 9050)</source>
+ <translation type="unfinished">代理服务器端口(例如 9050)</translation>
+ </message>
+ <message>
+ <source>Used for reaching peers via:</source>
+ <translation type="unfinished">在走这些途径连接到节点的时候启用:</translation>
</message>
<message>
<source>&amp;Window</source>
<translation type="unfinished">&amp;窗口</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Show only a tray icon after minimizing the window.</source>
+ <translation type="unfinished">最小化窗口后仅显示托盘图标</translation>
+ </message>
+ <message>
+ <source>&amp;Minimize to the tray instead of the taskbar</source>
+ <translation type="unfinished">最小化到托盘(&amp;M)</translation>
+ </message>
+ <message>
+ <source>M&amp;inimize on close</source>
+ <translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
+ <source>User Interface &amp;language:</source>
+ <translation type="unfinished">用户界面语言(&amp;L):</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation type="unfinished">可以在这里设定用户界面的语言。这个设定在重启 %1 后才会生效。</translation>
+ </message>
+ <message>
+ <source>&amp;Unit to show amounts in:</source>
+ <translation type="unfinished">比特币金额单位(&amp;U):</translation>
+ </message>
+ <message>
+ <source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
+ <translation type="unfinished">选择显示及发送比特币时使用的最小单位。</translation>
+ </message>
+ <message>
<source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
<translation type="unfinished">这个第三方网址(比如区块浏览器)会出现在交易选项卡的右键菜单中。 网址中的%s代表交易哈希。多个网址需要用竖线 | 相互分隔。</translation>
</message>
@@ -820,19 +1610,93 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
+ <translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">軟體未編譯外接簽證功能所需的軟體庫(外接簽證必須有此功能)</translation>
+ </message>
+ <message>
+ <source>default</source>
+ <translation type="unfinished">默认</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
+ <source>Client restart required to activate changes.</source>
+ <extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
+ <translation type="unfinished">需要重启客户端才能使更改生效。</translation>
+ </message>
+ <message>
<source>Current settings will be backed up at "%1".</source>
<extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
<translation type="unfinished">当前设置将会被备份到 "%1"。</translation>
</message>
<message>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
+ <translation type="unfinished">客户端即将关闭,您想继续吗?</translation>
+ </message>
+ <message>
+ <source>Configuration options</source>
+ <extracomment>Window title text of pop-up box that allows opening up of configuration file.</extracomment>
+ <translation type="unfinished">配置选项</translation>
+ </message>
+ <message>
+ <source>The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
+ <extracomment>Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</extracomment>
+ <translation type="unfinished">配置文件可以用来设置高级选项。配置文件会覆盖设置界面窗口中的选项。此外,命令行会覆盖配置文件指定的选项。</translation>
+ </message>
+ <message>
<source>Continue</source>
<translation type="unfinished">继续</translation>
</message>
<message>
+ <source>Cancel</source>
+ <translation type="unfinished">取消</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">错误</translation>
</message>
- </context>
+ <message>
+ <source>The configuration file could not be opened.</source>
+ <translation type="unfinished">无法打开配置文件。</translation>
+ </message>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -841,23 +1705,268 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>OverviewPage</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">窗体</translation>
+ </message>
+ <message>
+ <source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
+ <translation type="unfinished">现在显示的消息可能是过期的。在连接上比特币网络节点后,您的钱包将自动与网络同步,但是这个过程还没有完成。</translation>
+ </message>
+ <message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
+ <source>Available:</source>
+ <translation type="unfinished">可使用的余额:</translation>
+ </message>
+ <message>
+ <source>Your current spendable balance</source>
+ <translation type="unfinished">您当前可使用的余额</translation>
+ </message>
+ <message>
+ <source>Pending:</source>
+ <translation type="unfinished">等待中的余额:</translation>
+ </message>
+ <message>
+ <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
+ <translation type="unfinished">尚未确认的交易总额,未计入当前余额</translation>
+ </message>
+ <message>
+ <source>Immature:</source>
+ <translation type="unfinished">未成熟的:</translation>
+ </message>
+ <message>
+ <source>Mined balance that has not yet matured</source>
+ <translation type="unfinished">尚未成熟的挖矿收入余额</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation type="unfinished">余额</translation>
+ </message>
+ <message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
+ <source>Your current total balance</source>
+ <translation type="unfinished">您当前的总余额</translation>
+ </message>
+ <message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation type="unfinished">最近交易</translation>
+ </message>
+ <message>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation type="unfinished">仅观察地址的未确认交易</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation type="unfinished">仅观察地址中的当前总余额</translation>
+ </message>
+ <message>
+ <source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
+ <translation type="unfinished">“概况”标签页已启用隐私模式。要明文显示数值,请在设置中取消勾选“不明文显示数值”。</translation>
+ </message>
+</context>
+<context>
<name>PSBTOperationsDialog</name>
<message>
<source>PSBT Operations</source>
<translation type="unfinished">PSBT操作</translation>
</message>
<message>
+ <source>Sign Tx</source>
+ <translation type="unfinished">签名交易</translation>
+ </message>
+ <message>
+ <source>Broadcast Tx</source>
+ <translation type="unfinished">广播交易</translation>
+ </message>
+ <message>
+ <source>Copy to Clipboard</source>
+ <translation type="unfinished">复制到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save…</source>
+ <translation type="unfinished">儲存...</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished">关闭</translation>
+ </message>
+ <message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
<message>
+ <source>Could not sign any more inputs.</source>
+ <translation type="unfinished">没有交易输入项可供签名了。</translation>
+ </message>
+ <message>
+ <source>Signed %1 inputs, but more signatures are still required.</source>
+ <translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
+ </message>
+ <message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast successfully! Transaction ID: %1</source>
+ <translation type="unfinished">已成功广播交易!交易ID: %1</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast failed: %1</source>
+ <translation type="unfinished">交易广播失败: %1</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">部分簽名交易(二進位)</translation>
+ </message>
+ <message>
+ <source>PSBT saved to disk.</source>
+ <translation type="unfinished">PSBT已保存到硬盘</translation>
+ </message>
+ <message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
+ <source>Pays transaction fee: </source>
+ <translation type="unfinished">支付交易费用:</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">总额</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">或</translation>
+ </message>
+ <message>
+ <source>Transaction has %1 unsigned inputs.</source>
+ <translation type="unfinished">交易中含有%1个未签名输入项。</translation>
+ </message>
+ <message>
+ <source>Transaction is missing some information about inputs.</source>
+ <translation type="unfinished">交易中有输入项缺失某些信息。</translation>
+ </message>
+ <message>
+ <source>Transaction still needs signature(s).</source>
+ <translation type="unfinished">交易仍然需要签名。</translation>
+ </message>
+ <message>
<source>(But no wallet is loaded.)</source>
<translation type="unfinished">(但没有加载钱包。)</translation>
</message>
- </context>
+ <message>
+ <source>(But this wallet cannot sign transactions.)</source>
+ <translation type="unfinished">(但这个钱包不能签名交易)</translation>
+ </message>
+ <message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
+ <source>Transaction status is unknown.</source>
+ <translation type="unfinished">交易状态未知。</translation>
+ </message>
+</context>
+<context>
+ <name>PaymentServer</name>
+ <message>
+ <source>Payment request error</source>
+ <translation type="unfinished">支付请求出错</translation>
+ </message>
+ <message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
+ <source>URI handling</source>
+ <translation type="unfinished">URI 处理</translation>
+ </message>
+ <message>
+ <source>'bitcoin://' is not a valid URI. Use 'bitcoin:' instead.</source>
+ <translation type="unfinished">‘bitcoin://’不是合法的URI。请改用'bitcoin:'。</translation>
+ </message>
+ <message>
+ <source>Cannot process payment request because BIP70 is not supported.
+Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
+If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
+ <translation type="unfinished">因為不支援BIP70,無法處理付款請求。
+由於BIP70具有廣泛的安全缺陷,無論哪個商家指引要求更換錢包,強烈建議不要更換。
+如果您看到了這個錯誤,您應該要求商家提供與BIP21相容的URI。</translation>
+ </message>
+ <message>
+ <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
+ <translation type="unfinished">无法解析 URI 地址!可能是因为比特币地址无效,或是 URI 参数格式错误。</translation>
+ </message>
+ <message>
+ <source>Payment request file handling</source>
+ <translation type="unfinished">支付请求文件处理</translation>
+ </message>
+</context>
<context>
<name>PeerTableModel</name>
<message>
+ <source>User Agent</source>
+ <extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
+ <translation type="unfinished">用户代理</translation>
+ </message>
+ <message>
+ <source>Peer</source>
+ <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
+ <translation type="unfinished">節點</translation>
+ </message>
+ <message>
<source>Age</source>
<extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
<translation type="unfinished">连接时间</translation>
@@ -868,14 +1977,192 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">方向</translation>
</message>
<message>
+ <source>Sent</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</extracomment>
+ <translation type="unfinished">已发送</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
+ <translation type="unfinished">已接收</translation>
+ </message>
+ <message>
<source>Address</source>
<extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
<translation type="unfinished">地址</translation>
</message>
- </context>
+ <message>
+ <source>Type</source>
+ <extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
+ <translation type="unfinished">类型</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
+ <translation type="unfinished">网络</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An Inbound Connection from a Peer.</extracomment>
+ <translation type="unfinished">傳入</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
+<context>
+ <name>QRImageWidget</name>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">儲存圖片(&amp;S)...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
+ <source>Error encoding URI into QR Code.</source>
+ <translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
+ </message>
+ <message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
+ <source>Save QR Code</source>
+ <translation type="unfinished">保存二维码</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
+ <translation type="unfinished">PNG 圖</translation>
+ </message>
+</context>
<context>
<name>RPCConsole</name>
<message>
+ <source>N/A</source>
+ <translation type="unfinished">不可用</translation>
+ </message>
+ <message>
+ <source>Client version</source>
+ <translation type="unfinished">客户端版本</translation>
+ </message>
+ <message>
+ <source>&amp;Information</source>
+ <translation type="unfinished">信息(&amp;I)</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="unfinished">常规</translation>
+ </message>
+ <message>
+ <source>Datadir</source>
+ <translation type="unfinished">数据目录</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the data directory use the '%1' option.</source>
+ <translation type="unfinished">如果不想用預設的資料目錄位置,請使用'%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
+ <source>Blocksdir</source>
+ <translation type="unfinished">區塊儲存目錄</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
+ <source>Startup time</source>
+ <translation type="unfinished">启动时间</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">网络</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
+ <source>Number of connections</source>
+ <translation type="unfinished">连接数</translation>
+ </message>
+ <message>
+ <source>Block chain</source>
+ <translation type="unfinished">区块链</translation>
+ </message>
+ <message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished">内存使用</translation>
+ </message>
+ <message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
+ <source>(none)</source>
+ <translation type="unfinished">(无)</translation>
+ </message>
+ <message>
+ <source>&amp;Reset</source>
+ <translation type="unfinished">重置(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <translation type="unfinished">已接收</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation type="unfinished">已发送</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation type="unfinished">节点(&amp;P)</translation>
+ </message>
+ <message>
+ <source>Banned peers</source>
+ <translation type="unfinished">已封禁节点</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation type="unfinished">选择节点查看详细信息。</translation>
+ </message>
+ <message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">传输层版本: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">传输</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">十六进制格式的BIP324会话ID,如果有的话。</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">会话ID</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">是否要将交易转发给这个节点。</translation>
</message>
@@ -884,10 +2171,30 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation type="unfinished">已同步區塊頭標</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
<message>
+ <source>The mapped Autonomous System used for diversifying peer selection.</source>
+ <translation type="unfinished">映射到的自治系统,被用来多样化选择节点</translation>
+ </message>
+ <message>
+ <source>Mapped AS</source>
+ <translation type="unfinished">映射到的AS</translation>
+ </message>
+ <message>
<source>Whether we relay addresses to this peer.</source>
<extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
<translation type="unfinished">是否把地址转发给这个节点。</translation>
@@ -918,18 +2225,395 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">被频率限制丢弃的地址</translation>
</message>
<message>
+ <source>User Agent</source>
+ <translation type="unfinished">用户代理</translation>
+ </message>
+ <message>
<source>Node window</source>
<translation type="unfinished">结点窗口</translation>
</message>
<message>
+ <source>Current block height</source>
+ <translation type="unfinished">当前区块高度</translation>
+ </message>
+ <message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation type="unfinished">缩小字体大小</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation type="unfinished">放大字体大小</translation>
+ </message>
+ <message>
+ <source>Permissions</source>
+ <translation type="unfinished">权限</translation>
+ </message>
+ <message>
+ <source>The direction and type of peer connection: %1</source>
+ <translation type="unfinished">節點連接的方向和類型: %1</translation>
+ </message>
+ <message>
+ <source>Direction/Type</source>
+ <translation type="unfinished">方向/類型</translation>
+ </message>
+ <message>
+ <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
+ <translation type="unfinished">這個節點是透過這種網路協定連接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation type="unfinished">服务</translation>
+ </message>
+ <message>
+ <source>High bandwidth BIP152 compact block relay: %1</source>
+ <translation type="unfinished">高頻寬BIP152密集區塊轉發: %1</translation>
+ </message>
+ <message>
+ <source>High Bandwidth</source>
+ <translation type="unfinished">高頻寬</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
+ <source>Last Block</source>
+ <translation type="unfinished">上一個區塊</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
+ <source>Last Send</source>
+ <translation type="unfinished">上次发送</translation>
+ </message>
+ <message>
+ <source>Last Receive</source>
+ <translation type="unfinished">上次接收</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation type="unfinished">Ping 等待</translation>
+ </message>
+ <message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation type="unfinished">打开(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Console</source>
+ <translation type="unfinished">控制台(&amp;C)</translation>
+ </message>
+ <message>
+ <source>&amp;Network Traffic</source>
+ <translation type="unfinished">网络流量(&amp;N)</translation>
+ </message>
+ <message>
+ <source>Totals</source>
+ <translation type="unfinished">总数</translation>
+ </message>
+ <message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
+ <source>Clear console</source>
+ <translation type="unfinished">清空控制台</translation>
+ </message>
+ <message>
+ <source>In:</source>
+ <translation type="unfinished">傳入:</translation>
+ </message>
+ <message>
+ <source>Out:</source>
+ <translation type="unfinished">傳出:</translation>
+ </message>
+ <message>
+ <source>Inbound: initiated by peer</source>
+ <extracomment>Explanatory text for an inbound peer connection.</extracomment>
+ <translation type="unfinished">Inbound: 由對端節點發起</translation>
+ </message>
+ <message>
+ <source>Outbound Full Relay: default</source>
+ <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
+ <translation type="unfinished">完整轉發: 預設</translation>
+ </message>
+ <message>
+ <source>Outbound Block Relay: does not relay transactions or addresses</source>
+ <extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">出站區塊轉送: 不轉送交易和地址</translation>
+ </message>
+ <message>
+ <source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
+ <extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
+ <translation type="unfinished">手動Outbound: 加入使用RPC %1 或 %2/%3 配置選項</translation>
+ </message>
+ <message>
+ <source>Outbound Feeler: short-lived, for testing addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">Outbound Feeler: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: 未加密,明文传输协议</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324加密传输协议</translation>
+ </message>
+ <message>
+ <source>we selected the peer for high bandwidth relay</source>
+ <translation type="unfinished">我們選擇了用於高頻寬轉送的節點</translation>
+ </message>
+ <message>
+ <source>the peer selected us for high bandwidth relay</source>
+ <translation type="unfinished">對端選擇了我們用於高頻寬轉發</translation>
+ </message>
+ <message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <extracomment>Context menu action to copy the address of a peer.</extracomment>
+ <translation type="unfinished">&amp;複製地址</translation>
+ </message>
+ <message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation type="unfinished">1 小时(&amp;H)</translation>
+ </message>
+ <message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
</message>
- </context>
+ <message>
+ <source>&amp;Unban</source>
+ <translation type="unfinished">解封(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Welcome to the %1 RPC console.
+Use up and down arrows to navigate history, and %2 to clear screen.
+Use %3 and %4 to increase or decrease the font size.
+Type %5 for an overview of available commands.
+For more information on using this console, type %6.
+
+%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
+ <extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
+ <translation type="unfinished">欢迎来到 %1 RPC 控制台。
+使用上与下箭头以进行历史导航,%2 以清除屏幕。
+使用%3 和 %4 以增加或减小字体大小。
+输入 %5 以显示可用命令的概览。
+查看更多关于此控制台的信息,输入 %6。
+
+%7 警告:骗子们很活跃,他们会让用户在这里输入命令以便偷走用户钱包中的内容。所以请您不要在不完全了解一个命令的后果的情况下使用此控制台。%8</translation>
+ </message>
+ <message>
+ <source>Executing…</source>
+ <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
+ <translation type="unfinished">執行中……</translation>
+ </message>
+ <message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
+ <source>via %1</source>
+ <translation type="unfinished">通过 %1</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation type="unfinished">是</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">到</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">来自</translation>
+ </message>
+ <message>
+ <source>Ban for</source>
+ <translation type="unfinished">封禁时长</translation>
+ </message>
+ <message>
+ <source>Never</source>
+ <translation type="unfinished">永不</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation type="unfinished">未知</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
+ <source>&amp;Amount:</source>
+ <translation type="unfinished">金额(&amp;A):</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>&amp;Message:</source>
+ <translation type="unfinished">消息(&amp;M):</translation>
+ </message>
+ <message>
+ <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
+ <translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
+ <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
+ <translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
+ </message>
+ <message>
+ <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
+ <translation type="unfinished">可选的请求金额。留空或填零为不要求具体金额。</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
+ <translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
+ </message>
+ <message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
+ <source>&amp;Create new receiving address</source>
+ <translation type="unfinished">新建收款地址(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">清除</translation>
+ </message>
+ <message>
+ <source>Requested payments history</source>
+ <translation type="unfinished">付款请求历史</translation>
+ </message>
+ <message>
+ <source>Show the selected request (does the same as double clicking an entry)</source>
+ <translation type="unfinished">显示选中的请求 (直接双击项目也可以显示)</translation>
+ </message>
+ <message>
+ <source>Show</source>
+ <translation type="unfinished">显示</translation>
+ </message>
+ <message>
+ <source>Remove the selected entries from the list</source>
+ <translation type="unfinished">从列表中移除选中的条目</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation type="unfinished">复制 &amp;URI</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;複製地址</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">複製 &amp;label</translation>
+ </message>
+ <message>
+ <source>Copy &amp;message</source>
+ <translation type="unfinished">複製訊息(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">複製金額 &amp;amount</translation>
+ </message>
+ <message>
<source>Base58 (Legacy)</source>
<translation type="unfinished">Base58 (旧式)</translation>
</message>
@@ -953,21 +2637,252 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Could not unlock wallet.</source>
<translation type="unfinished">无法解锁钱包。</translation>
</message>
- </context>
+ <message>
+ <source>Could not generate new %1 address</source>
+ <translation type="unfinished">无法生成新的%1地址</translation>
+ </message>
+</context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ <message>
+ <source>Request payment to …</source>
+ <translation type="unfinished">請求支付至...</translation>
+ </message>
+ <message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Label:</source>
+ <translation type="unfinished">标签:</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">消息:</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation type="unfinished">复制 &amp;URI</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Address</source>
+ <translation type="unfinished">复制地址(&amp;A)</translation>
+ </message>
+ <message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">儲存圖片(&amp;S)...</translation>
+ </message>
+ <message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
+ <source>Request payment to %1</source>
+ <translation type="unfinished">请求付款到 %1</translation>
+ </message>
+</context>
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
- </context>
+ <message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
+ <source>(no amount requested)</source>
+ <translation type="unfinished">(未填写请求金额)</translation>
+ </message>
+ <message>
+ <source>Requested</source>
+ <translation type="unfinished">请求金额</translation>
+ </message>
+</context>
<context>
<name>SendCoinsDialog</name>
<message>
+ <source>Send Coins</source>
+ <translation type="unfinished">发币</translation>
+ </message>
+ <message>
+ <source>Coin Control Features</source>
+ <translation type="unfinished">手动选币功能</translation>
+ </message>
+ <message>
+ <source>automatically selected</source>
+ <translation type="unfinished">自动选择</translation>
+ </message>
+ <message>
+ <source>Insufficient funds!</source>
+ <translation type="unfinished">金额不足!</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">加上交易费用后:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
+ <translation type="unfinished">在激活该选项后,如果填写了无效的找零地址,或者干脆没填找零地址,找零资金将会被转入新生成的地址。</translation>
+ </message>
+ <message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
+ <source>Transaction Fee:</source>
+ <translation type="unfinished">交易手续费:</translation>
+ </message>
+ <message>
+ <source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
+ <translation type="unfinished">如果使用备用手续费设置,有可能会导致交易经过几个小时、几天(甚至永远)无法被确认。请考虑手动选择手续费,或等待整个链完成验证。</translation>
+ </message>
+ <message>
+ <source>Warning: Fee estimation is currently not possible.</source>
+ <translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">隐藏</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation type="unfinished">推荐:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation type="unfinished">自定义:</translation>
+ </message>
+ <message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
+ <source>Add &amp;Recipient</source>
+ <translation type="unfinished">添加收款人(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
+ </message>
+ <message>
+ <source>Choose…</source>
+ <translation type="unfinished">選擇...</translation>
+ </message>
+ <message>
+ <source>Hide transaction fee settings</source>
+ <translation type="unfinished">隐藏交易手续费设置</translation>
+ </message>
+ <message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
+ <source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
+ <translation type="unfinished">过低的手续费率可能导致交易永远无法确认(请阅读工具提示)</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
+ <source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
+ <translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
+ <source>Balance:</source>
+ <translation type="unfinished">余额:</translation>
+ </message>
+ <message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">复制数目</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
@@ -976,6 +2891,57 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">复制手续费</translation>
</message>
<message>
+ <source>Copy after fee</source>
+ <translation type="unfinished">复制含交易费的金额</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation type="unfinished">复制字节数</translation>
+ </message>
+ <message>
+ <source>%1 (%2 blocks)</source>
+ <translation type="unfinished">%1 (%2个块)</translation>
+ </message>
+ <message>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">部分簽名交易(二進位)</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">或</translation>
+ </message>
+ <message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -986,6 +2952,23 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">请务必仔细检查您的交易。你可以创建并发送这笔交易;也可以创建一个“部分签名比特币交易(PSBT)”,它可以被保存下来或被复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。</translation>
</message>
<message>
+ <source>Please, review your transaction.</source>
+ <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
+ <translation type="unfinished">请检查您的交易。</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">总额</translation>
+ </message>
+ <message>
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
@@ -999,6 +2982,42 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>PSBT saved to disk</source>
<translation type="unfinished">PSBT已保存到磁盘</translation>
</message>
+ <message>
+ <source>Confirm send coins</source>
+ <translation type="unfinished">确认发币</translation>
+ </message>
+ <message>
+ <source>Watch-only balance:</source>
+ <translation type="unfinished">仅观察余额:</translation>
+ </message>
+ <message>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation type="unfinished">接收人地址无效。请重新检查。</translation>
+ </message>
+ <message>
+ <source>The amount to pay must be larger than 0.</source>
+ <translation type="unfinished">支付金额必须大于0。</translation>
+ </message>
+ <message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
+ </message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
@@ -1006,17 +3025,239 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Warning: Invalid Bitcoin address</source>
+ <translation type="unfinished">警告: 比特币地址无效</translation>
+ </message>
+ <message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
+ <source>Confirm custom change address</source>
+ <translation type="unfinished">确认自定义找零地址</translation>
+ </message>
+ <message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
</context>
<context>
+ <name>SendCoinsEntry</name>
+ <message>
+ <source>A&amp;mount:</source>
+ <translation type="unfinished">金额(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Pay &amp;To:</source>
+ <translation type="unfinished">付给(&amp;T):</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation type="unfinished">付款目的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
+ <source>The amount to send in the selected unit</source>
+ <translation type="unfinished">用被选单位表示的待发送金额</translation>
+ </message>
+ <message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation type="unfinished">从金额中减去交易费(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Use available balance</source>
+ <translation type="unfinished">使用全部可用余额</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">消息:</translation>
+ </message>
+ <message>
+ <source>Enter a label for this address to add it to the list of used addresses</source>
+ <translation type="unfinished">请为此地址输入一个标签以将它加入已用地址列表</translation>
+ </message>
+ <message>
+ <source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
+ <translation type="unfinished">bitcoin: URI 附带的备注信息,将会和交易一起存储,备查。 注意:该消息不会通过比特币网络传输。</translation>
+ </message>
+</context>
+<context>
<name>SendConfirmationDialog</name>
<message>
<source>Send</source>
<translation type="unfinished">发送</translation>
</message>
- </context>
+ <message>
+ <source>Create Unsigned</source>
+ <translation type="unfinished">创建未签名交易</translation>
+ </message>
+</context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>Signatures - Sign / Verify a Message</source>
+ <translation type="unfinished">签名 - 为消息签名/验证签名消息</translation>
+ </message>
+ <message>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">消息签名(&amp;S)</translation>
+ </message>
+ <message>
+ <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">您可以用你的地址对消息/协议进行签名,以证明您可以接收发送到该地址的比特币。注意不要对任何模棱两可或者随机的消息进行签名,以免遭受钓鱼式攻击。请确保消息内容准确的表达了您的真实意愿。</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
+ <source>Signature</source>
+ <translation type="unfinished">签名</translation>
+ </message>
+ <message>
+ <source>Copy the current signature to the system clipboard</source>
+ <translation type="unfinished">复制当前签名至剪贴板</translation>
+ </message>
+ <message>
+ <source>Sign the message to prove you own this Bitcoin address</source>
+ <translation type="unfinished">签名消息,以证明这个地址属于您</translation>
+ </message>
+ <message>
+ <source>Sign &amp;Message</source>
+ <translation type="unfinished">签名消息(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all sign message fields</source>
+ <translation type="unfinished">清空所有签名消息栏</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
+ <source>&amp;Verify Message</source>
+ <translation type="unfinished">消息验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address the message was signed with</source>
+ <translation type="unfinished">用来签名消息的地址</translation>
+ </message>
+ <message>
+ <source>The signed message to verify</source>
+ <translation type="unfinished">待验证的已签名消息</translation>
+ </message>
+ <message>
+ <source>The signature given when the message was signed</source>
+ <translation type="unfinished">对消息进行签署得到的签名数据</translation>
+ </message>
+ <message>
+ <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
+ <translation type="unfinished">验证消息,确保消息是由指定的比特币地址签名过的。</translation>
+ </message>
+ <message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
+ <source>Click "Sign Message" to generate signature</source>
+ <translation type="unfinished">单击“签名消息“产生签名。</translation>
+ </message>
+ <message>
+ <source>The entered address is invalid.</source>
+ <translation type="unfinished">输入的地址无效。</translation>
+ </message>
+ <message>
+ <source>Please check the address and try again.</source>
+ <translation type="unfinished">请检查地址后重试。</translation>
+ </message>
+ <message>
+ <source>The entered address does not refer to a key.</source>
+ <translation type="unfinished">找不到与输入地址相关的密钥。</translation>
+ </message>
+ <message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation type="unfinished">没有错误</translation>
+ </message>
+ <message>
+ <source>Private key for the entered address is not available.</source>
+ <translation type="unfinished">找不到输入地址关联的私钥。</translation>
+ </message>
+ <message>
+ <source>Message signing failed.</source>
+ <translation type="unfinished">消息签名失败。</translation>
+ </message>
+ <message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
+ <source>Please check the signature and try again.</source>
+ <translation type="unfinished">请检查签名后重试。</translation>
+ </message>
+ <message>
+ <source>The signature did not match the message digest.</source>
+ <translation type="unfinished">签名与消息摘要不匹配。</translation>
+ </message>
+ <message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
+ <source>Message verified.</source>
+ <translation type="unfinished">消息验证成功。</translation>
+ </message>
+</context>
<context>
<name>SplashScreen</name>
<message>
@@ -1031,6 +3272,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<context>
<name>TransactionDesc</name>
<message>
+ <source>conflicted with a transaction with %1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
+ <translation type="unfinished">与一个有 %1 个确认的交易冲突</translation>
+ </message>
+ <message>
<source>0/unconfirmed, in memory pool</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
<translation type="unfinished">0/未确认,在内存池中</translation>
@@ -1040,37 +3286,387 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
+ <message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
+ <source>%1/unconfirmed</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
+ <translation type="unfinished">%1/未确认</translation>
+ </message>
+ <message>
+ <source>%1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
+ <translation type="unfinished">%1 个确认</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation type="unfinished">状态</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished">来源</translation>
+ </message>
+ <message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">来自</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">未知</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">到</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
+ <source>label</source>
+ <translation type="unfinished">标签</translation>
+ </message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
<numerusform>在%n个区块内成熟</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
+ <source>Total debit</source>
+ <translation type="unfinished">总支出</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Net amount</source>
+ <translation type="unfinished">净额</translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
+ <source>Transaction ID</source>
+ <translation type="unfinished">交易 ID</translation>
+ </message>
+ <message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
+ <source>Transaction virtual size</source>
+ <translation type="unfinished">交易虚拟大小</translation>
+ </message>
+ <message>
+ <source>Output index</source>
+ <translation type="unfinished">输出索引</translation>
+ </message>
+ <message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
+ </message>
+ <message>
+ <source>Merchant</source>
+ <translation type="unfinished">商家</translation>
+ </message>
+ <message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
+ </message>
+ <message>
+ <source>Inputs</source>
+ <translation type="unfinished">输入</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">金额</translation>
+ </message>
+ <message>
+ <source>true</source>
+ <translation type="unfinished">是</translation>
+ </message>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionDescDialog</name>
+ <message>
+ <source>This pane shows a detailed description of the transaction</source>
+ <translation type="unfinished">当前面板显示了交易的详细信息</translation>
+ </message>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">%1 详情</translation>
+ </message>
+</context>
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">类型</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
+ <source>Confirming (%1 of %2 recommended confirmations)</source>
+ <translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
+ </message>
+ <message>
+ <source>Confirmed (%1 confirmations)</source>
+ <translation type="unfinished">已确认 (%1 个确认)</translation>
+ </message>
+ <message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">接收到</translation>
+ </message>
+ <message>
+ <source>Received from</source>
+ <translation type="unfinished">接收自</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">发送到</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">挖矿所得</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
+ <source>(n/a)</source>
+ <translation type="unfinished">(不可用)</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
- </context>
+ <message>
+ <source>Transaction status. Hover over this field to show number of confirmations.</source>
+ <translation type="unfinished">交易状态。 鼠标移到此区域可显示确认数。</translation>
+ </message>
+ <message>
+ <source>Date and time that the transaction was received.</source>
+ <translation type="unfinished">交易被接收的时间和日期。</translation>
+ </message>
+ <message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
+ </message>
+ <message>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation type="unfinished">用户自定义的该交易的意图/目的。</translation>
+ </message>
+ <message>
+ <source>Amount removed from or added to balance.</source>
+ <translation type="unfinished">从余额增加或移除的金额。</translation>
+ </message>
+</context>
<context>
<name>TransactionView</name>
<message>
+ <source>All</source>
+ <translation type="unfinished">全部</translation>
+ </message>
+ <message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
+ <source>This week</source>
+ <translation type="unfinished">本周</translation>
+ </message>
+ <message>
+ <source>This month</source>
+ <translation type="unfinished">本月</translation>
+ </message>
+ <message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">接收到</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">发送到</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">挖矿所得</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation type="unfinished">其它</translation>
+ </message>
+ <message>
+ <source>Enter address, transaction id, or label to search</source>
+ <translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
+ </message>
+ <message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
+ <source>Range…</source>
+ <translation type="unfinished">范围...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">&amp;複製地址</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">複製 &amp;label</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">複製金額 &amp;amount</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID</source>
+ <translation type="unfinished">复制交易 &amp;ID</translation>
+ </message>
+ <message>
+ <source>Copy &amp;raw transaction</source>
+ <translation type="unfinished">複製交易(原始)</translation>
+ </message>
+ <message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
+ <source>Increase transaction &amp;fee</source>
+ <translation type="unfinished">增加礦工費(&amp;fee)</translation>
+ </message>
+ <message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
+ <source>&amp;Edit address label</source>
+ <translation type="unfinished">編輯地址標籤(&amp;E)</translation>
+ </message>
+ <message>
<source>Show in %1</source>
<extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗号分隔文件</translation>
</message>
<message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
+ <source>Watch-only</source>
+ <translation type="unfinished">仅观察</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">类型</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
@@ -1079,25 +3675,138 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">地址</translation>
</message>
<message>
+ <source>ID</source>
+ <translation type="unfinished">識別碼</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">导出失败</translation>
</message>
- </context>
+ <message>
+ <source>There was an error trying to save the transaction history to %1.</source>
+ <translation type="unfinished">尝试把交易历史保存到 %1 时发生了错误。</translation>
+ </message>
+ <message>
+ <source>Exporting Successful</source>
+ <translation type="unfinished">导出成功</translation>
+ </message>
+ <message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation type="unfinished">已成功将交易历史保存到 %1。</translation>
+ </message>
+ <message>
+ <source>Range:</source>
+ <translation type="unfinished">范围:</translation>
+ </message>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
+ <source>No wallet has been loaded.
+Go to File &gt; Open Wallet to load a wallet.
+- OR -</source>
+ <translation type="unfinished">未加载钱包。
+请转到“文件”菜单 &gt; “打开钱包”来加载一个钱包。
+- 或者 -</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">错误</translation>
</message>
- </context>
+ <message>
+ <source>Unable to decode PSBT from clipboard (invalid base64)</source>
+ <translation type="unfinished">无法从剪贴板解码PSBT(Base64值无效)</translation>
+ </message>
+ <message>
+ <source>Load Transaction Data</source>
+ <translation type="unfinished">加载交易数据</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (*.psbt)</source>
+ <translation type="unfinished">部分签名交易 (*.psbt)</translation>
+ </message>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
+ <source>Send Coins</source>
+ <translation type="unfinished">发币</translation>
+ </message>
+ <message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
+ <source>Do you want to increase the fee?</source>
+ <extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
+ <translation type="unfinished">您想追加手续费吗?</translation>
+ </message>
+ <message>
+ <source>Current fee:</source>
+ <translation type="unfinished">当前手续费:</translation>
+ </message>
+ <message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
+ <source>New fee:</source>
+ <translation type="unfinished">新交易费:</translation>
+ </message>
+ <message>
+ <source>Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
+ <translation type="unfinished">警告: 因為在必要的時候會減少找零輸出個數或增加輸入個數,這可能要付出額外的費用。 在沒有找零輸出的情況下可能會新增一個。 這些變更可能會導致潛在的隱私洩漏。</translation>
+ </message>
+ <message>
+ <source>Confirm fee bump</source>
+ <translation type="unfinished">确认手续费追加</translation>
+ </message>
+ <message>
+ <source>Can't draft transaction.</source>
+ <translation type="unfinished">无法起草交易。</translation>
+ </message>
+ <message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
</message>
- </context>
+ <message>
+ <source>Can't sign transaction.</source>
+ <translation type="unfinished">无法签名交易</translation>
+ </message>
+ <message>
+ <source>Could not commit transaction</source>
+ <translation type="unfinished">无法提交交易</translation>
+ </message>
+ <message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+</context>
<context>
<name>WalletView</name>
<message>
@@ -1108,18 +3817,70 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Export the data in the current tab to a file</source>
<translation type="unfinished">将当前选项卡中的数据导出到文件</translation>
</message>
- </context>
+ <message>
+ <source>Backup Wallet</source>
+ <translation type="unfinished">备份钱包</translation>
+ </message>
+ <message>
+ <source>Backup Failed</source>
+ <translation type="unfinished">备份失败</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the wallet data to %1.</source>
+ <translation type="unfinished">尝试保存钱包数据至 %1 时发生了错误。</translation>
+ </message>
+ <message>
+ <source>Backup Successful</source>
+ <translation type="unfinished">备份成功</translation>
+ </message>
+ <message>
+ <source>The wallet data was successfully saved to %1.</source>
+ <translation type="unfinished">已成功保存钱包数据至 %1。</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">取消</translation>
+ </message>
+</context>
<context>
<name>bitcoin-core</name>
<message>
+ <source>The %s developers</source>
+ <translation type="unfinished">%s 开发者</translation>
+ </message>
+ <message>
+ <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
+ <translation type="unfinished">%s损坏。请尝试用bitcoin-wallet钱包工具来对其进行急救。或者用一个备份进行还原。</translation>
+ </message>
+ <message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s请求监听端口%u。此端口被认为是“坏的”,所以不太可能有其他节点会连接过来。详情以及完整的端口列表请参见 doc/p2p-bad-ports.md 。</translation>
</message>
<message>
+ <source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
+ <translation type="unfinished">無法把皮夾版本從%i降級到%i。錢包版本未改變。</translation>
+ </message>
+ <message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
+ <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">無法在不支援「分割前的金鑰池」(pre split keypool)的情況下把「非分割HD錢包」(non HD split wallet)從版本%i升级到%i。請使用版本號%i,或壓根不要指定版本號。</translation>
+ </message>
+ <message>
<source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
<translation type="unfinished">%s的磁盘空间可能无法容纳区块文件。大约要在这个目录中储存 %uGB 的数据。</translation>
</message>
<message>
+ <source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
+ <translation type="unfinished">在MIT协议下分发,参见附带的 %s 或 %s 文件</translation>
+ </message>
+ <message>
<source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
<translation type="unfinished">加载钱包时出错。需要下载区块才能加载钱包,而且在使用assumeutxo快照时,下载区块是不按顺序的,这个时候软件不支持加载钱包。在节点同步至高度%s之后就应该可以加载钱包了。</translation>
</message>
@@ -1128,20 +3889,120 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">读取%s出错!交易数据可能丢失或有误。重新扫描钱包中。</translation>
</message>
<message>
+ <source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
+ <translation type="unfinished">錯誤: 轉儲文件格式不正確。 得到是"%s",而預期本應得到的是 "format"。</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
+ <translation type="unfinished">錯誤: 轉儲文件版本不支援。 這個版本的 bitcoin-wallet 只支援版本為 1 的轉儲檔案。 得到的轉儲文件版本是%s</translation>
+ </message>
+ <message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">错误: 旧式钱包只支持 "legacy", "p2sh-segwit", 和 "bech32" 这三种地址类型</translation>
+ </message>
+ <message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>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>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
+ <source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 createfromdump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
+ <source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供錢包格式。 要使用 createfromdump ,必須提供 -format=&lt;format&gt;</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">区块索引数据库含有历史遗留的 'txindex' 。可以运行完整的 -reindex 来清理被占用的磁盘空间;也可以忽略这个错误。这个错误消息将不会再次显示。</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation type="unfinished">修剪:上次同步钱包的位置已经超出(落后于)现有修剪后数据的范围。你需要进行-reindex(对于已经启用修剪节点,就需要重新下载整个区块链)</translation>
+ </message>
+ <message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">重命名 '%s' -&gt; '%s' 失败。您需要手动移走或删除无效的快照目录 %s来解决这个问题,不然的话您就会在下一次启动时遇到相同的错误。</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
+ <translation type="unfinished">SQLiteDatabase: SQLite錢包schema版本%d未知。 只支持%d版本</translation>
+ </message>
+ <message>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation type="unfinished">区块数据库包含未来的交易,这可能是由本机的日期时间错误引起。若确认本机日期时间正确,请重新建立区块数据库。</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation type="unfinished">这笔交易在扣除手续费后的金额太小,以至于无法送出</translation>
+ </message>
+ <message>
+ <source>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>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
+ <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
+ <translation type="unfinished">这是测试用的预发布版本 - 请谨慎使用 - 不要用来挖矿,或者在正式商用环境下使用</translation>
+ </message>
+ <message>
+ <source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
+ <translation type="unfinished">为了在常规选币过程中优先考虑避免“只花出一个地址上的一部分币”(partial spend)这种情况,您最多还需要(在常规手续费之外)付出的交易手续费。</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you may discard if change is smaller than dust at this level</source>
+ <translation type="unfinished">找零低于当前粉尘阈值时会被舍弃,并计入手续费,这些交易手续费就是在这种情况下产生的。</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation type="unfinished">不能估计手续费时,你会付出这个手续费金额。</translation>
+ </message>
+ <message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation type="unfinished">网络版本字符串的总长度 (%i) 超过最大长度 (%i) 了。请减少 uacomment 参数的数目或长度。</translation>
+ </message>
+ <message>
+ <source>Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
+ <translation type="unfinished">无法重放区块。你需要先用-reindex-chainstate参数来重建数据库。</translation>
+ </message>
+ <message>
+ <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
+ <translation type="unfinished">提供了未知的錢包格式 "%s" 。請使用 "bdb" 或 "sqlite" 中的一種。</translation>
+ </message>
+ <message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">不支持的类别限定日志等级 %1$s=%2$s 。 预期参数 %1$s=&lt;category&gt;:&lt;loglevel&gt;。 有效的类别: %3$s 。有效的日志等级: %4$s 。</translation>
</message>
<message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
@@ -1152,32 +4013,60 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">钱包创建成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。</translation>
</message>
<message>
- <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <translation type="unfinished">在 -dnsseed 被设为 false 时无法将 -forcednsseed 设为 true 。</translation>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">钱包加载成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。可以使用 migratewallet 命令将旧式钱包迁移至输出描述符钱包。</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">无法完成由之前版本启动的 -txindex 升级。请用之前的版本重新启动,或者进行一次完整的 -reindex 。</translation>
+ <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
+ <translation type="unfinished">警告: 轉儲文件的錢包格式 "%s" 與命令列指定的格式 "%s" 不符。</translation>
</message>
<message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上以供诊断问题的原因。</translation>
+ <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
+ <translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
- <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
- <translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
+ <source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
+ <translation type="unfinished">需要驗證高度在%d之後的區塊見證數據。 請使用 -reindex 重新啟動。</translation>
+ </message>
+ <message>
+ <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
+ <translation type="unfinished">您需要使用 -reindex 重新构建数据库以回到未修剪模式。这将重新下载整个区块链</translation>
+ </message>
+ <message>
+ <source>%s is set very high!</source>
+ <translation type="unfinished">%s非常高!</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -blockfilterindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 blockfilterindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation type="unfinished">-maxmempool 最小为%d MB</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -coinstatsindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 coinstatsindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation type="unfinished">无法解析 - %s 地址: '%s'</translation>
+ </message>
+ <message>
+ <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
+ <translation type="unfinished">在 -dnsseed 被设为 false 时无法将 -forcednsseed 设为 true 。</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -txindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 txindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
+ <source>Cannot set -peerblockfilters without -blockfilterindex.</source>
+ <translation type="unfinished">没有启用-blockfilterindex,就不能启用-peerblockfilters。</translation>
+ </message>
+ <message>
+ <source>Cannot write to data directory '%s'; check permissions.</source>
+ <translation type="unfinished">不能写入到数据目录'%s';请检查文件权限。</translation>
+ </message>
+ <message>
+ <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
</message>
<message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
@@ -1188,6 +4077,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">加载%s时出错: 编译时未启用外部签名器支持,却仍然试图加载外部签名器钱包</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">读取 %s 时出错! 所有密钥都被正确读取,但交易数据或地址元数据可能缺失或有误。</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">错误:钱包中的地址簿数据无法被识别为属于迁移后的钱包</translation>
</message>
@@ -1200,6 +4093,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">错误:钱包中的交易%s无法被识别为属于迁移后的钱包</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">计算追加手续费失败,因为未确认UTXO依赖了大量未确认交易的簇集。</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">无法重命名无效的 peers.dat 文件。 请移动或删除它,然后重试。</translation>
</message>
@@ -1274,10 +4171,6 @@ Please try running the latest software version.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">不支持的类别限定日志等级 -loglevel=%s。预期参数 -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s。有效的类别: %s。</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -1294,28 +4187,104 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">区块验证已中断</translation>
</message>
<message>
+ <source>Config setting for %s only applied on %s network when in [%s] section.</source>
+ <translation type="unfinished">對 %s 的配置設定只對 %s 網路生效,如果它位於配置的 [%s] 章節的話</translation>
+ </message>
+ <message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation type="unfinished">你想现在就重建区块数据库吗?</translation>
+ </message>
+ <message>
+ <source>Done loading</source>
+ <translation type="unfinished">加载完成</translation>
+ </message>
+ <message>
+ <source>Dump file %s does not exist.</source>
+ <translation type="unfinished">轉儲文件 %s 不存在</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
+ <source>Error creating %s</source>
+ <translation type="unfinished">創建%s時出錯</translation>
+ </message>
+ <message>
+ <source>Error initializing block database</source>
+ <translation type="unfinished">初始化区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
+ <source>Error loading %s</source>
+ <translation type="unfinished">载入 %s 时发生错误</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Private keys can only be disabled during creation</source>
+ <translation type="unfinished">加载 %s 时出错:只能在创建钱包时禁用私钥。</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation type="unfinished">%s 加载出错:钱包损坏</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation type="unfinished">%s 加载错误:请升级到最新版 %s</translation>
+ </message>
+ <message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading from database, shutting down.</source>
+ <translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">错误:创建新仅观察钱包失败</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
+ <source>Error: Failed to create new watchonly wallet</source>
+ <translation type="unfinished">错误:创建新仅观察钱包失败</translation>
</message>
<message>
<source>Error: This wallet already uses SQLite</source>
@@ -1338,10 +4307,42 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
<message>
+ <source>Error: Unable to write record to new wallet</source>
+ <translation type="unfinished">錯誤: 無法寫入記錄到新錢包</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">无法启动索引,关闭中...</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Input not found or already spent</source>
<translation type="unfinished">找不到交易項,或可能已經花掉了</translation>
</message>
@@ -1394,6 +4395,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">指定的数据目录 "%s" 不存在。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction change output index out of range</source>
<translation type="unfinished">交易尋找零輸出項超出範圍</translation>
</message>
@@ -1418,8 +4423,24 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">在迁移前无法卸载钱包</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">不支持的全局日志等级 -loglevel=%s 。有效的数值:%s 。</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
+ </message>
+ <message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
</message>
<message>
<source>Settings file could not be read</source>
diff --git a/src/qt/locale/bitcoin_zh_CN.ts b/src/qt/locale/bitcoin_zh_CN.ts
index 1e82870c56..21f57a8f6d 100644
--- a/src/qt/locale/bitcoin_zh_CN.ts
+++ b/src/qt/locale/bitcoin_zh_CN.ts
@@ -3,11 +3,11 @@
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
- <translation type="unfinished">右键单击来编辑地址或者标签</translation>
+ <translation type="unfinished">鼠标右击编辑地址或标签</translation>
</message>
<message>
<source>Create a new address</source>
- <translation type="unfinished">创建新地址</translation>
+ <translation type="unfinished">创建一个新地址</translation>
</message>
<message>
<source>&amp;New</source>
@@ -27,15 +27,15 @@
</message>
<message>
<source>Delete the currently selected address from the list</source>
- <translation type="unfinished">从列表中删除当前已选地址</translation>
+ <translation type="unfinished">从列表中删除选中的地址</translation>
</message>
<message>
<source>Enter address or label to search</source>
- <translation type="unfinished">输入要搜索的地址或标签</translation>
+ <translation type="unfinished">输入地址或标签来搜索</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">将当前选项卡中的数据导出到文件</translation>
+ <translation type="unfinished">将当前标签页数据导出到文件</translation>
</message>
<message>
<source>&amp;Export</source>
@@ -47,49 +47,41 @@
</message>
<message>
<source>Choose the address to send coins to</source>
- <translation type="unfinished">选择收款人地址</translation>
+ <translation type="unfinished">选择要发币给哪些地址</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
- <translation type="unfinished">选择接收比特币地址</translation>
+ <translation type="unfinished">选择要用哪些地址收币</translation>
</message>
<message>
<source>C&amp;hoose</source>
<translation type="unfinished">选择(&amp;H)</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">发送地址</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">接收地址</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
- <translation type="unfinished">这些是你的比特币支付地址。在发送之前,一定要核对金额和接收地址。</translation>
+ <translation type="unfinished">您可以给这些比特币地址付款。在付款之前,务必要检查金额和收款地址是否正确。</translation>
</message>
<message>
<source>These are your Bitcoin addresses for receiving payments. Use the 'Create new receiving address' button in the receive tab to create new addresses.
Signing is only possible with addresses of the type 'legacy'.</source>
- <translation type="unfinished">你将使用下列比特币地址接受付款。选取收款选项卡中 “产生新收款地址” 按钮来生成新地址。
-签名只能使用“传统”类型的地址。</translation>
+ <translation type="unfinished">这是您用来收款的比特币地址。使用“接收”标签页中的“创建新收款地址”按钮来创建新的收款地址。
+只有“旧式(legacy)”类型的地址支持签名。</translation>
</message>
<message>
<source>&amp;Copy Address</source>
- <translation type="unfinished">&amp;复制地址</translation>
+ <translation type="unfinished">复制地址(&amp;C)</translation>
</message>
<message>
<source>Copy &amp;Label</source>
- <translation type="unfinished">复制 &amp;标签</translation>
+ <translation type="unfinished">复制标签(&amp;L)</translation>
</message>
<message>
<source>&amp;Edit</source>
- <translation type="unfinished">&amp;编辑</translation>
+ <translation type="unfinished">编辑(&amp;E)</translation>
</message>
<message>
<source>Export Address List</source>
- <translation type="unfinished">出口地址列表</translation>
+ <translation type="unfinished">导出地址列表</translation>
</message>
<message>
<source>Comma separated file</source>
@@ -99,7 +91,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>There was an error trying to save the address list to %1. Please try again.</source>
<extracomment>An error message. %1 is a stand-in argument for the name of the file we attempted to save to.</extracomment>
- <translation type="unfinished">试图将地址列表保存到 %1时出错,请再试一次。</translation>
+ <translation type="unfinished">尝试保存地址列表到 %1 时发生错误。请再试一次。</translation>
+ </message>
+ <message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">付款地址 - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">收款地址 - %1</translation>
</message>
<message>
<source>Exporting Failed</source>
@@ -133,7 +133,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>New passphrase</source>
- <translation type="unfinished">新的密码</translation>
+ <translation type="unfinished">新密码</translation>
</message>
<message>
<source>Repeat new passphrase</source>
@@ -149,11 +149,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>This operation needs your wallet passphrase to unlock the wallet.</source>
- <translation type="unfinished">该操作需要您的钱包密码来解锁钱包。</translation>
+ <translation type="unfinished">这个操作需要你的钱包密码来解锁钱包。</translation>
</message>
<message>
<source>Unlock wallet</source>
- <translation type="unfinished">打开钱包</translation>
+ <translation type="unfinished">解锁钱包</translation>
</message>
<message>
<source>Change passphrase</source>
@@ -165,43 +165,43 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Warning: If you encrypt your wallet and lose your passphrase, you will &lt;b&gt;LOSE ALL OF YOUR BITCOINS&lt;/b&gt;!</source>
- <translation type="unfinished">注意: 如果你忘记了你的钱包,你将会丢失你的&lt;b&gt;密码,并且会丢失你的&lt;/b&gt;比特币。</translation>
+ <translation type="unfinished">警告: 如果把钱包加密后又忘记密码,你就会从此&lt;b&gt;失去其中所有的比特币了&lt;/b&gt;!</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
- <translation type="unfinished">您确定要加密您的钱包吗?</translation>
+ <translation type="unfinished">你确定要把钱包加密吗?</translation>
</message>
<message>
<source>Wallet encrypted</source>
- <translation type="unfinished">钱包加密</translation>
+ <translation type="unfinished">钱包已加密</translation>
</message>
<message>
<source>Enter the new passphrase for the wallet.&lt;br/&gt;Please use a passphrase of &lt;b&gt;ten or more random characters&lt;/b&gt;, or &lt;b&gt;eight or more words&lt;/b&gt;.</source>
- <translation type="unfinished">输入钱包的新密码,&lt;br/&gt;请使用&lt;b&gt;10个或以上随机字符的密码&lt;/b&gt;,&lt;b&gt;或者8个以上的复杂单词&lt;/b&gt;。</translation>
+ <translation type="unfinished">为此钱包输入新密码。&lt;br/&gt;请使用由&lt;b&gt;十个或更多的随机字符&lt;/b&gt;,或者&lt;b&gt;八个或更多单词&lt;/b&gt;组成的密码。</translation>
</message>
<message>
<source>Enter the old passphrase and new passphrase for the wallet.</source>
- <translation type="unfinished">输入钱包的旧密码和新密码。</translation>
+ <translation type="unfinished">输入此钱包的旧密码和新密码。</translation>
</message>
<message>
<source>Remember that encrypting your wallet cannot fully protect your bitcoins from being stolen by malware infecting your computer.</source>
- <translation type="unfinished">注意,加密你的钱包并不能完全保护你的比特币免受感染你电脑的恶意软件的窃取。</translation>
+ <translation type="unfinished">请注意,当您的计算机感染恶意软件时,加密钱包并不能完全规避您的比特币被偷窃的可能。</translation>
</message>
<message>
<source>Wallet to be encrypted</source>
- <translation type="unfinished">加密钱包</translation>
+ <translation type="unfinished">要加密的钱包</translation>
</message>
<message>
<source>Your wallet is about to be encrypted. </source>
- <translation type="unfinished">你的钱包要被加密了。</translation>
+ <translation type="unfinished">您的钱包将要被加密。</translation>
</message>
<message>
<source>Your wallet is now encrypted. </source>
- <translation type="unfinished">你的钱包现在被加密了。</translation>
+ <translation type="unfinished">您的钱包现在已被加密。</translation>
</message>
<message>
<source>IMPORTANT: Any previous backups you have made of your wallet file should be replaced with the newly generated, encrypted wallet file. For security reasons, previous backups of the unencrypted wallet file will become useless as soon as you start using the new, encrypted wallet.</source>
- <translation type="unfinished">重要提示:您之前对钱包文件所做的任何备份都应该替换为新生成的加密钱包文件。出于安全原因,一旦开始使用新的加密钱包,以前未加密钱包文件的备份就会失效。</translation>
+ <translation type="unfinished">重要: 请用新生成的、已加密的钱包备份文件取代你之前留的钱包文件备份。出于安全方面的原因,一旦你开始使用新的已加密钱包,旧的未加密钱包文件备份就失效了。</translation>
</message>
<message>
<source>Wallet encryption failed</source>
@@ -209,19 +209,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet encryption failed due to an internal error. Your wallet was not encrypted.</source>
- <translation type="unfinished">由于内部错误,钱包加密失败。你的钱包没有加密成功。</translation>
+ <translation type="unfinished">因为内部错误导致钱包加密失败。你的钱包还是没加密。</translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
- <translation type="unfinished">提供的密码不匹配。</translation>
+ <translation type="unfinished">提供的密码不一致。</translation>
</message>
<message>
<source>Wallet unlock failed</source>
- <translation type="unfinished">钱包打开失败</translation>
+ <translation type="unfinished">钱包解锁失败</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption was incorrect.</source>
- <translation type="unfinished">钱包解密输入的密码不正确。</translation>
+ <translation type="unfinished">输入的钱包解锁密码不正确。</translation>
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
@@ -229,7 +229,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
- <translation type="unfinished">钱包密码更改成功。</translation>
+ <translation type="unfinished">钱包密码修改成功。</translation>
</message>
<message>
<source>Passphrase change failed</source>
@@ -241,18 +241,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
- <translation type="unfinished">警告:大写锁定键已打开!</translation>
+ <translation type="unfinished">警告: 大写字母锁定已开启!</translation>
</message>
</context>
<context>
<name>BanTableModel</name>
<message>
<source>IP/Netmask</source>
- <translation type="unfinished">IP/子网掩码</translation>
+ <translation type="unfinished">IP/网络掩码</translation>
</message>
<message>
<source>Banned Until</source>
- <translation type="unfinished">被禁止直到</translation>
+ <translation type="unfinished">在此之前保持封禁:</translation>
</message>
</context>
<context>
@@ -263,11 +263,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Runaway exception</source>
- <translation type="unfinished">失控的例外</translation>
+ <translation type="unfinished">未捕获的异常</translation>
</message>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
- <translation type="unfinished">发生了一个致命错误。%1不能再安全地继续并将退出。</translation>
+ <translation type="unfinished">发生致命错误。%1 已经无法继续安全运行并即将退出。</translation>
</message>
<message>
<source>Internal error</source>
@@ -275,7 +275,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>An internal error occurred. %1 will attempt to continue safely. This is an unexpected bug which can be reported as described below.</source>
- <translation type="unfinished">发生内部错误。%1将尝试安全继续。这是一个意外的错误,可以报告如下所述。</translation>
+ <translation type="unfinished">发生了一个内部错误。%1将会尝试安全地继续运行。关于这个未知的错误我们有以下的描述信息用于参考。</translation>
</message>
</context>
<context>
@@ -283,12 +283,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Do you want to reset settings to default values, or to abort without making changes?</source>
<extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
- <translation type="unfinished">要将设置重置为默认值,还是不做任何更改就中止?</translation>
+ <translation type="unfinished">要将设置重置为默认值,还是要放弃更改并中止?</translation>
</message>
<message>
<source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
<extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
- <translation type="unfinished">发生了一个致命错误。检查设置文件是否可写,或者尝试使用-nosettings运行。</translation>
+ <translation type="unfinished">出现致命错误。请检查设置文件是否可写,或者尝试带 -nosettings 参数运行。</translation>
</message>
<message>
<source>Error: %1</source>
@@ -296,7 +296,98 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
- <translation type="unfinished">%1尚未安全退出…</translation>
+ <translation type="unfinished">%1 还没有安全退出...</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">未知</translation>
+ </message>
+ <message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">金额</translation>
+ </message>
+ <message>
+ <source>Enter a Bitcoin address (e.g. %1)</source>
+ <translation type="unfinished">请输入一个比特币地址 (例如 %1)</translation>
+ </message>
+ <message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
+ <translation type="unfinished">传入</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">传出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
+ <source>Block Relay</source>
+ <extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">区块转发</translation>
+ </message>
+ <message>
+ <source>Manual</source>
+ <extracomment>Peer connection type established manually through one of several methods.</extracomment>
+ <translation type="unfinished">手册</translation>
+ </message>
+ <message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
+ <source>%1 d</source>
+ <translation type="unfinished">%1 天</translation>
+ </message>
+ <message>
+ <source>%1 h</source>
+ <translation type="unfinished">%1 小时</translation>
+ </message>
+ <message>
+ <source>%1 m</source>
+ <translation type="unfinished">%1 分钟</translation>
+ </message>
+ <message>
+ <source>%1 s</source>
+ <translation type="unfinished">%1 秒</translation>
+ </message>
+ <message>
+ <source>None</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>N/A</source>
+ <translation type="unfinished">不可用</translation>
+ </message>
+ <message>
+ <source>%1 ms</source>
+ <translation type="unfinished">%1 毫秒</translation>
</message>
<message numerus="yes">
<source>%n second(s)</source>
@@ -328,12 +419,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<numerusform>%n 周</numerusform>
</translation>
</message>
+ <message>
+ <source>%1 and %2</source>
+ <translation type="unfinished">%1 和 %2</translation>
+ </message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
<numerusform>%n年</numerusform>
</translation>
</message>
+ <message>
+ <source>%1 B</source>
+ <translation type="unfinished">%1 字节</translation>
+ </message>
</context>
<context>
<name>BitcoinGUI</name>
@@ -370,36 +469,149 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">显示 %1 的相关信息</translation>
</message>
<message>
+ <source>About &amp;Qt</source>
+ <translation type="unfinished">关于 &amp;Qt</translation>
+ </message>
+ <message>
+ <source>Show information about Qt</source>
+ <translation type="unfinished">显示 Qt 相关信息</translation>
+ </message>
+ <message>
+ <source>Modify configuration options for %1</source>
+ <translation type="unfinished">修改%1的配置选项</translation>
+ </message>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">创建一个新的钱包</translation>
+ </message>
+ <message>
<source>&amp;Minimize</source>
- <translation type="unfinished">最小化</translation>
+ <translation type="unfinished">最小化(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
+ <source>Network activity disabled.</source>
+ <extracomment>A substring of the tooltip.</extracomment>
+ <translation type="unfinished">网络活动已禁用。</translation>
+ </message>
+ <message>
+ <source>Proxy is &lt;b&gt;enabled&lt;/b&gt;: %1</source>
+ <translation type="unfinished">代理服务器已&lt;b&gt;启用&lt;/b&gt;: %1</translation>
+ </message>
+ <message>
+ <source>Send coins to a Bitcoin address</source>
+ <translation type="unfinished">向一个比特币地址发币</translation>
+ </message>
+ <message>
+ <source>Backup wallet to another location</source>
+ <translation type="unfinished">备份钱包到其他位置</translation>
+ </message>
+ <message>
+ <source>Change the passphrase used for wallet encryption</source>
+ <translation type="unfinished">修改钱包加密密码</translation>
+ </message>
+ <message>
+ <source>&amp;Send</source>
+ <translation type="unfinished">发送(&amp;S)</translation>
+ </message>
+ <message>
+ <source>&amp;Receive</source>
+ <translation type="unfinished">接收(&amp;R)</translation>
+ </message>
+ <message>
+ <source>&amp;Options…</source>
+ <translation type="unfinished">选项(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Encrypt Wallet…</source>
+ <translation type="unfinished">加密钱包(&amp;E)</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
<translation type="unfinished">把你钱包中的私钥加密</translation>
</message>
<message>
+ <source>&amp;Backup Wallet…</source>
+ <translation type="unfinished">备份钱包(&amp;B)</translation>
+ </message>
+ <message>
+ <source>&amp;Change Passphrase…</source>
+ <translation type="unfinished">修改密码(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Sign &amp;message…</source>
+ <translation type="unfinished">签名消息(&amp;M)</translation>
+ </message>
+ <message>
<source>Sign messages with your Bitcoin addresses to prove you own them</source>
<translation type="unfinished">用比特币地址关联的私钥为消息签名,以证明您拥有这个比特币地址</translation>
</message>
<message>
+ <source>&amp;Verify message…</source>
+ <translation type="unfinished">验证消息(&amp;V)</translation>
+ </message>
+ <message>
<source>Verify messages to ensure they were signed with specified Bitcoin addresses</source>
<translation type="unfinished">校验消息,确保该消息是由指定的比特币地址所有者签名的</translation>
</message>
<message>
+ <source>&amp;Load PSBT from file…</source>
+ <translation type="unfinished">从文件加载PSBT(&amp;L)...</translation>
+ </message>
+ <message>
+ <source>Open &amp;URI…</source>
+ <translation type="unfinished">打开&amp;URI...</translation>
+ </message>
+ <message>
+ <source>Close Wallet…</source>
+ <translation type="unfinished">关闭钱包...</translation>
+ </message>
+ <message>
+ <source>Create Wallet…</source>
+ <translation type="unfinished">创建钱包...</translation>
+ </message>
+ <message>
+ <source>Close All Wallets…</source>
+ <translation type="unfinished">关闭所有钱包...</translation>
+ </message>
+ <message>
<source>&amp;File</source>
- <translation type="unfinished">&amp;文件</translation>
+ <translation type="unfinished">文件(&amp;F)</translation>
</message>
<message>
<source>&amp;Settings</source>
- <translation type="unfinished">&amp;设置</translation>
+ <translation type="unfinished">设置(&amp;S)</translation>
</message>
<message>
<source>&amp;Help</source>
- <translation type="unfinished">&amp;帮助</translation>
+ <translation type="unfinished">帮助(&amp;H)</translation>
</message>
<message>
<source>Tabs toolbar</source>
- <translation type="unfinished">标签工具栏</translation>
+ <translation type="unfinished">标签页工具栏</translation>
+ </message>
+ <message>
+ <source>Syncing Headers (%1%)…</source>
+ <translation type="unfinished">同步区块头 (%1%)…</translation>
+ </message>
+ <message>
+ <source>Synchronizing with network…</source>
+ <translation type="unfinished">与网络同步...</translation>
+ </message>
+ <message>
+ <source>Indexing blocks on disk…</source>
+ <translation type="unfinished">对磁盘上的区块进行索引...</translation>
+ </message>
+ <message>
+ <source>Processing blocks on disk…</source>
+ <translation type="unfinished">处理磁盘上的区块...</translation>
+ </message>
+ <message>
+ <source>Connecting to peers…</source>
+ <translation type="unfinished">连到同行...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -420,7 +632,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
- <numerusform>已處裡%n個區塊的交易紀錄</numerusform>
+ <numerusform>已处理%n个区块的交易历史。</numerusform>
</translation>
</message>
<message>
@@ -428,6 +640,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">落后 %1</translation>
</message>
<message>
+ <source>Catching up…</source>
+ <translation type="unfinished">赶上...</translation>
+ </message>
+ <message>
<source>Last received block was generated %1 ago.</source>
<translation type="unfinished">最新接收到的区块是在%1之前生成的。</translation>
</message>
@@ -452,28 +668,36 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">已是最新</translation>
</message>
<message>
+ <source>Load Partially Signed Bitcoin Transaction</source>
+ <translation type="unfinished">加载部分签名比特币交易(PSBT)</translation>
+ </message>
+ <message>
<source>Load PSBT from &amp;clipboard…</source>
- <translation type="unfinished">從剪貼簿載入PSBT</translation>
+ <translation type="unfinished">从剪贴板加载PSBT(&amp;C)...</translation>
+ </message>
+ <message>
+ <source>Load Partially Signed Bitcoin Transaction from clipboard</source>
+ <translation type="unfinished">从剪贴板中加载部分签名比特币交易(PSBT)</translation>
</message>
<message>
<source>Node window</source>
- <translation type="unfinished">结点窗口</translation>
+ <translation type="unfinished">节点窗口</translation>
</message>
<message>
<source>Open node debugging and diagnostic console</source>
- <translation type="unfinished">打开结点的调试和诊断控制台</translation>
+ <translation type="unfinished">打开节点调试与诊断控制台</translation>
</message>
<message>
<source>&amp;Sending addresses</source>
- <translation type="unfinished">&amp;发送地址</translation>
+ <translation type="unfinished">付款地址(&amp;S)</translation>
</message>
<message>
<source>&amp;Receiving addresses</source>
- <translation type="unfinished">&amp;接受地址</translation>
+ <translation type="unfinished">收款地址(&amp;R)</translation>
</message>
<message>
<source>Open a bitcoin: URI</source>
- <translation type="unfinished">打开比特币: URI</translation>
+ <translation type="unfinished">打开bitcoin:开头的URI</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -485,21 +709,41 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Close wallet</source>
- <translation type="unfinished">关闭钱包</translation>
+ <translation type="unfinished">卸载钱包</translation>
</message>
<message>
<source>Restore Wallet…</source>
<extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
- <translation type="unfinished">恢復錢包...</translation>
+ <translation type="unfinished">恢复钱包...</translation>
</message>
<message>
<source>Restore a wallet from a backup file</source>
<extracomment>Status tip for Restore Wallet menu item</extracomment>
- <translation type="unfinished">從備份檔案中恢復錢包</translation>
+ <translation type="unfinished">从备份文件恢复钱包</translation>
+ </message>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">关闭所有钱包</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">迁移一个钱包</translation>
</message>
<message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示%1帮助消息以获得可能包含Bitcoin命令行选项的列表</translation>
+ <translation type="unfinished">显示 %1 帮助信息,获取可用命令行选项列表</translation>
+ </message>
+ <message>
+ <source>&amp;Mask values</source>
+ <translation type="unfinished">遮住数值(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Mask the values in the Overview tab</source>
+ <translation type="unfinished">在“概况”标签页中不明文显示数值、只显示掩码</translation>
</message>
<message>
<source>default wallet</source>
@@ -507,21 +751,31 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>No wallets available</source>
- <translation type="unfinished">无可用钱包</translation>
+ <translation type="unfinished">没有可用的钱包</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">钱包数据</translation>
</message>
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
- <translation type="unfinished">載入錢包備份</translation>
+ <translation type="unfinished">加载钱包备份</translation>
</message>
<message>
<source>Restore Wallet</source>
<extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
- <translation type="unfinished">恢復錢包</translation>
+ <translation type="unfinished">恢复钱包</translation>
+ </message>
+ <message>
+ <source>Wallet Name</source>
+ <extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
+ <translation type="unfinished">钱包名称</translation>
</message>
<message>
<source>&amp;Window</source>
- <translation type="unfinished">&amp;窗口</translation>
+ <translation type="unfinished">窗口(&amp;W)</translation>
</message>
<message>
<source>Zoom</source>
@@ -541,129 +795,503 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>S&amp;how</source>
- <translation type="unfinished">&amp;顯示</translation>
+ <translation type="unfinished">显示(&amp;H)</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
- <numerusform> %n 与比特币网络接。</numerusform>
+ <numerusform>%n 条到比特币网络的活动连接</numerusform>
</translation>
</message>
<message>
+ <source>Click for more actions.</source>
+ <extracomment>A substring of the tooltip. "More actions" are available via the context menu.</extracomment>
+ <translation type="unfinished">点击查看更多操作。</translation>
+ </message>
+ <message>
+ <source>Show Peers tab</source>
+ <extracomment>A context menu item. The "Peers tab" is an element of the "Node window".</extracomment>
+ <translation type="unfinished">显示节点标签</translation>
+ </message>
+ <message>
+ <source>Disable network activity</source>
+ <extracomment>A context menu item.</extracomment>
+ <translation type="unfinished">禁用网络活动</translation>
+ </message>
+ <message>
+ <source>Enable network activity</source>
+ <extracomment>A context menu item. The network activity was disabled previously.</extracomment>
+ <translation type="unfinished">启用网络活动</translation>
+ </message>
+ <message>
<source>Pre-syncing Headers (%1%)…</source>
- <translation type="unfinished">預先同步標頭(%1%)</translation>
+ <translation type="unfinished">预同步区块头 (%1%)…</translation>
+ </message>
+ <message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">创建钱包时出错</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">无法创建新钱包,软件编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
</message>
<message>
<source>Error: %1</source>
<translation type="unfinished">错误: %1</translation>
</message>
- </context>
+ <message>
+ <source>Warning: %1</source>
+ <translation type="unfinished">警告: %1</translation>
+ </message>
+ <message>
+ <source>Date: %1
+</source>
+ <translation type="unfinished">日期: %1
+</translation>
+ </message>
+ <message>
+ <source>Amount: %1
+</source>
+ <translation type="unfinished">金额: %1
+</translation>
+ </message>
+ <message>
+ <source>Wallet: %1
+</source>
+ <translation type="unfinished">钱包: %1
+</translation>
+ </message>
+ <message>
+ <source>Type: %1
+</source>
+ <translation type="unfinished">类型: %1
+</translation>
+ </message>
+ <message>
+ <source>Label: %1
+</source>
+ <translation type="unfinished">标签: %1
+</translation>
+ </message>
+ <message>
+ <source>Address: %1
+</source>
+ <translation type="unfinished">地址: %1
+</translation>
+ </message>
+ <message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
+ <source>Incoming transaction</source>
+ <translation type="unfinished">流入交易</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;enabled&lt;/b&gt;</source>
+ <translation type="unfinished">HD密钥生成&lt;b&gt;启用&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>HD key generation is &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">HD密钥生成&lt;b&gt;禁用&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Private key &lt;b&gt;disabled&lt;/b&gt;</source>
+ <translation type="unfinished">私钥&lt;b&gt;禁用&lt;/b&gt;</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;unlocked&lt;/b&gt;</source>
+ <translation type="unfinished">钱包已被&lt;b&gt;加密&lt;/b&gt;,当前为&lt;b&gt;解锁&lt;/b&gt;状态</translation>
+ </message>
+ <message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">钱包已被&lt;b&gt;加密&lt;/b&gt;,当前为&lt;b&gt;锁定&lt;/b&gt;状态</translation>
+ </message>
+ <message>
+ <source>Original message:</source>
+ <translation type="unfinished">原消息:</translation>
+ </message>
+</context>
+<context>
+ <name>UnitDisplayStatusBarControl</name>
+ <message>
+ <source>Unit to show amounts in. Click to select another unit.</source>
+ <translation type="unfinished">金额单位。单击选择别的单位。</translation>
+ </message>
+</context>
<context>
<name>CoinControlDialog</name>
<message>
+ <source>Coin Selection</source>
+ <translation type="unfinished">手动选币</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">字节数:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">加上交易费用后:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
+ <source>Tree mode</source>
+ <translation type="unfinished">树状模式</translation>
+ </message>
+ <message>
+ <source>List mode</source>
+ <translation type="unfinished">列表模式</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">金额</translation>
+ </message>
+ <message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
+ <source>Received with address</source>
+ <translation type="unfinished">收款地址</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Confirmations</source>
+ <translation type="unfinished">确认</translation>
+ </message>
+ <message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
<message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">复制地址(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">复制标签(&amp;L)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">复制金额(&amp;A)</translation>
+ </message>
+ <message>
<source>Copy transaction &amp;ID and output index</source>
- <translation type="unfinished">複製交易&amp;ID與輸出序號</translation>
+ <translation type="unfinished">复制交易&amp;ID和输出序号</translation>
+ </message>
+ <message>
+ <source>L&amp;ock unspent</source>
+ <translation type="unfinished">锁定未花费(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">复制数目</translation>
</message>
<message>
<source>Copy fee</source>
<translation type="unfinished">复制手续费</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">是</translation>
+ <source>Copy after fee</source>
+ <translation type="unfinished">复制含交易费的金额</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation type="unfinished">复制字节数</translation>
+ </message>
+ <message>
+ <source>Copy change</source>
+ <translation type="unfinished">复制找零金额</translation>
</message>
<message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">当任何一个收款金额小于目前的粉尘金额阈值时,文字会变红色。</translation>
+ <source>(%1 locked)</source>
+ <translation type="unfinished">(%1已锁定)</translation>
+ </message>
+ <message>
+ <source>Can vary +/- %1 satoshi(s) per input.</source>
+ <translation type="unfinished">每个输入可能有 +/- %1 聪 (satoshi) 的误差。</translation>
</message>
<message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
- </context>
+ <message>
+ <source>change from %1 (%2)</source>
+ <translation type="unfinished">来自 %1 的找零 (%2)</translation>
+ </message>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
+ <source>Create Wallet</source>
+ <extracomment>Title of window indicating the progress of creation of a new wallet.</extracomment>
+ <translation type="unfinished">创建钱包</translation>
+ </message>
+ <message>
<source>Creating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the create wallet progress window which indicates to the user which wallet is currently being created.</extracomment>
- <translation type="unfinished">正在创建钱包&lt;b&gt;%1&lt;/b&gt;...</translation>
+ <translation type="unfinished">创建钱包&lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>Create wallet failed</source>
+ <translation type="unfinished">创建钱包失败</translation>
+ </message>
+ <message>
+ <source>Create wallet warning</source>
+ <translation type="unfinished">创建钱包警告</translation>
+ </message>
+ <message>
+ <source>Can't list signers</source>
+ <translation type="unfinished">无法列出签名器</translation>
</message>
<message>
<source>Too many external signers found</source>
- <translation type="unfinished">偵測到的外接簽名器過多</translation>
+ <translation type="unfinished">找到的外部签名器太多</translation>
+ </message>
+</context>
+<context>
+ <name>LoadWalletsActivity</name>
+ <message>
+ <source>Load Wallets</source>
+ <extracomment>Title of progress window which is displayed when wallets are being loaded.</extracomment>
+ <translation type="unfinished">加载钱包</translation>
+ </message>
+ <message>
+ <source>Loading wallets…</source>
+ <extracomment>Descriptive text of the load wallets progress window which indicates to the user that wallets are currently being loaded.</extracomment>
+ <translation type="unfinished">加载钱包...</translation>
+ </message>
+</context>
+<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您确定想要迁移钱包&lt;i&gt;%1&lt;/i&gt;吗?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">迁移钱包将会把这个钱包转换成一个或多个输出描述符钱包。将会需要创建一个新的钱包备份。
+如果这个钱包包含仅观察脚本,将会创建包含那些仅观察脚本的新钱包。
+如果这个钱包包含可解但又未被监视的脚本,将会创建一个不同的钱包以包含那些脚本。
+
+迁移过程开始前将会创建一个钱包备份。备份文件将会被命名为 &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak 然后被保存在该钱包所在目录下。如果迁移过程出错,可以使用“恢复钱包”功能恢复备份。</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">迁移钱包 &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">迁移失败</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">迁移成功</translation>
</message>
</context>
<context>
<name>OpenWalletActivity</name>
<message>
+ <source>Open wallet failed</source>
+ <translation type="unfinished">打开钱包失败</translation>
+ </message>
+ <message>
+ <source>Open wallet warning</source>
+ <translation type="unfinished">打开钱包警告</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+ <message>
<source>Open Wallet</source>
<extracomment>Title of window indicating the progress of opening of a wallet.</extracomment>
<translation type="unfinished">打开钱包</translation>
</message>
- </context>
+ <message>
+ <source>Opening Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <extracomment>Descriptive text of the open wallet progress window which indicates to the user which wallet is currently being opened.</extracomment>
+ <translation type="unfinished">打开钱包&lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+</context>
<context>
<name>RestoreWalletActivity</name>
<message>
<source>Restore Wallet</source>
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
- <translation type="unfinished">恢復錢包</translation>
+ <translation type="unfinished">恢复钱包</translation>
</message>
<message>
<source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
<extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
- <translation type="unfinished">正在恢復錢包&lt;b&gt;%1&lt;/b&gt;...</translation>
+ <translation type="unfinished">恢复钱包&lt;b&gt;%1&lt;/b&gt;…</translation>
</message>
<message>
<source>Restore wallet failed</source>
<extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
- <translation type="unfinished">恢復錢包失敗</translation>
+ <translation type="unfinished">恢复钱包失败</translation>
</message>
<message>
<source>Restore wallet warning</source>
<extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
- <translation type="unfinished">恢復錢包警告</translation>
+ <translation type="unfinished">恢复钱包警告</translation>
</message>
<message>
<source>Restore wallet message</source>
<extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
- <translation type="unfinished">恢復錢包訊息</translation>
+ <translation type="unfinished">恢复钱包消息</translation>
</message>
</context>
<context>
<name>WalletController</name>
<message>
<source>Close wallet</source>
- <translation type="unfinished">关闭钱包</translation>
+ <translation type="unfinished">卸载钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to close the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您确定想要关闭钱包&lt;i&gt;%1&lt;/i&gt;吗?</translation>
</message>
<message>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
<translation type="unfinished">启用修剪时,如果一个钱包被卸载太久,就必须重新同步整条区块链才能再次加载它。</translation>
</message>
- </context>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">关闭所有钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">您确定想要关闭所有钱包吗?</translation>
+ </message>
+</context>
<context>
<name>CreateWalletDialog</name>
<message>
+ <source>Create Wallet</source>
+ <translation type="unfinished">创建钱包</translation>
+ </message>
+ <message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">距离创建您的新钱包只有一步之遥了!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">请指定一个名字,如果需要的话还可以启用高级选项</translation>
+ </message>
+ <message>
+ <source>Wallet Name</source>
+ <translation type="unfinished">钱包名称</translation>
+ </message>
+ <message>
+ <source>Wallet</source>
+ <translation type="unfinished">钱包</translation>
+ </message>
+ <message>
+ <source>Encrypt the wallet. The wallet will be encrypted with a passphrase of your choice.</source>
+ <translation type="unfinished">加密钱包。将会使用您指定的密码将钱包加密。</translation>
+ </message>
+ <message>
+ <source>Encrypt Wallet</source>
+ <translation type="unfinished">加密钱包</translation>
+ </message>
+ <message>
<source>Advanced Options</source>
<translation type="unfinished">进阶设定</translation>
</message>
<message>
+ <source>Disable private keys for this wallet. Wallets with private keys disabled will have no private keys and cannot have an HD seed or imported private keys. This is ideal for watch-only wallets.</source>
+ <translation type="unfinished">禁用此钱包的私钥。被禁用私钥的钱包将不会含有任何私钥,而且也不能含有HD种子或导入的私钥。作为仅观察钱包,这是比较理想的。</translation>
+ </message>
+ <message>
<source>Disable Private Keys</source>
<translation type="unfinished">禁用私钥</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">使用输出描述符进行scriptPubKey管理</translation>
+ <source>Make a blank wallet. Blank wallets do not initially have private keys or scripts. Private keys and addresses can be imported, or an HD seed can be set, at a later time.</source>
+ <translation type="unfinished">创建一个空白的钱包。空白钱包最初不含有任何私钥或脚本。可以以后再导入私钥和地址,或设置HD种子。</translation>
</message>
<message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ <source>Make Blank Wallet</source>
+ <translation type="unfinished">创建空白钱包</translation>
</message>
- </context>
+ <message>
+ <source>Use an external signing device such as a hardware wallet. Configure the external signer script in wallet preferences first.</source>
+ <translation type="unfinished">使用像是硬件钱包这样的外部签名设备。请在钱包偏好设置中先配置号外部签名器脚本。</translation>
+ </message>
+ <message>
+ <source>External signer</source>
+ <translation type="unfinished">外部签名器</translation>
+ </message>
+ <message>
+ <source>Create</source>
+ <translation type="unfinished">创建</translation>
+ </message>
+ <message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">编译时未启用外部签名支持 (外部签名需要这个功能)</translation>
+ </message>
+</context>
<context>
<name>EditAddressDialog</name>
<message>
@@ -679,14 +1307,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">与此地址关联的标签</translation>
</message>
<message>
+ <source>The address associated with this address list entry. This can only be modified for sending addresses.</source>
+ <translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
+ </message>
+ <message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">地址(&amp;A)</translation>
+ </message>
+ <message>
<source>New sending address</source>
<translation type="unfinished">新建付款地址</translation>
</message>
<message>
+ <source>Edit receiving address</source>
+ <translation type="unfinished">编辑收款地址</translation>
+ </message>
+ <message>
<source>Edit sending address</source>
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>The entered address "%1" is not a valid Bitcoin address.</source>
+ <translation type="unfinished">输入的地址 %1 并不是有效的比特币地址。</translation>
+ </message>
+ <message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">地址“%1”已经存在,它是一个收款地址,标签为“%2”,所以它不能作为一个付款地址被添加进来。</translation>
+ </message>
+ <message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">输入的地址“%1”已经存在于地址簿中,标签为“%2”。</translation>
</message>
@@ -694,68 +1342,262 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Could not unlock wallet.</source>
<translation type="unfinished">无法解锁钱包。</translation>
</message>
- </context>
+ <message>
+ <source>New key generation failed.</source>
+ <translation type="unfinished">生成新密钥失败。</translation>
+ </message>
+</context>
<context>
<name>FreespaceChecker</name>
<message>
+ <source>A new data directory will be created.</source>
+ <translation type="unfinished">一个新的数据目录将被创建。</translation>
+ </message>
+ <message>
+ <source>name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
+ <source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
+ <translation type="unfinished">目录已存在。如果您打算在这里创建一个新目录,请添加 %1。</translation>
+ </message>
+ <message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">路径已存在,并且不是一个目录。</translation>
+ </message>
+ <message>
<source>Cannot create data directory here.</source>
<translation type="unfinished">无法在此创建数据目录。</translation>
</message>
</context>
<context>
<name>Intro</name>
+ <message>
+ <source>Bitcoin</source>
+ <translation type="unfinished">比特币</translation>
+ </message>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
- <numerusform>%nGB可用</numerusform>
+ <numerusform>可用空间 %n GB</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
- <numerusform>(需要 %n GB)</numerusform>
+ <numerusform>(需要 %n GB的空间)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
- <numerusform>(完整區塊鏈需要%n GB)</numerusform>
+ <numerusform>(保存完整的链需要 %n GB)</numerusform>
</translation>
</message>
<message>
<source>Choose data directory</source>
<translation type="unfinished">选择数据目录</translation>
</message>
+ <message>
+ <source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
+ <translation type="unfinished">此目录中至少会保存 %1 GB 的数据,并且大小还会随着时间增长。</translation>
+ </message>
+ <message>
+ <source>Approximately %1 GB of data will be stored in this directory.</source>
+ <translation type="unfinished">会在此目录中存储约 %1 GB 的数据。</translation>
+ </message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
- <numerusform>(sufficient to restore backups %n day(s) old)</numerusform>
+ <numerusform>(足以恢复 %n 天之内的备份)</numerusform>
</translation>
</message>
<message>
+ <source>%1 will download and store a copy of the Bitcoin block chain.</source>
+ <translation type="unfinished">%1 将会下载并存储比特币区块链。</translation>
+ </message>
+ <message>
+ <source>The wallet will also be stored in this directory.</source>
+ <translation type="unfinished">钱包也会被保存在这个目录中。</translation>
+ </message>
+ <message>
+ <source>Error: Specified data directory "%1" cannot be created.</source>
+ <translation type="unfinished">错误:无法创建指定的数据目录 "%1"</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">错误</translation>
</message>
<message>
+ <source>Welcome</source>
+ <translation type="unfinished">欢迎</translation>
+ </message>
+ <message>
+ <source>Welcome to %1.</source>
+ <translation type="unfinished">欢迎使用 %1</translation>
+ </message>
+ <message>
+ <source>As this is the first time the program is launched, you can choose where %1 will store its data.</source>
+ <translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
+ </message>
+ <message>
+ <source>Limit block chain storage to</source>
+ <translation type="unfinished">将区块链存储限制到</translation>
+ </message>
+ <message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">取消此设置需要重新下载整个区块链。先完整下载整条链再进行修剪会更快。这会禁用一些高级功能。</translation>
+ </message>
+ <message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
<translation type="unfinished">初始化同步过程是非常吃力的,同时可能会暴露您之前没有注意到的电脑硬件问题。你每次启动%1时,它都会从之前中断的地方继续下载。</translation>
</message>
<message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
- <translation type="unfinished">當你點擊「確認」,%1會開始下載,並從%3年最早的交易,處裡整個%4區塊鏈(大小:%2GB)</translation>
+ <translation type="unfinished">当你单击确认后,%1 将会从%4在%3年创始时最早的交易开始,下载并处理完整的 %4 区块链 (%2 GB)。</translation>
</message>
- </context>
+ <message>
+ <source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
+ <translation type="unfinished">如果你选择限制区块链存储大小(区块链裁剪模式),程序依然会下载并处理全部历史数据,只是不必须的部分会在使用后被删除,以占用最少的存储空间。</translation>
+ </message>
+ <message>
+ <source>Use the default data directory</source>
+ <translation type="unfinished">使用默认的数据目录</translation>
+ </message>
+ <message>
+ <source>Use a custom data directory:</source>
+ <translation type="unfinished">使用自定义的数据目录:</translation>
+ </message>
+</context>
+<context>
+ <name>HelpMessageDialog</name>
+ <message>
+ <source>version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
+ <source>About %1</source>
+ <translation type="unfinished">关于 %1</translation>
+ </message>
+ <message>
+ <source>Command-line options</source>
+ <translation type="unfinished">命令行选项</translation>
+ </message>
+</context>
+<context>
+ <name>ShutdownWindow</name>
+ <message>
+ <source>%1 is shutting down…</source>
+ <translation type="unfinished">%1正在关闭...</translation>
+ </message>
+ <message>
+ <source>Do not shut down the computer until this window disappears.</source>
+ <translation type="unfinished">在此窗口消失前不要关闭计算机。</translation>
+ </message>
+</context>
<context>
<name>ModalOverlay</name>
<message>
+ <source>Form</source>
+ <translation type="unfinished">窗体</translation>
+ </message>
+ <message>
+ <source>Recent transactions may not yet be visible, and therefore your wallet's balance might be incorrect. This information will be correct once your wallet has finished synchronizing with the bitcoin network, as detailed below.</source>
+ <translation type="unfinished">近期交易可能尚未显示,因此当前余额可能不准确。以上信息将在与比特币网络完全同步后更正。详情如下</translation>
+ </message>
+ <message>
+ <source>Attempting to spend bitcoins that are affected by not-yet-displayed transactions will not be accepted by the network.</source>
+ <translation type="unfinished">尝试使用受未可见交易影响的余额将不被网络接受。</translation>
+ </message>
+ <message>
+ <source>Number of blocks left</source>
+ <translation type="unfinished">剩余区块数量</translation>
+ </message>
+ <message>
+ <source>Unknown…</source>
+ <translation type="unfinished">未知...</translation>
+ </message>
+ <message>
+ <source>calculating…</source>
+ <translation type="unfinished">计算中...</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
+ <source>Progress</source>
+ <translation type="unfinished">进度</translation>
+ </message>
+ <message>
+ <source>Progress increase per hour</source>
+ <translation type="unfinished">每小时进度增加</translation>
+ </message>
+ <message>
+ <source>Estimated time left until synced</source>
+ <translation type="unfinished">预计剩余同步时间</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">隐藏</translation>
+ </message>
+ <message>
+ <source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
+ <translation type="unfinished">%1目前正在同步中。它会从其他节点下载区块头和区块数据并进行验证,直到抵达区块链尖端。</translation>
+ </message>
+ <message>
+ <source>Unknown. Syncing Headers (%1, %2%)…</source>
+ <translation type="unfinished">未知。同步区块头(%1, %2%)...</translation>
+ </message>
+ <message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">不明。正在預先同步標頭(%1, %2%)...</translation>
+ <translation type="unfinished">未知。预同步区块头 (%1, %2%)…</translation>
+ </message>
+</context>
+<context>
+ <name>OpenURIDialog</name>
+ <message>
+ <source>Open bitcoin URI</source>
+ <translation type="unfinished">打开比特币URI</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
</message>
</context>
<context>
<name>OptionsDialog</name>
<message>
+ <source>Options</source>
+ <translation type="unfinished">选项</translation>
+ </message>
+ <message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
+ <source>&amp;Start %1 on system login</source>
+ <translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
+ </message>
+ <message>
+ <source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
+ <translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
+ </message>
+ <message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -772,30 +1614,38 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
<message>
<source>Open the %1 configuration file from the working directory.</source>
- <translation type="unfinished">從工作目錄開啟設定檔 %1。</translation>
+ <translation type="unfinished">从工作目录下打开配置文件 %1。</translation>
</message>
<message>
<source>Open Configuration File</source>
- <translation type="unfinished">開啟設定檔</translation>
+ <translation type="unfinished">打开配置文件</translation>
</message>
<message>
<source>Reset all client options to default.</source>
- <translation type="unfinished">重設所有客戶端軟體選項成預設值。</translation>
+ <translation type="unfinished">恢复客户端的缺省设置</translation>
</message>
<message>
<source>&amp;Reset Options</source>
- <translation type="unfinished">重設選項(&amp;R)</translation>
+ <translation type="unfinished">恢复缺省设置(&amp;R)</translation>
</message>
<message>
<source>&amp;Network</source>
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -811,7 +1661,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
- <translation type="unfinished">(0 表示程式自動決定,小於 0 表示保留處理器核心不用的數目)</translation>
+ <translation type="unfinished">(0 = 自动, &lt;0 = 保持指定数量的CPU核心空闲)</translation>
</message>
<message>
<source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
@@ -824,6 +1674,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -834,10 +1688,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -848,12 +1714,104 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外部签名器(例如硬件钱包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
<translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">使用 &amp;UPnP 映射端口</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
+ <source>Accept connections from outside.</source>
+ <translation type="unfinished">接受外部连接。</translation>
+ </message>
+ <message>
+ <source>Allow incomin&amp;g connections</source>
+ <translation type="unfinished">允许传入连接(&amp;G)</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a SOCKS5 proxy.</source>
+ <translation type="unfinished">通过 SOCKS5 代理连接比特币网络。</translation>
+ </message>
+ <message>
+ <source>&amp;Connect through SOCKS5 proxy (default proxy):</source>
+ <translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
+ </message>
+ <message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
+ <source>Port of the proxy (e.g. 9050)</source>
+ <translation type="unfinished">代理服务器端口(例如 9050)</translation>
+ </message>
+ <message>
+ <source>Used for reaching peers via:</source>
+ <translation type="unfinished">在走这些途径连接到节点的时候启用:</translation>
+ </message>
+ <message>
<source>&amp;Window</source>
- <translation type="unfinished">&amp;窗口</translation>
+ <translation type="unfinished">窗口(&amp;W)</translation>
+ </message>
+ <message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Show only a tray icon after minimizing the window.</source>
+ <translation type="unfinished">最小化窗口后仅显示托盘图标</translation>
+ </message>
+ <message>
+ <source>&amp;Minimize to the tray instead of the taskbar</source>
+ <translation type="unfinished">最小化到托盘(&amp;M)</translation>
+ </message>
+ <message>
+ <source>M&amp;inimize on close</source>
+ <translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
+ </message>
+ <message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
+ <source>User Interface &amp;language:</source>
+ <translation type="unfinished">用户界面语言(&amp;L):</translation>
+ </message>
+ <message>
+ <source>The user interface language can be set here. This setting will take effect after restarting %1.</source>
+ <translation type="unfinished">可以在这里设定用户界面的语言。这个设定在重启 %1 后才会生效。</translation>
+ </message>
+ <message>
+ <source>&amp;Unit to show amounts in:</source>
+ <translation type="unfinished">比特币金额单位(&amp;U):</translation>
+ </message>
+ <message>
+ <source>Choose the default subdivision unit to show in the interface and when sending coins.</source>
+ <translation type="unfinished">选择显示及发送比特币时使用的最小单位。</translation>
</message>
<message>
<source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
@@ -864,19 +1822,93 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
+ <source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
+ <translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
+ </message>
+ <message>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
+ </message>
+ <message>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">编译时未启用外部签名支持 (外部签名需要这个功能)</translation>
+ </message>
+ <message>
+ <source>default</source>
+ <translation type="unfinished">默认</translation>
+ </message>
+ <message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
+ <source>Client restart required to activate changes.</source>
+ <extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
+ <translation type="unfinished">需要重启客户端才能使更改生效。</translation>
+ </message>
+ <message>
<source>Current settings will be backed up at "%1".</source>
<extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
<translation type="unfinished">当前设置将会被备份到 "%1"。</translation>
</message>
<message>
+ <source>Client will be shut down. Do you want to proceed?</source>
+ <extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
+ <translation type="unfinished">客户端即将关闭,您想继续吗?</translation>
+ </message>
+ <message>
+ <source>Configuration options</source>
+ <extracomment>Window title text of pop-up box that allows opening up of configuration file.</extracomment>
+ <translation type="unfinished">配置选项</translation>
+ </message>
+ <message>
+ <source>The configuration file is used to specify advanced user options which override GUI settings. Additionally, any command-line options will override this configuration file.</source>
+ <extracomment>Explanatory text about the priority order of instructions considered by client. The order from high to low being: command-line, configuration file, GUI settings.</extracomment>
+ <translation type="unfinished">配置文件可以用来设置高级选项。配置文件会覆盖设置界面窗口中的选项。此外,命令行会覆盖配置文件指定的选项。</translation>
+ </message>
+ <message>
<source>Continue</source>
<translation type="unfinished">继续</translation>
</message>
<message>
+ <source>Cancel</source>
+ <translation type="unfinished">取消</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">错误</translation>
</message>
- </context>
+ <message>
+ <source>The configuration file could not be opened.</source>
+ <translation type="unfinished">无法打开配置文件。</translation>
+ </message>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -885,23 +1917,268 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>OverviewPage</name>
+ <message>
+ <source>Form</source>
+ <translation type="unfinished">窗体</translation>
+ </message>
+ <message>
+ <source>The displayed information may be out of date. Your wallet automatically synchronizes with the Bitcoin network after a connection is established, but this process has not completed yet.</source>
+ <translation type="unfinished">现在显示的消息可能是过期的。在连接上比特币网络节点后,您的钱包将自动与网络同步,但是这个过程还没有完成。</translation>
+ </message>
+ <message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
+ <source>Available:</source>
+ <translation type="unfinished">可使用的余额:</translation>
+ </message>
+ <message>
+ <source>Your current spendable balance</source>
+ <translation type="unfinished">您当前可使用的余额</translation>
+ </message>
+ <message>
+ <source>Pending:</source>
+ <translation type="unfinished">等待中的余额:</translation>
+ </message>
+ <message>
+ <source>Total of transactions that have yet to be confirmed, and do not yet count toward the spendable balance</source>
+ <translation type="unfinished">尚未确认的交易总额,未计入当前余额</translation>
+ </message>
+ <message>
+ <source>Immature:</source>
+ <translation type="unfinished">未成熟的:</translation>
+ </message>
+ <message>
+ <source>Mined balance that has not yet matured</source>
+ <translation type="unfinished">尚未成熟的挖矿收入余额</translation>
+ </message>
+ <message>
+ <source>Balances</source>
+ <translation type="unfinished">余额</translation>
+ </message>
+ <message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
+ <source>Your current total balance</source>
+ <translation type="unfinished">您当前的总余额</translation>
+ </message>
+ <message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
+ <source>Recent transactions</source>
+ <translation type="unfinished">最近交易</translation>
+ </message>
+ <message>
+ <source>Unconfirmed transactions to watch-only addresses</source>
+ <translation type="unfinished">仅观察地址的未确认交易</translation>
+ </message>
+ <message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
+ <source>Current total balance in watch-only addresses</source>
+ <translation type="unfinished">仅观察地址中的当前总余额</translation>
+ </message>
+ <message>
+ <source>Privacy mode activated for the Overview tab. To unmask the values, uncheck Settings-&gt;Mask values.</source>
+ <translation type="unfinished">“概况”标签页已启用隐私模式。要明文显示数值,请在设置中取消勾选“不明文显示数值”。</translation>
+ </message>
+</context>
+<context>
<name>PSBTOperationsDialog</name>
<message>
<source>PSBT Operations</source>
<translation type="unfinished">PSBT操作</translation>
</message>
<message>
+ <source>Sign Tx</source>
+ <translation type="unfinished">签名交易</translation>
+ </message>
+ <message>
+ <source>Broadcast Tx</source>
+ <translation type="unfinished">广播交易</translation>
+ </message>
+ <message>
+ <source>Copy to Clipboard</source>
+ <translation type="unfinished">复制到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save…</source>
+ <translation type="unfinished">保存...</translation>
+ </message>
+ <message>
+ <source>Close</source>
+ <translation type="unfinished">关闭</translation>
+ </message>
+ <message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
<message>
+ <source>Could not sign any more inputs.</source>
+ <translation type="unfinished">没有交易输入项可供签名了。</translation>
+ </message>
+ <message>
+ <source>Signed %1 inputs, but more signatures are still required.</source>
+ <translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
+ </message>
+ <message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast successfully! Transaction ID: %1</source>
+ <translation type="unfinished">已成功广播交易!交易ID: %1</translation>
+ </message>
+ <message>
+ <source>Transaction broadcast failed: %1</source>
+ <translation type="unfinished">交易广播失败: %1</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">部分签名交易(二进制)</translation>
+ </message>
+ <message>
+ <source>PSBT saved to disk.</source>
+ <translation type="unfinished">PSBT已保存到硬盘</translation>
+ </message>
+ <message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
+ <source>Pays transaction fee: </source>
+ <translation type="unfinished">支付交易费用:</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">总额</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">或</translation>
+ </message>
+ <message>
+ <source>Transaction has %1 unsigned inputs.</source>
+ <translation type="unfinished">交易中含有%1个未签名输入项。</translation>
+ </message>
+ <message>
+ <source>Transaction is missing some information about inputs.</source>
+ <translation type="unfinished">交易中有输入项缺失某些信息。</translation>
+ </message>
+ <message>
+ <source>Transaction still needs signature(s).</source>
+ <translation type="unfinished">交易仍然需要签名。</translation>
+ </message>
+ <message>
<source>(But no wallet is loaded.)</source>
<translation type="unfinished">(但没有加载钱包。)</translation>
</message>
- </context>
+ <message>
+ <source>(But this wallet cannot sign transactions.)</source>
+ <translation type="unfinished">(但这个钱包不能签名交易)</translation>
+ </message>
+ <message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
+ <source>Transaction status is unknown.</source>
+ <translation type="unfinished">交易状态未知。</translation>
+ </message>
+</context>
+<context>
+ <name>PaymentServer</name>
+ <message>
+ <source>Payment request error</source>
+ <translation type="unfinished">支付请求出错</translation>
+ </message>
+ <message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
+ <source>URI handling</source>
+ <translation type="unfinished">URI 处理</translation>
+ </message>
+ <message>
+ <source>'bitcoin://' is not a valid URI. Use 'bitcoin:' instead.</source>
+ <translation type="unfinished">‘bitcoin://’不是合法的URI。请改用'bitcoin:'。</translation>
+ </message>
+ <message>
+ <source>Cannot process payment request because BIP70 is not supported.
+Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
+If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
+ <translation type="unfinished">因为不支持BIP70,无法处理付款请求。
+由于BIP70具有广泛的安全缺陷,无论哪个商家指引要求您更换钱包,我们都强烈建议您不要听信。
+如果您看到了这个错误,您应该要求商家提供兼容BIP21的URI。</translation>
+ </message>
+ <message>
+ <source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
+ <translation type="unfinished">无法解析 URI 地址!可能是因为比特币地址无效,或是 URI 参数格式错误。</translation>
+ </message>
+ <message>
+ <source>Payment request file handling</source>
+ <translation type="unfinished">支付请求文件处理</translation>
+ </message>
+</context>
<context>
<name>PeerTableModel</name>
<message>
+ <source>User Agent</source>
+ <extracomment>Title of Peers Table column which contains the peer's User Agent string.</extracomment>
+ <translation type="unfinished">用户代理</translation>
+ </message>
+ <message>
+ <source>Peer</source>
+ <extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
+ <translation type="unfinished">节点</translation>
+ </message>
+ <message>
<source>Age</source>
<extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
<translation type="unfinished">连接时间</translation>
@@ -912,14 +2189,192 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">方向</translation>
</message>
<message>
+ <source>Sent</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have sent to the peer.</extracomment>
+ <translation type="unfinished">已发送</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <extracomment>Title of Peers Table column which indicates the total amount of network information we have received from the peer.</extracomment>
+ <translation type="unfinished">已接收</translation>
+ </message>
+ <message>
<source>Address</source>
<extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
<translation type="unfinished">地址</translation>
</message>
- </context>
+ <message>
+ <source>Type</source>
+ <extracomment>Title of Peers Table column which describes the type of peer connection. The "type" describes why the connection exists.</extracomment>
+ <translation type="unfinished">类型</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <extracomment>Title of Peers Table column which states the network the peer connected through.</extracomment>
+ <translation type="unfinished">网络</translation>
+ </message>
+ <message>
+ <source>Inbound</source>
+ <extracomment>An Inbound Connection from a Peer.</extracomment>
+ <translation type="unfinished">传入</translation>
+ </message>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">传出</translation>
+ </message>
+</context>
+<context>
+ <name>QRImageWidget</name>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">保存图像(&amp;S)...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太长,请试着精简标签或消息文本。</translation>
+ </message>
+ <message>
+ <source>Error encoding URI into QR Code.</source>
+ <translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
+ </message>
+ <message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
+ <source>Save QR Code</source>
+ <translation type="unfinished">保存二维码</translation>
+ </message>
+ <message>
+ <source>PNG Image</source>
+ <extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
+ <translation type="unfinished">PNG图像</translation>
+ </message>
+</context>
<context>
<name>RPCConsole</name>
<message>
+ <source>N/A</source>
+ <translation type="unfinished">不可用</translation>
+ </message>
+ <message>
+ <source>Client version</source>
+ <translation type="unfinished">客户端版本</translation>
+ </message>
+ <message>
+ <source>&amp;Information</source>
+ <translation type="unfinished">信息(&amp;I)</translation>
+ </message>
+ <message>
+ <source>General</source>
+ <translation type="unfinished">常规</translation>
+ </message>
+ <message>
+ <source>Datadir</source>
+ <translation type="unfinished">数据目录</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the data directory use the '%1' option.</source>
+ <translation type="unfinished">如果不想用默认的数据目录位置,请用 '%1' 这个选项来指定新的位置。</translation>
+ </message>
+ <message>
+ <source>Blocksdir</source>
+ <translation type="unfinished">区块存储目录</translation>
+ </message>
+ <message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自定义区块存储目录的位置,请用 '%1' 这个选项来指定新的位置。</translation>
+ </message>
+ <message>
+ <source>Startup time</source>
+ <translation type="unfinished">启动时间</translation>
+ </message>
+ <message>
+ <source>Network</source>
+ <translation type="unfinished">网络</translation>
+ </message>
+ <message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
+ <source>Number of connections</source>
+ <translation type="unfinished">连接数</translation>
+ </message>
+ <message>
+ <source>Block chain</source>
+ <translation type="unfinished">区块链</translation>
+ </message>
+ <message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
+ <source>Memory usage</source>
+ <translation type="unfinished">内存使用</translation>
+ </message>
+ <message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
+ <source>(none)</source>
+ <translation type="unfinished">(无)</translation>
+ </message>
+ <message>
+ <source>&amp;Reset</source>
+ <translation type="unfinished">重置(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Received</source>
+ <translation type="unfinished">已接收</translation>
+ </message>
+ <message>
+ <source>Sent</source>
+ <translation type="unfinished">已发送</translation>
+ </message>
+ <message>
+ <source>&amp;Peers</source>
+ <translation type="unfinished">节点(&amp;P)</translation>
+ </message>
+ <message>
+ <source>Banned peers</source>
+ <translation type="unfinished">已封禁节点</translation>
+ </message>
+ <message>
+ <source>Select a peer to view detailed information.</source>
+ <translation type="unfinished">选择节点查看详细信息。</translation>
+ </message>
+ <message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">传输层版本: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">传输</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">十六进制格式的BIP324会话ID,如果有的话。</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">会话ID</translation>
+ </message>
+ <message>
+ <source>Version</source>
+ <translation type="unfinished">版本</translation>
+ </message>
+ <message>
<source>Whether we relay transactions to this peer.</source>
<translation type="unfinished">是否要将交易转发给这个节点。</translation>
</message>
@@ -928,10 +2383,30 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
+ <source>Synced Headers</source>
+ <translation type="unfinished">已同步区块头</translation>
+ </message>
+ <message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
<message>
+ <source>The mapped Autonomous System used for diversifying peer selection.</source>
+ <translation type="unfinished">映射到的自治系统,被用来多样化选择节点</translation>
+ </message>
+ <message>
+ <source>Mapped AS</source>
+ <translation type="unfinished">映射到的AS</translation>
+ </message>
+ <message>
<source>Whether we relay addresses to this peer.</source>
<extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
<translation type="unfinished">是否把地址转发给这个节点。</translation>
@@ -962,8 +2437,219 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">被频率限制丢弃的地址</translation>
</message>
<message>
+ <source>User Agent</source>
+ <translation type="unfinished">用户代理</translation>
+ </message>
+ <message>
<source>Node window</source>
- <translation type="unfinished">结点窗口</translation>
+ <translation type="unfinished">节点窗口</translation>
+ </message>
+ <message>
+ <source>Current block height</source>
+ <translation type="unfinished">当前区块高度</translation>
+ </message>
+ <message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
+ <source>Decrease font size</source>
+ <translation type="unfinished">缩小字体大小</translation>
+ </message>
+ <message>
+ <source>Increase font size</source>
+ <translation type="unfinished">放大字体大小</translation>
+ </message>
+ <message>
+ <source>Permissions</source>
+ <translation type="unfinished">权限</translation>
+ </message>
+ <message>
+ <source>The direction and type of peer connection: %1</source>
+ <translation type="unfinished">节点连接的方向和类型: %1</translation>
+ </message>
+ <message>
+ <source>Direction/Type</source>
+ <translation type="unfinished">方向/类型</translation>
+ </message>
+ <message>
+ <source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
+ <translation type="unfinished">这个节点是通过这种网络协议连接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
+ </message>
+ <message>
+ <source>Services</source>
+ <translation type="unfinished">服务</translation>
+ </message>
+ <message>
+ <source>High bandwidth BIP152 compact block relay: %1</source>
+ <translation type="unfinished">高带宽BIP152密实区块转发: %1</translation>
+ </message>
+ <message>
+ <source>High Bandwidth</source>
+ <translation type="unfinished">高带宽</translation>
+ </message>
+ <message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">自从这个节点上一次发来可通过初始有效性检查的新区块以来到现在经过的时间</translation>
+ </message>
+ <message>
+ <source>Last Block</source>
+ <translation type="unfinished">上一个区块</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">自从这个节点上一次发来被我们的内存池接受的新交易到现在经过的时间</translation>
+ </message>
+ <message>
+ <source>Last Send</source>
+ <translation type="unfinished">上次发送</translation>
+ </message>
+ <message>
+ <source>Last Receive</source>
+ <translation type="unfinished">上次接收</translation>
+ </message>
+ <message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
+ <source>The duration of a currently outstanding ping.</source>
+ <translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
+ </message>
+ <message>
+ <source>Ping Wait</source>
+ <translation type="unfinished">Ping 等待</translation>
+ </message>
+ <message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
+ <source>&amp;Open</source>
+ <translation type="unfinished">打开(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Console</source>
+ <translation type="unfinished">控制台(&amp;C)</translation>
+ </message>
+ <message>
+ <source>&amp;Network Traffic</source>
+ <translation type="unfinished">网络流量(&amp;N)</translation>
+ </message>
+ <message>
+ <source>Totals</source>
+ <translation type="unfinished">总数</translation>
+ </message>
+ <message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
+ <source>Clear console</source>
+ <translation type="unfinished">清空控制台</translation>
+ </message>
+ <message>
+ <source>In:</source>
+ <translation type="unfinished">传入:</translation>
+ </message>
+ <message>
+ <source>Out:</source>
+ <translation type="unfinished">传出:</translation>
+ </message>
+ <message>
+ <source>Inbound: initiated by peer</source>
+ <extracomment>Explanatory text for an inbound peer connection.</extracomment>
+ <translation type="unfinished">入站: 由对端发起</translation>
+ </message>
+ <message>
+ <source>Outbound Full Relay: default</source>
+ <extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
+ <translation type="unfinished">出站完整转发: 默认</translation>
+ </message>
+ <message>
+ <source>Outbound Block Relay: does not relay transactions or addresses</source>
+ <extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
+ <translation type="unfinished">出站区块转发: 不转发交易和地址</translation>
+ </message>
+ <message>
+ <source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
+ <extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
+ <translation type="unfinished">出站手动: 加入使用RPC %1 或 %2/%3 配置选项</translation>
+ </message>
+ <message>
+ <source>Outbound Feeler: short-lived, for testing addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
+ </message>
+ <message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">出站地址取回: 短暂,用于请求取回地址</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: 未加密,明文传输协议</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324加密传输协议</translation>
+ </message>
+ <message>
+ <source>we selected the peer for high bandwidth relay</source>
+ <translation type="unfinished">我们选择了用于高带宽转发的节点</translation>
+ </message>
+ <message>
+ <source>the peer selected us for high bandwidth relay</source>
+ <translation type="unfinished">对端选择了我们用于高带宽转发</translation>
+ </message>
+ <message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未选择高带宽转发</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <extracomment>Context menu action to copy the address of a peer.</extracomment>
+ <translation type="unfinished">复制地址(&amp;C)</translation>
+ </message>
+ <message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
+ <source>1 &amp;hour</source>
+ <translation type="unfinished">1 小时(&amp;H)</translation>
+ </message>
+ <message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
</message>
<message>
<source>&amp;Copy IP/Netmask</source>
@@ -971,6 +2657,26 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Unban</source>
+ <translation type="unfinished">解封(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -987,10 +2693,139 @@ For more information on using this console, type %6.
%7 警告:骗子们很活跃,他们会让用户在这里输入命令以便偷走用户钱包中的内容。所以请您不要在不完全了解一个命令的后果的情况下使用此控制台。%8</translation>
</message>
- </context>
+ <message>
+ <source>Executing…</source>
+ <extracomment>A console message indicating an entered command is currently being executed.</extracomment>
+ <translation type="unfinished">执行中……</translation>
+ </message>
+ <message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
+ <source>via %1</source>
+ <translation type="unfinished">通过 %1</translation>
+ </message>
+ <message>
+ <source>Yes</source>
+ <translation type="unfinished">是</translation>
+ </message>
+ <message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">到</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">来自</translation>
+ </message>
+ <message>
+ <source>Ban for</source>
+ <translation type="unfinished">封禁时长</translation>
+ </message>
+ <message>
+ <source>Never</source>
+ <translation type="unfinished">永不</translation>
+ </message>
+ <message>
+ <source>Unknown</source>
+ <translation type="unfinished">未知</translation>
+ </message>
+</context>
<context>
<name>ReceiveCoinsDialog</name>
<message>
+ <source>&amp;Amount:</source>
+ <translation type="unfinished">金额(&amp;A):</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>&amp;Message:</source>
+ <translation type="unfinished">消息(&amp;M):</translation>
+ </message>
+ <message>
+ <source>An optional message to attach to the payment request, which will be displayed when the request is opened. Note: The message will not be sent with the payment over the Bitcoin network.</source>
+ <translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
+ <source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
+ <translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
+ </message>
+ <message>
+ <source>An optional amount to request. Leave this empty or zero to not request a specific amount.</source>
+ <translation type="unfinished">可选的请求金额。留空或填零为不要求具体金额。</translation>
+ </message>
+ <message>
+ <source>An optional label to associate with the new receiving address (used by you to identify an invoice). It is also attached to the payment request.</source>
+ <translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
+ </message>
+ <message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
+ <source>&amp;Create new receiving address</source>
+ <translation type="unfinished">新建收款地址(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">清除</translation>
+ </message>
+ <message>
+ <source>Requested payments history</source>
+ <translation type="unfinished">付款请求历史</translation>
+ </message>
+ <message>
+ <source>Show the selected request (does the same as double clicking an entry)</source>
+ <translation type="unfinished">显示选中的请求 (直接双击项目也可以显示)</translation>
+ </message>
+ <message>
+ <source>Show</source>
+ <translation type="unfinished">显示</translation>
+ </message>
+ <message>
+ <source>Remove the selected entries from the list</source>
+ <translation type="unfinished">从列表中移除选中的条目</translation>
+ </message>
+ <message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation type="unfinished">复制 &amp;URI</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">复制地址(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">复制标签(&amp;L)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;message</source>
+ <translation type="unfinished">复制消息(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">复制金额(&amp;A)</translation>
+ </message>
+ <message>
<source>Base58 (Legacy)</source>
<translation type="unfinished">Base58 (旧式)</translation>
</message>
@@ -1014,21 +2849,252 @@ For more information on using this console, type %6.
<source>Could not unlock wallet.</source>
<translation type="unfinished">无法解锁钱包。</translation>
</message>
- </context>
+ <message>
+ <source>Could not generate new %1 address</source>
+ <translation type="unfinished">无法生成新的%1地址</translation>
+ </message>
+</context>
+<context>
+ <name>ReceiveRequestDialog</name>
+ <message>
+ <source>Request payment to …</source>
+ <translation type="unfinished">请求支付至...</translation>
+ </message>
+ <message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Label:</source>
+ <translation type="unfinished">标签:</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">消息:</translation>
+ </message>
+ <message>
+ <source>Wallet:</source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
+ <source>Copy &amp;URI</source>
+ <translation type="unfinished">复制 &amp;URI</translation>
+ </message>
+ <message>
+ <source>Copy &amp;Address</source>
+ <translation type="unfinished">复制地址(&amp;A)</translation>
+ </message>
+ <message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
+ <source>&amp;Save Image…</source>
+ <translation type="unfinished">保存图像(&amp;S)...</translation>
+ </message>
+ <message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
+ <source>Request payment to %1</source>
+ <translation type="unfinished">请求付款到 %1</translation>
+ </message>
+</context>
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
- </context>
+ <message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
+ <source>(no amount requested)</source>
+ <translation type="unfinished">(未填写请求金额)</translation>
+ </message>
+ <message>
+ <source>Requested</source>
+ <translation type="unfinished">请求金额</translation>
+ </message>
+</context>
<context>
<name>SendCoinsDialog</name>
<message>
+ <source>Send Coins</source>
+ <translation type="unfinished">发币</translation>
+ </message>
+ <message>
+ <source>Coin Control Features</source>
+ <translation type="unfinished">手动选币功能</translation>
+ </message>
+ <message>
+ <source>automatically selected</source>
+ <translation type="unfinished">自动选择</translation>
+ </message>
+ <message>
+ <source>Insufficient funds!</source>
+ <translation type="unfinished">金额不足!</translation>
+ </message>
+ <message>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">字节数:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
+ </message>
+ <message>
+ <source>After Fee:</source>
+ <translation type="unfinished">加上交易费用后:</translation>
+ </message>
+ <message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
+ <translation type="unfinished">在激活该选项后,如果填写了无效的找零地址,或者干脆没填找零地址,找零资金将会被转入新生成的地址。</translation>
+ </message>
+ <message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
+ <source>Transaction Fee:</source>
+ <translation type="unfinished">交易手续费:</translation>
+ </message>
+ <message>
+ <source>Using the fallbackfee can result in sending a transaction that will take several hours or days (or never) to confirm. Consider choosing your fee manually or wait until you have validated the complete chain.</source>
+ <translation type="unfinished">如果使用备用手续费设置,有可能会导致交易经过几个小时、几天(甚至永远)无法被确认。请考虑手动选择手续费,或等待整个链完成验证。</translation>
+ </message>
+ <message>
+ <source>Warning: Fee estimation is currently not possible.</source>
+ <translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
+ </message>
+ <message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
+ <source>Hide</source>
+ <translation type="unfinished">隐藏</translation>
+ </message>
+ <message>
+ <source>Recommended:</source>
+ <translation type="unfinished">推荐:</translation>
+ </message>
+ <message>
+ <source>Custom:</source>
+ <translation type="unfinished">自定义:</translation>
+ </message>
+ <message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
+ <source>Add &amp;Recipient</source>
+ <translation type="unfinished">添加收款人(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
+ </message>
+ <message>
+ <source>Choose…</source>
+ <translation type="unfinished">选择...</translation>
+ </message>
+ <message>
+ <source>Hide transaction fee settings</source>
+ <translation type="unfinished">隐藏交易手续费设置</translation>
+ </message>
+ <message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">当交易量小于可用区块空间时,矿工和中继节点可能会执行最低手续费率限制。按照这个最低费率来支付手续费也是可以的,但请注意,一旦交易需求超出比特币网络能处理的限度,你的交易可能永远也无法确认。</translation>
+ </message>
+ <message>
+ <source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
+ <translation type="unfinished">过低的手续费率可能导致交易永远无法确认(请阅读工具提示)</translation>
+ </message>
+ <message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(智能矿工费尚未被初始化。这一般需要几个区块...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
+ <source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
+ <translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
+ <source>Balance:</source>
+ <translation type="unfinished">余额:</translation>
+ </message>
+ <message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Copy quantity</source>
+ <translation type="unfinished">复制数目</translation>
+ </message>
+ <message>
<source>Copy amount</source>
<translation type="unfinished">复制金额</translation>
</message>
@@ -1037,6 +3103,105 @@ For more information on using this console, type %6.
<translation type="unfinished">复制手续费</translation>
</message>
<message>
+ <source>Copy after fee</source>
+ <translation type="unfinished">复制含交易费的金额</translation>
+ </message>
+ <message>
+ <source>Copy bytes</source>
+ <translation type="unfinished">复制字节数</translation>
+ </message>
+ <message>
+ <source>Copy change</source>
+ <translation type="unfinished">复制找零金额</translation>
+ </message>
+ <message>
+ <source>%1 (%2 blocks)</source>
+ <translation type="unfinished">%1 (%2个块)</translation>
+ </message>
+ <message>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在设备上签名</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">请先连接您的硬件钱包。</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 选项 -&gt; 钱包 中设置外部签名器脚本路径</translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
+ </message>
+ <message>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ </message>
+ <message>
+ <source>%1 to '%2'</source>
+ <translation type="unfinished">%1 到 '%2'</translation>
+ </message>
+ <message>
+ <source>%1 to %2</source>
+ <translation type="unfinished">%1 到 %2</translation>
+ </message>
+ <message>
+ <source>To review recipient list click "Show Details…"</source>
+ <translation type="unfinished">点击“查看详情”以审核收款人列表</translation>
+ </message>
+ <message>
+ <source>Sign failed</source>
+ <translation type="unfinished">签名失败</translation>
+ </message>
+ <message>
+ <source>External signer not found</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">未找到外部签名器</translation>
+ </message>
+ <message>
+ <source>External signer failure</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">外部签名器失败</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (Binary)</source>
+ <extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
+ <translation type="unfinished">部分签名交易(二进制)</translation>
+ </message>
+ <message>
+ <source>PSBT saved</source>
+ <extracomment>Popup message when a PSBT has been saved to a file</extracomment>
+ <translation type="unfinished">已保存PSBT</translation>
+ </message>
+ <message>
+ <source>External balance:</source>
+ <translation type="unfinished">外部余额:</translation>
+ </message>
+ <message>
+ <source>or</source>
+ <translation type="unfinished">或</translation>
+ </message>
+ <message>
+ <source>You can increase the fee later (signals Replace-By-Fee, BIP-125).</source>
+ <translation type="unfinished">你可以后来再追加手续费(打上支持BIP-125手续费追加的标记)</translation>
+ </message>
+ <message>
+ <source>Please, review your transaction proposal. This will produce a Partially Signed Bitcoin Transaction (PSBT) which you can save or copy and then sign with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
+ <translation type="unfinished">请务必仔细检查您的交易请求。这会产生一个部分签名比特币交易(PSBT),可以把保存下来或复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。</translation>
+ </message>
+ <message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -1047,6 +3212,23 @@ For more information on using this console, type %6.
<translation type="unfinished">请务必仔细检查您的交易。你可以创建并发送这笔交易;也可以创建一个“部分签名比特币交易(PSBT)”,它可以被保存下来或被复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。</translation>
</message>
<message>
+ <source>Please, review your transaction.</source>
+ <extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
+ <translation type="unfinished">请检查您的交易。</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
+ <source>Total Amount</source>
+ <translation type="unfinished">总额</translation>
+ </message>
+ <message>
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
@@ -1058,7 +3240,43 @@ For more information on using this console, type %6.
</message>
<message>
<source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT已保存到磁盘</translation>
+ <translation type="unfinished">已保存PSBT到磁盘</translation>
+ </message>
+ <message>
+ <source>Confirm send coins</source>
+ <translation type="unfinished">确认发币</translation>
+ </message>
+ <message>
+ <source>Watch-only balance:</source>
+ <translation type="unfinished">仅观察余额:</translation>
+ </message>
+ <message>
+ <source>The recipient address is not valid. Please recheck.</source>
+ <translation type="unfinished">接收人地址无效。请重新检查。</translation>
+ </message>
+ <message>
+ <source>The amount to pay must be larger than 0.</source>
+ <translation type="unfinished">支付金额必须大于0。</translation>
+ </message>
+ <message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
+ <source>A fee higher than %1 is considered an absurdly high fee.</source>
+ <translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
</message>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
@@ -1067,17 +3285,239 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>Warning: Invalid Bitcoin address</source>
+ <translation type="unfinished">警告: 比特币地址无效</translation>
+ </message>
+ <message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
+ <source>Confirm custom change address</source>
+ <translation type="unfinished">确认自定义找零地址</translation>
+ </message>
+ <message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
</context>
<context>
+ <name>SendCoinsEntry</name>
+ <message>
+ <source>A&amp;mount:</source>
+ <translation type="unfinished">金额(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Pay &amp;To:</source>
+ <translation type="unfinished">付给(&amp;T):</translation>
+ </message>
+ <message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to send the payment to</source>
+ <translation type="unfinished">付款目的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
+ <source>The amount to send in the selected unit</source>
+ <translation type="unfinished">用被选单位表示的待发送金额</translation>
+ </message>
+ <message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
+ <source>S&amp;ubtract fee from amount</source>
+ <translation type="unfinished">从金额中减去交易费(&amp;U)</translation>
+ </message>
+ <message>
+ <source>Use available balance</source>
+ <translation type="unfinished">使用全部可用余额</translation>
+ </message>
+ <message>
+ <source>Message:</source>
+ <translation type="unfinished">消息:</translation>
+ </message>
+ <message>
+ <source>Enter a label for this address to add it to the list of used addresses</source>
+ <translation type="unfinished">请为此地址输入一个标签以将它加入已用地址列表</translation>
+ </message>
+ <message>
+ <source>A message that was attached to the bitcoin: URI which will be stored with the transaction for your reference. Note: This message will not be sent over the Bitcoin network.</source>
+ <translation type="unfinished">bitcoin: URI 附带的备注信息,将会和交易一起存储,备查。 注意:该消息不会通过比特币网络传输。</translation>
+ </message>
+</context>
+<context>
<name>SendConfirmationDialog</name>
<message>
<source>Send</source>
<translation type="unfinished">发送</translation>
</message>
- </context>
+ <message>
+ <source>Create Unsigned</source>
+ <translation type="unfinished">创建未签名交易</translation>
+ </message>
+</context>
+<context>
+ <name>SignVerifyMessageDialog</name>
+ <message>
+ <source>Signatures - Sign / Verify a Message</source>
+ <translation type="unfinished">签名 - 为消息签名/验证签名消息</translation>
+ </message>
+ <message>
+ <source>&amp;Sign Message</source>
+ <translation type="unfinished">消息签名(&amp;S)</translation>
+ </message>
+ <message>
+ <source>You can sign messages/agreements with your addresses to prove you can receive bitcoins sent to them. Be careful not to sign anything vague or random, as phishing attacks may try to trick you into signing your identity over to them. Only sign fully-detailed statements you agree to.</source>
+ <translation type="unfinished">您可以用你的地址对消息/协议进行签名,以证明您可以接收发送到该地址的比特币。注意不要对任何模棱两可或者随机的消息进行签名,以免遭受钓鱼式攻击。请确保消息内容准确的表达了您的真实意愿。</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
+ <source>Signature</source>
+ <translation type="unfinished">签名</translation>
+ </message>
+ <message>
+ <source>Copy the current signature to the system clipboard</source>
+ <translation type="unfinished">复制当前签名至剪贴板</translation>
+ </message>
+ <message>
+ <source>Sign the message to prove you own this Bitcoin address</source>
+ <translation type="unfinished">签名消息,以证明这个地址属于您</translation>
+ </message>
+ <message>
+ <source>Sign &amp;Message</source>
+ <translation type="unfinished">签名消息(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all sign message fields</source>
+ <translation type="unfinished">清空所有签名消息栏</translation>
+ </message>
+ <message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
+ <source>&amp;Verify Message</source>
+ <translation type="unfinished">消息验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
+ <source>The Bitcoin address the message was signed with</source>
+ <translation type="unfinished">用来签名消息的地址</translation>
+ </message>
+ <message>
+ <source>The signed message to verify</source>
+ <translation type="unfinished">待验证的已签名消息</translation>
+ </message>
+ <message>
+ <source>The signature given when the message was signed</source>
+ <translation type="unfinished">对消息进行签署得到的签名数据</translation>
+ </message>
+ <message>
+ <source>Verify the message to ensure it was signed with the specified Bitcoin address</source>
+ <translation type="unfinished">验证消息,确保消息是由指定的比特币地址签名过的。</translation>
+ </message>
+ <message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
+ <source>Click "Sign Message" to generate signature</source>
+ <translation type="unfinished">单击“签名消息“产生签名。</translation>
+ </message>
+ <message>
+ <source>The entered address is invalid.</source>
+ <translation type="unfinished">输入的地址无效。</translation>
+ </message>
+ <message>
+ <source>Please check the address and try again.</source>
+ <translation type="unfinished">请检查地址后重试。</translation>
+ </message>
+ <message>
+ <source>The entered address does not refer to a key.</source>
+ <translation type="unfinished">找不到与输入地址相关的密钥。</translation>
+ </message>
+ <message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
+ <source>No error</source>
+ <translation type="unfinished">没有错误</translation>
+ </message>
+ <message>
+ <source>Private key for the entered address is not available.</source>
+ <translation type="unfinished">找不到输入地址关联的私钥。</translation>
+ </message>
+ <message>
+ <source>Message signing failed.</source>
+ <translation type="unfinished">消息签名失败。</translation>
+ </message>
+ <message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
+ <source>Please check the signature and try again.</source>
+ <translation type="unfinished">请检查签名后重试。</translation>
+ </message>
+ <message>
+ <source>The signature did not match the message digest.</source>
+ <translation type="unfinished">签名与消息摘要不匹配。</translation>
+ </message>
+ <message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
+ <source>Message verified.</source>
+ <translation type="unfinished">消息验证成功。</translation>
+ </message>
+</context>
<context>
<name>SplashScreen</name>
<message>
@@ -1092,6 +3532,11 @@ For more information on using this console, type %6.
<context>
<name>TransactionDesc</name>
<message>
+ <source>conflicted with a transaction with %1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that conflicts with a confirmed transaction.</extracomment>
+ <translation type="unfinished">与一个有 %1 个确认的交易冲突</translation>
+ </message>
+ <message>
<source>0/unconfirmed, in memory pool</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
<translation type="unfinished">0/未确认,在内存池中</translation>
@@ -1101,37 +3546,387 @@ For more information on using this console, type %6.
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
+ <message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
+ <source>%1/unconfirmed</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
+ <translation type="unfinished">%1/未确认</translation>
+ </message>
+ <message>
+ <source>%1 confirmations</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in 6 or more blocks.</extracomment>
+ <translation type="unfinished">%1 个确认</translation>
+ </message>
+ <message>
+ <source>Status</source>
+ <translation type="unfinished">状态</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Source</source>
+ <translation type="unfinished">来源</translation>
+ </message>
+ <message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
+ <source>From</source>
+ <translation type="unfinished">来自</translation>
+ </message>
+ <message>
+ <source>unknown</source>
+ <translation type="unfinished">未知</translation>
+ </message>
+ <message>
+ <source>To</source>
+ <translation type="unfinished">到</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
+ <source>label</source>
+ <translation type="unfinished">标签</translation>
+ </message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
<numerusform>在%n个区块内成熟</numerusform>
</translation>
</message>
- </context>
+ <message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
+ <source>Total debit</source>
+ <translation type="unfinished">总支出</translation>
+ </message>
+ <message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Net amount</source>
+ <translation type="unfinished">净额</translation>
+ </message>
+ <message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
+ <source>Transaction ID</source>
+ <translation type="unfinished">交易 ID</translation>
+ </message>
+ <message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
+ <source>Transaction virtual size</source>
+ <translation type="unfinished">交易虚拟大小</translation>
+ </message>
+ <message>
+ <source>Output index</source>
+ <translation type="unfinished">输出索引</translation>
+ </message>
+ <message>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
+ </message>
+ <message>
+ <source>Merchant</source>
+ <translation type="unfinished">商家</translation>
+ </message>
+ <message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
+ </message>
+ <message>
+ <source>Inputs</source>
+ <translation type="unfinished">输入</translation>
+ </message>
+ <message>
+ <source>Amount</source>
+ <translation type="unfinished">金额</translation>
+ </message>
+ <message>
+ <source>true</source>
+ <translation type="unfinished">是</translation>
+ </message>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
+<context>
+ <name>TransactionDescDialog</name>
+ <message>
+ <source>This pane shows a detailed description of the transaction</source>
+ <translation type="unfinished">当前面板显示了交易的详细信息</translation>
+ </message>
+ <message>
+ <source>Details for %1</source>
+ <translation type="unfinished">%1 详情</translation>
+ </message>
+</context>
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">类型</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
+ <source>Confirming (%1 of %2 recommended confirmations)</source>
+ <translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
+ </message>
+ <message>
+ <source>Confirmed (%1 confirmations)</source>
+ <translation type="unfinished">已确认 (%1 个确认)</translation>
+ </message>
+ <message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">接收到</translation>
+ </message>
+ <message>
+ <source>Received from</source>
+ <translation type="unfinished">接收自</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">发送到</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">挖矿所得</translation>
+ </message>
+ <message>
+ <source>watch-only</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
+ <source>(n/a)</source>
+ <translation type="unfinished">(不可用)</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(无标签)</translation>
</message>
- </context>
+ <message>
+ <source>Transaction status. Hover over this field to show number of confirmations.</source>
+ <translation type="unfinished">交易状态。 鼠标移到此区域可显示确认数。</translation>
+ </message>
+ <message>
+ <source>Date and time that the transaction was received.</source>
+ <translation type="unfinished">交易被接收的时间和日期。</translation>
+ </message>
+ <message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
+ <source>Whether or not a watch-only address is involved in this transaction.</source>
+ <translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
+ </message>
+ <message>
+ <source>User-defined intent/purpose of the transaction.</source>
+ <translation type="unfinished">用户自定义的该交易的意图/目的。</translation>
+ </message>
+ <message>
+ <source>Amount removed from or added to balance.</source>
+ <translation type="unfinished">从余额增加或移除的金额。</translation>
+ </message>
+</context>
<context>
<name>TransactionView</name>
<message>
+ <source>All</source>
+ <translation type="unfinished">全部</translation>
+ </message>
+ <message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
+ <source>This week</source>
+ <translation type="unfinished">本周</translation>
+ </message>
+ <message>
+ <source>This month</source>
+ <translation type="unfinished">本月</translation>
+ </message>
+ <message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
+ <source>Received with</source>
+ <translation type="unfinished">接收到</translation>
+ </message>
+ <message>
+ <source>Sent to</source>
+ <translation type="unfinished">发送到</translation>
+ </message>
+ <message>
+ <source>Mined</source>
+ <translation type="unfinished">挖矿所得</translation>
+ </message>
+ <message>
+ <source>Other</source>
+ <translation type="unfinished">其它</translation>
+ </message>
+ <message>
+ <source>Enter address, transaction id, or label to search</source>
+ <translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
+ </message>
+ <message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
+ <source>Range…</source>
+ <translation type="unfinished">范围...</translation>
+ </message>
+ <message>
+ <source>&amp;Copy address</source>
+ <translation type="unfinished">复制地址(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;label</source>
+ <translation type="unfinished">复制标签(&amp;L)</translation>
+ </message>
+ <message>
+ <source>Copy &amp;amount</source>
+ <translation type="unfinished">复制金额(&amp;A)</translation>
+ </message>
+ <message>
+ <source>Copy transaction &amp;ID</source>
+ <translation type="unfinished">复制交易 &amp;ID</translation>
+ </message>
+ <message>
+ <source>Copy &amp;raw transaction</source>
+ <translation type="unfinished">复制原始交易(&amp;R)</translation>
+ </message>
+ <message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">复制完整交易详情(&amp;D)</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">显示交易详情(&amp;S)</translation>
+ </message>
+ <message>
+ <source>Increase transaction &amp;fee</source>
+ <translation type="unfinished">增加矿工费(&amp;F)</translation>
+ </message>
+ <message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放弃交易(&amp;B)</translation>
+ </message>
+ <message>
+ <source>&amp;Edit address label</source>
+ <translation type="unfinished">编辑地址标签(&amp;E)</translation>
+ </message>
+ <message>
<source>Show in %1</source>
<extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗号分隔文件</translation>
</message>
<message>
+ <source>Confirmed</source>
+ <translation type="unfinished">已确认</translation>
+ </message>
+ <message>
+ <source>Watch-only</source>
+ <translation type="unfinished">仅观察</translation>
+ </message>
+ <message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
+ <source>Type</source>
+ <translation type="unfinished">类型</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">标签</translation>
</message>
@@ -1143,22 +3938,135 @@ For more information on using this console, type %6.
<source>Exporting Failed</source>
<translation type="unfinished">导出失败</translation>
</message>
- </context>
+ <message>
+ <source>There was an error trying to save the transaction history to %1.</source>
+ <translation type="unfinished">尝试把交易历史保存到 %1 时发生了错误。</translation>
+ </message>
+ <message>
+ <source>Exporting Successful</source>
+ <translation type="unfinished">导出成功</translation>
+ </message>
+ <message>
+ <source>The transaction history was successfully saved to %1.</source>
+ <translation type="unfinished">已成功将交易历史保存到 %1。</translation>
+ </message>
+ <message>
+ <source>Range:</source>
+ <translation type="unfinished">范围:</translation>
+ </message>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
+ <source>No wallet has been loaded.
+Go to File &gt; Open Wallet to load a wallet.
+- OR -</source>
+ <translation type="unfinished">未加载钱包。
+请转到“文件”菜单 &gt; “打开钱包”来加载一个钱包。
+- 或者 -</translation>
+ </message>
+ <message>
+ <source>Create a new wallet</source>
+ <translation type="unfinished">创建一个新的钱包</translation>
+ </message>
+ <message>
<source>Error</source>
<translation type="unfinished">错误</translation>
</message>
- </context>
+ <message>
+ <source>Unable to decode PSBT from clipboard (invalid base64)</source>
+ <translation type="unfinished">无法从剪贴板解码PSBT(Base64值无效)</translation>
+ </message>
+ <message>
+ <source>Load Transaction Data</source>
+ <translation type="unfinished">加载交易数据</translation>
+ </message>
+ <message>
+ <source>Partially Signed Transaction (*.psbt)</source>
+ <translation type="unfinished">部分签名交易 (*.psbt)</translation>
+ </message>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
+ <source>Send Coins</source>
+ <translation type="unfinished">发币</translation>
+ </message>
+ <message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
+ <source>Do you want to increase the fee?</source>
+ <extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
+ <translation type="unfinished">您想追加手续费吗?</translation>
+ </message>
+ <message>
+ <source>Current fee:</source>
+ <translation type="unfinished">当前手续费:</translation>
+ </message>
+ <message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
+ <source>New fee:</source>
+ <translation type="unfinished">新交易费:</translation>
+ </message>
+ <message>
+ <source>Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
+ <translation type="unfinished">警告: 因为在必要的时候会减少找零输出个数或增加输入个数,这可能要付出额外的费用。在没有找零输出的情况下可能会新增一个。这些变更可能会导致潜在的隐私泄露。</translation>
+ </message>
+ <message>
+ <source>Confirm fee bump</source>
+ <translation type="unfinished">确认手续费追加</translation>
+ </message>
+ <message>
+ <source>Can't draft transaction.</source>
+ <translation type="unfinished">无法起草交易。</translation>
+ </message>
+ <message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">已复制PSBT</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
</message>
- </context>
+ <message>
+ <source>Can't sign transaction.</source>
+ <translation type="unfinished">无法签名交易</translation>
+ </message>
+ <message>
+ <source>Could not commit transaction</source>
+ <translation type="unfinished">无法提交交易</translation>
+ </message>
+ <message>
+ <source>Can't display address</source>
+ <translation type="unfinished">无法显示地址</translation>
+ </message>
+ <message>
+ <source>default wallet</source>
+ <translation type="unfinished">默认钱包</translation>
+ </message>
+</context>
<context>
<name>WalletView</name>
<message>
@@ -1167,20 +4075,77 @@ For more information on using this console, type %6.
</message>
<message>
<source>Export the data in the current tab to a file</source>
- <translation type="unfinished">将当前选项卡中的数据导出到文件</translation>
+ <translation type="unfinished">将当前标签页数据导出到文件</translation>
</message>
- </context>
+ <message>
+ <source>Backup Wallet</source>
+ <translation type="unfinished">备份钱包</translation>
+ </message>
+ <message>
+ <source>Wallet Data</source>
+ <extracomment>Name of the wallet data file format.</extracomment>
+ <translation type="unfinished">钱包数据</translation>
+ </message>
+ <message>
+ <source>Backup Failed</source>
+ <translation type="unfinished">备份失败</translation>
+ </message>
+ <message>
+ <source>There was an error trying to save the wallet data to %1.</source>
+ <translation type="unfinished">尝试保存钱包数据至 %1 时发生了错误。</translation>
+ </message>
+ <message>
+ <source>Backup Successful</source>
+ <translation type="unfinished">备份成功</translation>
+ </message>
+ <message>
+ <source>The wallet data was successfully saved to %1.</source>
+ <translation type="unfinished">已成功保存钱包数据至 %1。</translation>
+ </message>
+ <message>
+ <source>Cancel</source>
+ <translation type="unfinished">取消</translation>
+ </message>
+</context>
<context>
<name>bitcoin-core</name>
<message>
+ <source>The %s developers</source>
+ <translation type="unfinished">%s 开发者</translation>
+ </message>
+ <message>
+ <source>%s corrupt. Try using the wallet tool bitcoin-wallet to salvage or restoring a backup.</source>
+ <translation type="unfinished">%s损坏。请尝试用bitcoin-wallet钱包工具来对其进行急救。或者用一个备份进行还原。</translation>
+ </message>
+ <message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s请求监听端口%u。此端口被认为是“坏的”,所以不太可能有其他节点会连接过来。详情以及完整的端口列表请参见 doc/p2p-bad-ports.md 。</translation>
</message>
<message>
+ <source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
+ <translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
+ </message>
+ <message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
+ <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">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
+ </message>
+ <message>
<source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
<translation type="unfinished">%s的磁盘空间可能无法容纳区块文件。大约要在这个目录中储存 %uGB 的数据。</translation>
</message>
<message>
+ <source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
+ <translation type="unfinished">在MIT协议下分发,参见附带的 %s 或 %s 文件</translation>
+ </message>
+ <message>
<source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
<translation type="unfinished">加载钱包时出错。需要下载区块才能加载钱包,而且在使用assumeutxo快照时,下载区块是不按顺序的,这个时候软件不支持加载钱包。在节点同步至高度%s之后就应该可以加载钱包了。</translation>
</message>
@@ -1189,6 +4154,18 @@ For more information on using this console, type %6.
<translation type="unfinished">读取%s出错!交易数据可能丢失或有误。重新扫描钱包中。</translation>
</message>
<message>
+ <source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
+ <translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
+ <translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
+ </message>
+ <message>
<source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
<translation type="unfinished">错误: 旧式钱包只支持 "legacy", "p2sh-segwit", 和 "bech32" 这三种地址类型</translation>
</message>
@@ -1197,16 +4174,100 @@ For more information on using this console, type %6.
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">文件%s已经存在。如果你确定这就是你想做的,先把这个文件挪开。</translation>
+ </message>
+ <message>
<source>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>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多个洋葱路由绑定地址。对自动创建的洋葱服务用%s</translation>
+ </message>
+ <message>
+ <source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">没有提供转储文件。要使用 dump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
+ <source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
+ <translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
+ </message>
+ <message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">区块索引数据库含有历史遗留的 'txindex' 。可以运行完整的 -reindex 来清理被占用的磁盘空间;也可以忽略这个错误。这个错误消息将不会再次显示。</translation>
+ <source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
+ <translation type="unfinished">修剪:上次同步钱包的位置已经超出(落后于)现有修剪后数据的范围。你需要进行-reindex(对于已经启用修剪节点,就需要重新下载整个区块链)</translation>
+ </message>
+ <message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">重命名 '%s' -&gt; '%s' 失败。您需要手动移走或删除无效的快照目录 %s来解决这个问题,不然的话您就会在下一次启动时遇到相同的错误。</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
+ <translation type="unfinished">SQLiteDatabase: SQLite钱包schema版本%d未知。只支持%d版本</translation>
+ </message>
+ <message>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation type="unfinished">区块数据库包含未来的交易,这可能是由本机的日期时间错误引起。若确认本机日期时间正确,请重新建立区块数据库。</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to send after the fee has been deducted</source>
+ <translation type="unfinished">这笔交易在扣除手续费后的金额太小,以至于无法送出</translation>
+ </message>
+ <message>
+ <source>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>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
+ <source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
+ <translation type="unfinished">这是测试用的预发布版本 - 请谨慎使用 - 不要用来挖矿,或者在正式商用环境下使用</translation>
+ </message>
+ <message>
+ <source>This is the maximum transaction fee you pay (in addition to the normal fee) to prioritize partial spend avoidance over regular coin selection.</source>
+ <translation type="unfinished">为了在常规选币过程中优先考虑避免“只花出一个地址上的一部分币”(partial spend)这种情况,您最多还需要(在常规手续费之外)付出的交易手续费。</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you may discard if change is smaller than dust at this level</source>
+ <translation type="unfinished">找零低于当前粉尘阈值时会被舍弃,并计入手续费,这些交易手续费就是在这种情况下产生的。</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you may pay when fee estimates are not available.</source>
+ <translation type="unfinished">不能估计手续费时,你会付出这个手续费金额。</translation>
+ </message>
+ <message>
+ <source>Total length of network version string (%i) exceeds maximum length (%i). Reduce the number or size of uacomments.</source>
+ <translation type="unfinished">网络版本字符串的总长度 (%i) 超过最大长度 (%i) 了。请减少 uacomment 参数的数目或长度。</translation>
+ </message>
+ <message>
+ <source>Unable to replay blocks. You will need to rebuild the database using -reindex-chainstate.</source>
+ <translation type="unfinished">无法重放区块。你需要先用-reindex-chainstate参数来重建数据库。</translation>
+ </message>
+ <message>
+ <source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
+ <translation type="unfinished">提供了未知的钱包格式 "%s" 。请使用 "bdb" 或 "sqlite" 中的一种。</translation>
+ </message>
+ <message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">不支持的类别限定日志等级 %1$s=%2$s 。 预期参数 %1$s=&lt;category&gt;:&lt;loglevel&gt;。 有效的类别: %3$s 。有效的日志等级: %4$s 。</translation>
</message>
<message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
@@ -1217,32 +4278,60 @@ For more information on using this console, type %6.
<translation type="unfinished">钱包创建成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。</translation>
</message>
<message>
- <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <translation type="unfinished">在 -dnsseed 被设为 false 时无法将 -forcednsseed 设为 true 。</translation>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">钱包加载成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。可以使用 migratewallet 命令将旧式钱包迁移至输出描述符钱包。</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">无法完成由之前版本启动的 -txindex 升级。请用之前的版本重新启动,或者进行一次完整的 -reindex 。</translation>
+ <source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
+ <translation type="unfinished">警告: 转储文件的钱包格式 "%s" 与命令行指定的格式 "%s" 不符。</translation>
</message>
<message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上以供诊断问题的原因。</translation>
+ <source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
+ <translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
- <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
- <translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
+ <source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
+ <translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
+ </message>
+ <message>
+ <source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
+ <translation type="unfinished">您需要使用 -reindex 重新构建数据库以回到未修剪模式。这将重新下载整个区块链</translation>
+ </message>
+ <message>
+ <source>%s is set very high!</source>
+ <translation type="unfinished">%s非常高!</translation>
+ </message>
+ <message>
+ <source>-maxmempool must be at least %d MB</source>
+ <translation type="unfinished">-maxmempool 最小为%d MB</translation>
+ </message>
+ <message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
+ <source>Cannot resolve -%s address: '%s'</source>
+ <translation type="unfinished">无法解析 - %s 地址: '%s'</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -blockfilterindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 blockfilterindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
+ <source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
+ <translation type="unfinished">在 -dnsseed 被设为 false 时无法将 -forcednsseed 设为 true 。</translation>
+ </message>
+ <message>
+ <source>Cannot set -peerblockfilters without -blockfilterindex.</source>
+ <translation type="unfinished">没有启用-blockfilterindex,就不能启用-peerblockfilters。</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -coinstatsindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 coinstatsindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
+ <source>Cannot write to data directory '%s'; check permissions.</source>
+ <translation type="unfinished">不能写入到数据目录'%s';请检查文件权限。</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -txindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 txindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
+ <source>%s is set very high! Fees this large could be paid on a single transaction.</source>
+ <translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
</message>
<message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
@@ -1253,6 +4342,10 @@ For more information on using this console, type %6.
<translation type="unfinished">加载%s时出错: 编译时未启用外部签名器支持,却仍然试图加载外部签名器钱包</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">读取 %s 时出错! 所有密钥都被正确读取,但交易数据或地址元数据可能缺失或有误。</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">错误:钱包中的地址簿数据无法被识别为属于迁移后的钱包</translation>
</message>
@@ -1265,12 +4358,16 @@ For more information on using this console, type %6.
<translation type="unfinished">错误:钱包中的交易%s无法被识别为属于迁移后的钱包</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">计算追加手续费失败,因为未确认UTXO依赖了大量未确认交易的簇集。</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">无法重命名无效的 peers.dat 文件。 请移动或删除它,然后重试。</translation>
</message>
<message>
<source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
- <translation type="unfinished">手续费估计失败。而且备用手续费估计(fallbackfee)已被禁用。请再等一些区块,或者启用%s。</translation>
+ <translation type="unfinished">手续费估计失败。而且备用手续费估计(fallbackfee)已被禁用。请再等几个区块,或者启用%s。</translation>
</message>
<message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
@@ -1314,7 +4411,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">未确认UTXO可用,但花掉它们将会创建一条会被内存池拒绝的交易链</translation>
+ <translation type="unfinished">未确认UTXO可用,但花掉它们会创建出一条会被内存池拒绝的交易链</translation>
</message>
<message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
@@ -1339,10 +4436,6 @@ Please try running the latest software version.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">不支持的类别限定日志等级 -loglevel=%s。预期参数 -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s。有效的类别: %s。</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -1359,28 +4452,136 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">区块验证已中断</translation>
</message>
<message>
+ <source>Config setting for %s only applied on %s network when in [%s] section.</source>
+ <translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话。</translation>
+ </message>
+ <message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">无法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
+ <source>Do you want to rebuild the block database now?</source>
+ <translation type="unfinished">你想现在就重建区块数据库吗?</translation>
+ </message>
+ <message>
+ <source>Done loading</source>
+ <translation type="unfinished">加载完成</translation>
+ </message>
+ <message>
+ <source>Dump file %s does not exist.</source>
+ <translation type="unfinished">转储文件 %s 不存在</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
+ <source>Error creating %s</source>
+ <translation type="unfinished">创建%s时出错</translation>
+ </message>
+ <message>
+ <source>Error initializing block database</source>
+ <translation type="unfinished">初始化区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
+ <source>Error loading %s</source>
+ <translation type="unfinished">载入 %s 时发生错误</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Private keys can only be disabled during creation</source>
+ <translation type="unfinished">加载 %s 时出错:只能在创建钱包时禁用私钥。</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet corrupted</source>
+ <translation type="unfinished">%s 加载出错:钱包损坏</translation>
+ </message>
+ <message>
+ <source>Error loading %s: Wallet requires newer version of %s</source>
+ <translation type="unfinished">%s 加载错误:请升级到最新版 %s</translation>
+ </message>
+ <message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
<message>
+ <source>Error reading from database, shutting down.</source>
+ <translation type="unfinished">读取数据库出错,关闭中。</translation>
+ </message>
+ <message>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">从钱包数据库读取下一条记录时出错</translation>
+ </message>
+ <message>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error: Cannot extract destination from the generated scriptpubkey</source>
<translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error: Couldn't create cursor into database</source>
+ <translation type="unfinished">错误: 无法在数据库中创建指针</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Disk space is low for %s</source>
+ <translation type="unfinished">错误: %s 所在的磁盘空间低。</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile checksum does not match. Computed %s, expected %s</source>
+ <translation type="unfinished">错误: 转储文件的校验和不符。计算得到%s,预料中本应该得到%s</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
<translation type="unfinished">错误:创建新仅观察钱包失败</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
+ <source>Error: Got key that was not hex: %s</source>
+ <translation type="unfinished">错误: 得到了不是十六进制的键:%s</translation>
+ </message>
+ <message>
+ <source>Error: Got value that was not hex: %s</source>
+ <translation type="unfinished">错误: 得到了不是十六进制的数值:%s</translation>
+ </message>
+ <message>
+ <source>Error: Keypool ran out, please call keypoolrefill first</source>
+ <translation type="unfinished">错误: 密钥池已被耗尽,请先调用keypoolrefill</translation>
+ </message>
+ <message>
+ <source>Error: Missing checksum</source>
+ <translation type="unfinished">错误:跳过检查检验和</translation>
+ </message>
+ <message>
+ <source>Error: No %s addresses available.</source>
+ <translation type="unfinished">错误: 没有可用的%s地址。</translation>
</message>
<message>
<source>Error: This wallet already uses SQLite</source>
@@ -1399,22 +4600,110 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法为你的钱包创建备份</translation>
</message>
<message>
+ <source>Error: Unable to parse version %u as a uint32_t</source>
+ <translation type="unfinished">错误:无法把版本号%u作为unit32_t解析</translation>
+ </message>
+ <message>
<source>Error: Unable to read all records in the database</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
<message>
+ <source>Error: Unable to write record to new wallet</source>
+ <translation type="unfinished">错误: 无法写入记录到新钱包</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
+ <source>Failed to listen on any port. Use -listen=0 if you want this.</source>
+ <translation type="unfinished">监听端口失败。如果你愿意的话,请使用 -listen=0 参数。</translation>
+ </message>
+ <message>
+ <source>Failed to rescan the wallet during initialization</source>
+ <translation type="unfinished">初始化时重扫描钱包失败</translation>
+ </message>
+ <message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">无法启动索引,关闭中...</translation>
+ </message>
+ <message>
+ <source>Failed to verify database</source>
+ <translation type="unfinished">校验数据库失败</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
+ <source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
+ <translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
+ </message>
+ <message>
+ <source>Ignoring duplicate -wallet %s.</source>
+ <translation type="unfinished">忽略重复的 -wallet %s。</translation>
+ </message>
+ <message>
+ <source>Importing…</source>
+ <translation type="unfinished">导入...</translation>
+ </message>
+ <message>
+ <source>Incorrect or no genesis block found. Wrong datadir for network?</source>
+ <translation type="unfinished">没有找到创世区块,或者创世区块不正确。是否把数据目录错误地设成了另一个网络(比如测试网络)的?</translation>
+ </message>
+ <message>
+ <source>Initialization sanity check failed. %s is shutting down.</source>
+ <translation type="unfinished">初始化完整性检查失败。%s 即将关闭。</translation>
+ </message>
+ <message>
<source>Input not found or already spent</source>
- <translation type="unfinished">找不到交易項,或可能已經花掉了</translation>
+ <translation type="unfinished">找不到交易输入项,可能已经被花掉了</translation>
</message>
<message>
<source>Insufficient dbcache for block verification</source>
<translation type="unfinished">dbcache不足以用于区块验证</translation>
</message>
<message>
+ <source>Insufficient funds</source>
+ <translation type="unfinished">金额不足</translation>
+ </message>
+ <message>
+ <source>Invalid -i2psam address or hostname: '%s'</source>
+ <translation type="unfinished">无效的 -i2psam 地址或主机名: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid -onion address or hostname: '%s'</source>
+ <translation type="unfinished">无效的 -onion 地址: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid -proxy address or hostname: '%s'</source>
+ <translation type="unfinished">无效的 -proxy 地址或主机名: '%s'</translation>
+ </message>
+ <message>
+ <source>Invalid P2P permission: '%s'</source>
+ <translation type="unfinished">无效的 P2P 权限:'%s'</translation>
+ </message>
+ <message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least %s)</source>
<translation type="unfinished">%s=&lt;amount&gt;: '%s' 中指定了非法的金额 (必须至少达到 %s)</translation>
</message>
@@ -1423,6 +4712,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">%s=&lt;amount&gt;: '%s' 中指定了非法的金额</translation>
</message>
<message>
+ <source>Invalid amount for -%s=&lt;amount&gt;: '%s'</source>
+ <translation type="unfinished">参数 -%s=&lt;amount&gt;: '%s' 指定了无效的金额</translation>
+ </message>
+ <message>
+ <source>Invalid netmask specified in -whitelist: '%s'</source>
+ <translation type="unfinished">参数 -whitelist: '%s' 指定了无效的网络掩码</translation>
+ </message>
+ <message>
<source>Invalid port specified in %s: '%s'</source>
<translation type="unfinished">%s指定了无效的端口号: '%s'</translation>
</message>
@@ -1435,16 +4732,40 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">监听外部连接失败 (listen函数返回了错误 %s)</translation>
</message>
<message>
+ <source>Loading P2P addresses…</source>
+ <translation type="unfinished">加载P2P地址...</translation>
+ </message>
+ <message>
+ <source>Loading banlist…</source>
+ <translation type="unfinished">加载封禁列表...</translation>
+ </message>
+ <message>
+ <source>Loading block index…</source>
+ <translation type="unfinished">加载区块索引...</translation>
+ </message>
+ <message>
+ <source>Loading wallet…</source>
+ <translation type="unfinished">加载钱包...</translation>
+ </message>
+ <message>
<source>Missing amount</source>
- <translation type="unfinished">缺少金額</translation>
+ <translation type="unfinished">找不到金额</translation>
</message>
<message>
<source>Missing solving data for estimating transaction size</source>
- <translation type="unfinished">缺少用於估計交易規模的求解數據</translation>
+ <translation type="unfinished">找不到用于估计交易大小的解答数据</translation>
+ </message>
+ <message>
+ <source>Need to specify a port with -whitebind: '%s'</source>
+ <translation type="unfinished">-whitebind: '%s' 需要指定一个端口</translation>
</message>
<message>
<source>No addresses available</source>
- <translation type="unfinished">沒有可用的地址</translation>
+ <translation type="unfinished">没有可用的地址</translation>
+ </message>
+ <message>
+ <source>Not enough file descriptors available.</source>
+ <translation type="unfinished">没有足够的文件描述符可用。</translation>
</message>
<message>
<source>Not found pre-selected input %s</source>
@@ -1455,36 +4776,236 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">无法求解的预先选择输入%s</translation>
</message>
<message>
+ <source>Prune cannot be configured with a negative value.</source>
+ <translation type="unfinished">不能把修剪配置成一个负数。</translation>
+ </message>
+ <message>
+ <source>Prune mode is incompatible with -txindex.</source>
+ <translation type="unfinished">修剪模式与 -txindex 不兼容。</translation>
+ </message>
+ <message>
+ <source>Pruning blockstore…</source>
+ <translation type="unfinished">修剪区块存储...</translation>
+ </message>
+ <message>
+ <source>Reducing -maxconnections from %d to %d, because of system limitations.</source>
+ <translation type="unfinished">因为系统的限制,将 -maxconnections 参数从 %d 降到了 %d</translation>
+ </message>
+ <message>
+ <source>Replaying blocks…</source>
+ <translation type="unfinished">重放区块...</translation>
+ </message>
+ <message>
+ <source>Rescanning…</source>
+ <translation type="unfinished">重扫描...</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Failed to execute statement to verify database: %s</source>
+ <translation type="unfinished">SQLiteDatabase: 执行校验数据库语句时失败: %s</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Failed to prepare statement to verify database: %s</source>
+ <translation type="unfinished">SQLiteDatabase: 预处理用于校验数据库的语句时失败: %s</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Failed to read database verification error: %s</source>
+ <translation type="unfinished">SQLiteDatabase: 读取数据库失败,校验错误: %s</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Unexpected application id. Expected %u, got %u</source>
+ <translation type="unfinished">SQLiteDatabase: 意料之外的应用ID。预期为%u,实际为%u</translation>
+ </message>
+ <message>
+ <source>Section [%s] is not recognized.</source>
+ <translation type="unfinished">无法识别配置章节 [%s]。</translation>
+ </message>
+ <message>
+ <source>Signing transaction failed</source>
+ <translation type="unfinished">签名交易失败</translation>
+ </message>
+ <message>
+ <source>Specified -walletdir "%s" does not exist</source>
+ <translation type="unfinished">参数 -walletdir "%s" 指定了不存在的路径</translation>
+ </message>
+ <message>
+ <source>Specified -walletdir "%s" is a relative path</source>
+ <translation type="unfinished">参数 -walletdir "%s" 指定了相对路径</translation>
+ </message>
+ <message>
+ <source>Specified -walletdir "%s" is not a directory</source>
+ <translation type="unfinished">参数 -walletdir "%s" 指定的路径不是目录</translation>
+ </message>
+ <message>
+ <source>Specified blocks directory "%s" does not exist.</source>
+ <translation type="unfinished">指定的区块目录"%s"不存在。</translation>
+ </message>
+ <message>
<source>Specified data directory "%s" does not exist.</source>
<translation type="unfinished">指定的数据目录 "%s" 不存在。</translation>
</message>
<message>
+ <source>Starting network threads…</source>
+ <translation type="unfinished">启动网络线程...</translation>
+ </message>
+ <message>
+ <source>The source code is available from %s.</source>
+ <translation type="unfinished">可以从 %s 获取源代码。</translation>
+ </message>
+ <message>
+ <source>The specified config file %s does not exist</source>
+ <translation type="unfinished">指定的配置文件%s不存在</translation>
+ </message>
+ <message>
+ <source>The transaction amount is too small to pay the fee</source>
+ <translation type="unfinished">交易金额太小,不足以支付交易费</translation>
+ </message>
+ <message>
+ <source>The wallet will avoid paying less than the minimum relay fee.</source>
+ <translation type="unfinished">钱包会避免让手续费低于最小转发费率(minrelay fee)。</translation>
+ </message>
+ <message>
+ <source>This is experimental software.</source>
+ <translation type="unfinished">这是实验性的软件。</translation>
+ </message>
+ <message>
+ <source>This is the minimum transaction fee you pay on every transaction.</source>
+ <translation type="unfinished">这是你每次交易付款时最少要付的手续费。</translation>
+ </message>
+ <message>
+ <source>This is the transaction fee you will pay if you send a transaction.</source>
+ <translation type="unfinished">如果发送交易,这将是你要支付的手续费。</translation>
+ </message>
+ <message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
+ <source>Transaction amount too small</source>
+ <translation type="unfinished">交易金额太小</translation>
+ </message>
+ <message>
+ <source>Transaction amounts must not be negative</source>
+ <translation type="unfinished">交易金额不不可为负数</translation>
+ </message>
+ <message>
<source>Transaction change output index out of range</source>
- <translation type="unfinished">交易尋找零輸出項超出範圍</translation>
+ <translation type="unfinished">交易找零输出项编号超出范围</translation>
+ </message>
+ <message>
+ <source>Transaction must have at least one recipient</source>
+ <translation type="unfinished">交易必须包含至少一个收款人</translation>
</message>
<message>
<source>Transaction needs a change address, but we can't generate it.</source>
<translation type="unfinished">交易需要一个找零地址,但是我们无法生成它。</translation>
</message>
<message>
+ <source>Transaction too large</source>
+ <translation type="unfinished">交易过大</translation>
+ </message>
+ <message>
<source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
<translation type="unfinished">无法为 -maxsigcachesize: '%s' MiB 分配内存</translation>
</message>
<message>
+ <source>Unable to bind to %s on this computer (bind returned error %s)</source>
+ <translation type="unfinished">无法在本机绑定%s端口 (bind函数返回了错误 %s)</translation>
+ </message>
+ <message>
+ <source>Unable to bind to %s on this computer. %s is probably already running.</source>
+ <translation type="unfinished">无法在本机绑定 %s 端口。%s 可能已经在运行。</translation>
+ </message>
+ <message>
+ <source>Unable to create the PID file '%s': %s</source>
+ <translation type="unfinished">无法创建PID文件'%s': %s</translation>
+ </message>
+ <message>
<source>Unable to find UTXO for external input</source>
<translation type="unfinished">无法为外部输入找到UTXO</translation>
</message>
<message>
+ <source>Unable to generate initial keys</source>
+ <translation type="unfinished">无法生成初始密钥</translation>
+ </message>
+ <message>
+ <source>Unable to generate keys</source>
+ <translation type="unfinished">无法生成密钥</translation>
+ </message>
+ <message>
+ <source>Unable to open %s for writing</source>
+ <translation type="unfinished">无法打开%s用于写入</translation>
+ </message>
+ <message>
<source>Unable to parse -maxuploadtarget: '%s'</source>
- <translation type="unfinished">無法解析-最大上傳目標:'%s'</translation>
+ <translation type="unfinished">无法解析 -maxuploadtarget: '%s'</translation>
+ </message>
+ <message>
+ <source>Unable to start HTTP server. See debug log for details.</source>
+ <translation type="unfinished">无法启动HTTP服务,查看日志获取更多信息</translation>
</message>
<message>
<source>Unable to unload the wallet before migrating</source>
<translation type="unfinished">在迁移前无法卸载钱包</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">不支持的全局日志等级 -loglevel=%s 。有效的数值:%s 。</translation>
+ <source>Unknown -blockfilterindex value %s.</source>
+ <translation type="unfinished">未知的 -blockfilterindex 数值 %s。</translation>
+ </message>
+ <message>
+ <source>Unknown address type '%s'</source>
+ <translation type="unfinished">未知的地址类型 '%s'</translation>
+ </message>
+ <message>
+ <source>Unknown change type '%s'</source>
+ <translation type="unfinished">未知的找零类型 '%s'</translation>
+ </message>
+ <message>
+ <source>Unknown network specified in -onlynet: '%s'</source>
+ <translation type="unfinished">-onlynet 指定的是未知网络: %s</translation>
+ </message>
+ <message>
+ <source>Unknown new rules activated (versionbit %i)</source>
+ <translation type="unfinished">不明的交易规则已经激活 (versionbit %i)</translation>
+ </message>
+ <message>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s 。</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">%s链上 acceptstalefeeestimates 不受支持。</translation>
+ </message>
+ <message>
+ <source>Unsupported logging category %s=%s.</source>
+ <translation type="unfinished">不支持的日志分类 %s=%s。</translation>
+ </message>
+ <message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
+ <source>User Agent comment (%s) contains unsafe characters.</source>
+ <translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
+ </message>
+ <message>
+ <source>Verifying blocks…</source>
+ <translation type="unfinished">验证区块...</translation>
+ </message>
+ <message>
+ <source>Verifying wallet(s)…</source>
+ <translation type="unfinished">验证钱包...</translation>
+ </message>
+ <message>
+ <source>Wallet needed to be rewritten: restart %s to complete</source>
+ <translation type="unfinished">钱包需要被重写:请重新启动%s来完成</translation>
</message>
<message>
<source>Settings file could not be read</source>
diff --git a/src/qt/locale/bitcoin_zh_HK.ts b/src/qt/locale/bitcoin_zh_HK.ts
index 492937c0e7..55551bfe71 100644
--- a/src/qt/locale/bitcoin_zh_HK.ts
+++ b/src/qt/locale/bitcoin_zh_HK.ts
@@ -58,14 +58,6 @@
<translation type="unfinished">選擇 &amp;h</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">付款地址</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">收款地址</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">這些是你要付款過去的 Bitcoin 位址。在付款之前,務必要檢查金額和收款位址是否正確。</translation>
</message>
@@ -101,6 +93,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">儲存地址列表到 %1 時發生錯誤。請再試一次。</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">付款地址 - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">收款地址 - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">匯出失敗</translation>
</message>
@@ -298,6 +298,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金额</translation>
</message>
@@ -306,11 +318,25 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">輸入一個 Bitcoin 位址 (例如 %1)</translation>
</message>
<message>
+ <source>Unroutable</source>
+ <translation type="unfinished">不可路由</translation>
+ </message>
+ <message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
<message>
+ <source>Outbound</source>
+ <extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
+ </message>
+ <message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
<translation type="unfinished">区块转发</translation>
@@ -321,6 +347,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手册</translation>
</message>
<message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
+ </message>
+ <message>
<source>%1 d</source>
<translation type="unfinished">%1 日</translation>
</message>
@@ -689,8 +725,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">关闭所有钱包</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">迁移一个钱包</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
- <translation type="unfinished">显示%1帮助消息以获得可能包含Bitcoin命令行选项的列表</translation>
+ <translation type="unfinished">显示 %1 帮助信息,获取可用命令行选项列表</translation>
</message>
<message>
<source>&amp;Mask values</source>
@@ -784,6 +828,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">預先同步標頭(%1%)</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">创建钱包时出错</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">无法创建新钱包,软件编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
<translation type="unfinished">錯誤: %1</translation>
</message>
@@ -828,6 +880,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</translation>
</message>
<message>
+ <source>Sent transaction</source>
+ <translation type="unfinished">送出交易</translation>
+ </message>
+ <message>
<source>Incoming transaction</source>
<translation type="unfinished">收款交易</translation>
</message>
@@ -848,6 +904,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;解鎖中&lt;/b&gt;</translation>
</message>
<message>
+ <source>Wallet is &lt;b&gt;encrypted&lt;/b&gt; and currently &lt;b&gt;locked&lt;/b&gt;</source>
+ <translation type="unfinished">錢包&lt;b&gt;已加密&lt;/b&gt;並且&lt;b&gt;上鎖中&lt;/b&gt;</translation>
+ </message>
+ <message>
<source>Original message:</source>
<translation type="unfinished">原消息:</translation>
</message>
@@ -866,14 +926,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手动选币</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
+ <source>Quantity:</source>
+ <translation type="unfinished">总量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組數:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">费用:</translation>
</message>
<message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
+ <source>(un)select all</source>
+ <translation type="unfinished">全(不)选</translation>
+ </message>
+ <message>
<source>Tree mode</source>
<translation type="unfinished">树状模式</translation>
</message>
@@ -886,10 +966,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">金额</translation>
</message>
<message>
+ <source>Received with label</source>
+ <translation type="unfinished">收款标签</translation>
+ </message>
+ <message>
<source>Received with address</source>
<translation type="unfinished">收款地址</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Confirmed</source>
<translation type="unfinished">已確認</translation>
</message>
@@ -918,6 +1006,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">锁定未花费(&amp;O)</translation>
</message>
<message>
+ <source>&amp;Unlock unspent</source>
+ <translation type="unfinished">解锁未花费(&amp;U)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -934,10 +1026,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -946,14 +1034,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(%1已锁定)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">是</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">當任何一個收款金額小於目前的灰塵金額上限時,文字會變紅色。</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">每个输入可能有 +/- %1 聪 (satoshi) 的误差。</translation>
</message>
@@ -965,7 +1045,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>change from %1 (%2)</source>
<translation type="unfinished">找零來自於 %1 (%2)</translation>
</message>
- </context>
+ <message>
+ <source>(change)</source>
+ <translation type="unfinished">(找零)</translation>
+ </message>
+</context>
<context>
<name>CreateWalletActivity</name>
<message>
@@ -996,6 +1080,57 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您确定想要迁移钱包&lt;i&gt;%1&lt;/i&gt;吗?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">迁移钱包将会把这个钱包转换成一个或多个输出描述符钱包。将会需要创建一个新的钱包备份。
+如果这个钱包包含仅观察脚本,将会创建包含那些仅观察脚本的新钱包。
+如果这个钱包包含可解但又未被监视的脚本,将会创建一个不同的钱包以包含那些脚本。
+
+迁移过程开始前将会创建一个钱包备份。备份文件将会被命名为 &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak 然后被保存在该钱包所在目录下。如果迁移过程出错,可以使用“恢复钱包”功能恢复备份。</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">迁移钱包</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">迁移钱包 &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">已成功迁移钱包 '%1' 。</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">迁移失败</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">迁移成功</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1053,7 +1188,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Closing the wallet for too long can result in having to resync the entire chain if pruning is enabled.</source>
<translation type="unfinished">启用修剪时,如果一个钱包被卸载太久,就必须重新同步整条区块链才能再次加载它。</translation>
</message>
- </context>
+ <message>
+ <source>Close all wallets</source>
+ <translation type="unfinished">关闭所有钱包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to close all wallets?</source>
+ <translation type="unfinished">您确定想要关闭所有钱包吗?</translation>
+ </message>
+</context>
<context>
<name>CreateWalletDialog</name>
<message>
@@ -1061,8 +1204,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">新增錢包</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">距离创建您的新钱包只有一步之遥了!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">请指定一个名字,如果需要的话还可以启用高级选项</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
- <translation type="unfinished">錢包名稱</translation>
+ <translation type="unfinished">钱包名称</translation>
</message>
<message>
<source>Wallet</source>
@@ -1093,12 +1244,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">製作空白錢包</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">使用输出描述符进行scriptPubKey管理</translation>
- </message>
- <message>
- <source>Compiled without sqlite support (required for descriptor wallets)</source>
- <translation type="unfinished">编译时未启用SQLite支持(输出描述符钱包需要它)</translation>
+ <source>Create</source>
+ <translation type="unfinished">创建</translation>
</message>
</context>
<context>
@@ -1120,6 +1267,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">跟這個地址清單關聯的地址。只有發送地址能被修改。</translation>
</message>
<message>
+ <source>&amp;Address</source>
+ <translation type="unfinished">地址(&amp;A)</translation>
+ </message>
+ <message>
<source>New sending address</source>
<translation type="unfinished">新建付款地址</translation>
</message>
@@ -1132,6 +1283,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">编辑付款地址</translation>
</message>
<message>
+ <source>Address "%1" already exists as a receiving address with label "%2" and so cannot be added as a sending address.</source>
+ <translation type="unfinished">地址“%1”已经存在,它是一个收款地址,标签为“%2”,所以它不能作为一个付款地址被添加进来。</translation>
+ </message>
+ <message>
<source>The entered address "%1" is already in the address book with label "%2".</source>
<translation type="unfinished">输入的地址“%1”已经存在于地址簿中,标签为“%2”。</translation>
</message>
@@ -1151,10 +1306,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">就要產生新的資料目錄。</translation>
</message>
<message>
+ <source>name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Directory already exists. Add %1 if you intend to create a new directory here.</source>
<translation type="unfinished">已經有這個目錄了。如果你要在裡面造出新的目錄的話,請加上 %1.</translation>
</message>
<message>
+ <source>Path already exists, and is not a directory.</source>
+ <translation type="unfinished">路径已存在,并且不是一个目录。</translation>
+ </message>
+ <message>
<source>Cannot create data directory here.</source>
<translation type="unfinished">无法在此创建数据目录。</translation>
</message>
@@ -1176,7 +1339,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
- <numerusform>(完整區塊鏈需要%n GB)</numerusform>
+ <numerusform>(完整區塊鏈需要%n GB)</numerusform>
</translation>
</message>
<message>
@@ -1227,6 +1390,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">由于这是第一次启动此程序,您可以选择%1存储数据的位置</translation>
</message>
<message>
+ <source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
+ <translation type="unfinished">取消此设置需要重新下载整个区块链。先完整下载整条链再进行修剪会更快。这会禁用一些高级功能。</translation>
+ </message>
+ <message>
<source>This initial synchronisation is very demanding, and may expose hardware problems with your computer that had previously gone unnoticed. Each time you run %1, it will continue downloading where it left off.</source>
<translation type="unfinished">初始化同步过程是非常吃力的,同时可能会暴露您之前没有注意到的电脑硬件问题。你每次启动%1时,它都会从之前中断的地方继续下载。</translation>
</message>
@@ -1338,7 +1505,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Open bitcoin URI</source>
<translation type="unfinished">打开比特币URI</translation>
</message>
- </context>
+ <message>
+ <source>Paste address from clipboard</source>
+ <extracomment>Tooltip text for button that allows you to paste an address that is in your clipboard.</extracomment>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+</context>
<context>
<name>OptionsDialog</name>
<message>
@@ -1346,6 +1518,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">選項</translation>
</message>
<message>
+ <source>&amp;Main</source>
+ <translation type="unfinished">主要(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Automatically start %1 after logging in to the system.</source>
+ <translation type="unfinished">在登入系统后自动启动 %1</translation>
+ </message>
+ <message>
<source>&amp;Start %1 on system login</source>
<translation type="unfinished">系统登入时启动 %1 (&amp;S)</translation>
</message>
@@ -1354,6 +1534,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
</message>
<message>
+ <source>Size of &amp;database cache</source>
+ <translation type="unfinished">数据库缓存大小(&amp;D)</translation>
+ </message>
+ <message>
+ <source>Number of script &amp;verification threads</source>
+ <translation type="unfinished">脚本验证线程数(&amp;V)</translation>
+ </message>
+ <message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
<translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
</message>
@@ -1370,6 +1558,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口被关闭时最小化程序而不是退出。当此选项启用时,只有在菜单中选择“退出”时才会让程序退出。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
</message>
@@ -1394,6 +1586,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">网络(&amp;N)</translation>
</message>
<message>
+ <source>Prune &amp;block storage to</source>
+ <translation type="unfinished">将区块存储修剪至(&amp;B)</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain.</source>
<translation type="unfinished">警告:还原此设置需要重新下载整个区块链。</translation>
</message>
@@ -1422,6 +1618,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">启用R&amp;PC服务器</translation>
</message>
<message>
+ <source>W&amp;allet</source>
+ <translation type="unfinished">钱包(&amp;A)</translation>
+ </message>
+ <message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
<translation type="unfinished">是否要默认从金额中减去手续费。</translation>
@@ -1432,10 +1632,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
</message>
<message>
+ <source>Expert</source>
+ <translation type="unfinished">专家</translation>
+ </message>
+ <message>
+ <source>Enable coin &amp;control features</source>
+ <translation type="unfinished">启用手动选币功能(&amp;C)</translation>
+ </message>
+ <message>
<source>If you disable the spending of unconfirmed change, the change from a transaction cannot be used until that transaction has at least one confirmation. This also affects how your balance is computed.</source>
<translation type="unfinished">如果您禁止动用尚未确认的找零资金,则一笔交易的找零资金至少需要有1个确认后才能动用。这同时也会影响账户余额的计算。</translation>
</message>
<message>
+ <source>&amp;Spend unconfirmed change</source>
+ <translation type="unfinished">动用尚未确认的找零资金(&amp;S)</translation>
+ </message>
+ <message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
<translation type="unfinished">启用&amp;PSBT控件</translation>
@@ -1446,10 +1658,30 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">是否要显示PSBT控件</translation>
</message>
<message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
+ </message>
+ <message>
<source>&amp;External signer script path</source>
<translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器开启了 UPnP 选项时此功能才会有用。</translation>
+ </message>
+ <message>
+ <source>Map port using &amp;UPnP</source>
+ <translation type="unfinished">使用 &amp;UPnP 映射端口</translation>
+ </message>
+ <message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1466,6 +1698,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">通过 SO&amp;CKS5 代理连接(默认代理):</translation>
</message>
<message>
+ <source>Proxy &amp;IP:</source>
+ <translation type="unfinished">代理服务器 &amp;IP:</translation>
+ </message>
+ <message>
+ <source>&amp;Port:</source>
+ <translation type="unfinished">端口(&amp;P):</translation>
+ </message>
+ <message>
<source>Port of the proxy (e.g. 9050)</source>
<translation type="unfinished">代理伺服器的通訊埠(像是 9050)</translation>
</message>
@@ -1478,6 +1718,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">窗口(&amp;W)</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1490,6 +1738,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">单击关闭按钮时最小化(&amp;I)</translation>
</message>
<message>
+ <source>&amp;Display</source>
+ <translation type="unfinished">显示(&amp;D)</translation>
+ </message>
+ <message>
<source>User Interface &amp;language:</source>
<translation type="unfinished">使用界面語言(&amp;L):</translation>
</message>
@@ -1514,22 +1766,39 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">第三方交易网址(&amp;T)</translation>
</message>
<message>
+ <source>Whether to show coin control features or not.</source>
+ <translation type="unfinished">是否显示手动选币功能。</translation>
+ </message>
+ <message>
<source>Connect to the Bitcoin network through a separate SOCKS5 proxy for Tor onion services.</source>
<translation type="unfinished">连接比特币网络时专门为Tor onion服务使用另一个 SOCKS5 代理。</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
+ <source>Use separate SOCKS&amp;5 proxy to reach peers via Tor onion services:</source>
+ <translation type="unfinished">连接Tor onion服务节点时使用另一个SOCKS&amp;5代理:</translation>
</message>
<message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
+ <source>&amp;OK</source>
+ <translation type="unfinished">确定(&amp;O)</translation>
+ </message>
+ <message>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished">取消(&amp;C)</translation>
</message>
<message>
<source>default</source>
<translation type="unfinished">預設值</translation>
</message>
<message>
+ <source>none</source>
+ <translation type="unfinished">无</translation>
+ </message>
+ <message>
+ <source>Confirm options reset</source>
+ <extracomment>Window title text of pop-up window shown when the user has chosen to reset options.</extracomment>
+ <translation type="unfinished">确认恢复默认设置</translation>
+ </message>
+ <message>
<source>Client restart required to activate changes.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished">需要重新開始客戶端軟體來讓改變生效。</translation>
@@ -1570,7 +1839,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>The configuration file could not be opened.</source>
<translation type="unfinished">无法打开配置文件。</translation>
</message>
- </context>
+ <message>
+ <source>This change would require a client restart.</source>
+ <translation type="unfinished">此更改需要重启客户端。</translation>
+ </message>
+ <message>
+ <source>The supplied proxy address is invalid.</source>
+ <translation type="unfinished">提供的代理服务器地址无效。</translation>
+ </message>
+</context>
<context>
<name>OptionsModel</name>
<message>
@@ -1589,6 +1866,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">顯示的資訊可能是過期的。跟 Bitcoin 網路的連線建立後,你的錢包會自動和網路同步,但是這個步驟還沒完成。</translation>
</message>
<message>
+ <source>Watch-only:</source>
+ <translation type="unfinished">仅观察:</translation>
+ </message>
+ <message>
<source>Available:</source>
<translation type="unfinished">可用金額:</translation>
</message>
@@ -1617,10 +1898,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">餘額</translation>
</message>
<message>
+ <source>Total:</source>
+ <translation type="unfinished">总额:</translation>
+ </message>
+ <message>
<source>Your current total balance</source>
<translation type="unfinished">您当前的总余额</translation>
</message>
<message>
+ <source>Your current balance in watch-only addresses</source>
+ <translation type="unfinished">您当前在仅观察观察地址中的余额</translation>
+ </message>
+ <message>
+ <source>Spendable:</source>
+ <translation type="unfinished">可动用:</translation>
+ </message>
+ <message>
<source>Recent transactions</source>
<translation type="unfinished">最近的交易</translation>
</message>
@@ -1629,6 +1922,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">仅观察地址的未确认交易</translation>
</message>
<message>
+ <source>Mined balance in watch-only addresses that has not yet matured</source>
+ <translation type="unfinished">仅观察地址中尚未成熟的挖矿收入余额:</translation>
+ </message>
+ <message>
<source>Current total balance in watch-only addresses</source>
<translation type="unfinished">仅观察地址中的当前总余额</translation>
</message>
@@ -1664,6 +1961,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">關閉</translation>
</message>
<message>
+ <source>Failed to load transaction: %1</source>
+ <translation type="unfinished">加载交易失败: %1</translation>
+ </message>
+ <message>
+ <source>Failed to sign transaction: %1</source>
+ <translation type="unfinished">签名交易失败: %1</translation>
+ </message>
+ <message>
<source>Cannot sign inputs while wallet is locked.</source>
<translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
</message>
@@ -1676,6 +1981,22 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">已签名 %1 个交易输入项,但是仍然还有余下的项目需要签名。</translation>
</message>
<message>
+ <source>Signed transaction successfully. Transaction is ready to broadcast.</source>
+ <translation type="unfinished">成功签名交易。交易已经可以广播。</translation>
+ </message>
+ <message>
+ <source>Unknown error processing transaction.</source>
+ <translation type="unfinished">处理交易时遇到未知错误。</translation>
+ </message>
+ <message>
+ <source>PSBT copied to clipboard.</source>
+ <translation type="unfinished">已复制PSBT到剪贴板</translation>
+ </message>
+ <message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -1685,6 +2006,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">PSBT已保存到硬盘</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
+ <source>Unable to calculate transaction fee or total transaction amount.</source>
+ <translation type="unfinished">无法计算交易费用或总交易金额。</translation>
+ </message>
+ <message>
<source>Pays transaction fee: </source>
<translation type="unfinished">支付交易费用:</translation>
</message>
@@ -1713,6 +2046,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(但这个钱包不能签名交易)</translation>
</message>
<message>
+ <source>(But this wallet does not have the right keys.)</source>
+ <translation type="unfinished">(但这个钱包没有正确的密钥)</translation>
+ </message>
+ <message>
+ <source>Transaction is fully signed and ready for broadcast.</source>
+ <translation type="unfinished">交易已经完全签名,可以广播。</translation>
+ </message>
+ <message>
<source>Transaction status is unknown.</source>
<translation type="unfinished">交易状态未知。</translation>
</message>
@@ -1724,6 +2065,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">支付请求出错</translation>
</message>
<message>
+ <source>Cannot start bitcoin: click-to-pay handler</source>
+ <translation type="unfinished">无法启动 bitcoin: 协议的“一键支付”处理程序</translation>
+ </message>
+ <message>
<source>URI handling</source>
<translation type="unfinished">URI 處理</translation>
</message>
@@ -1800,7 +2145,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<extracomment>An Inbound Connection from a Peer.</extracomment>
<translation type="unfinished">進來</translation>
</message>
- </context>
+ <message>
+ <source>Outbound</source>
+ <extracomment>An Outbound Connection to a Peer.</extracomment>
+ <translation type="unfinished">傳出</translation>
+ </message>
+</context>
<context>
<name>QRImageWidget</name>
<message>
@@ -1808,10 +2158,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>&amp;Copy Image</source>
+ <translation type="unfinished">复制图像(&amp;C)</translation>
+ </message>
+ <message>
+ <source>Resulting URI too long, try to reduce the text for label / message.</source>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
+ </message>
+ <message>
<source>Error encoding URI into QR Code.</source>
<translation type="unfinished">把 URI 编码成二维码时发生错误。</translation>
</message>
<message>
+ <source>QR code support not available.</source>
+ <translation type="unfinished">不支持二维码。</translation>
+ </message>
+ <message>
<source>Save QR Code</source>
<translation type="unfinished">儲存 QR 碼</translation>
</message>
@@ -1848,6 +2210,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">区块存储目录</translation>
</message>
<message>
+ <source>To specify a non-default location of the blocks directory use the '%1' option.</source>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
+ </message>
+ <message>
<source>Startup time</source>
<translation type="unfinished">啓動時間</translation>
</message>
@@ -1856,6 +2222,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">网络</translation>
</message>
<message>
+ <source>Name</source>
+ <translation type="unfinished">名称</translation>
+ </message>
+ <message>
<source>Number of connections</source>
<translation type="unfinished">連線數</translation>
</message>
@@ -1864,10 +2234,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">區塊鏈</translation>
</message>
<message>
+ <source>Memory Pool</source>
+ <translation type="unfinished">内存池</translation>
+ </message>
+ <message>
+ <source>Current number of transactions</source>
+ <translation type="unfinished">当前交易数量</translation>
+ </message>
+ <message>
<source>Memory usage</source>
<translation type="unfinished">内存使用</translation>
</message>
<message>
+ <source>Wallet: </source>
+ <translation type="unfinished">钱包:</translation>
+ </message>
+ <message>
<source>(none)</source>
<translation type="unfinished">(无)</translation>
</message>
@@ -1896,6 +2278,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">选择节点查看详细信息。</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">传输层版本: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">传输</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">十六进制格式的BIP324会话ID,如果有的话。</translation>
+ </message>
+ <message>
+ <source>Session ID</source>
+ <translation type="unfinished">会话ID</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">版本</translation>
</message>
@@ -1908,10 +2306,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">交易转发</translation>
</message>
<message>
+ <source>Starting Block</source>
+ <translation type="unfinished">起步区块</translation>
+ </message>
+ <message>
<source>Synced Headers</source>
<translation type="unfinished">已同步前導資料</translation>
</message>
<message>
+ <source>Synced Blocks</source>
+ <translation type="unfinished">已同步区块</translation>
+ </message>
+ <message>
<source>Last Transaction</source>
<translation type="unfinished">最近交易</translation>
</message>
@@ -1966,6 +2372,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">当前区块高度</translation>
</message>
<message>
+ <source>Open the %1 debug log file from the current data directory. This can take a few seconds for large log files.</source>
+ <translation type="unfinished">打开当前数据目录中的 %1 调试日志文件。日志文件大的话可能要等上几秒钟。</translation>
+ </message>
+ <message>
<source>Decrease font size</source>
<translation type="unfinished">缩小字体大小</translation>
</message>
@@ -2002,10 +2412,23 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">高带宽</translation>
</message>
<message>
+ <source>Connection Time</source>
+ <translation type="unfinished">连接时间</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
<source>Last Block</source>
<translation type="unfinished">上一个区块</translation>
</message>
<message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
+ </message>
+ <message>
<source>Last Send</source>
<translation type="unfinished">最近送出</translation>
</message>
@@ -2014,6 +2437,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">上次接收</translation>
</message>
<message>
+ <source>Ping Time</source>
+ <translation type="unfinished">Ping 延时</translation>
+ </message>
+ <message>
<source>The duration of a currently outstanding ping.</source>
<translation type="unfinished">目前这一次 ping 已经过去的时间。</translation>
</message>
@@ -2022,6 +2449,18 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">Ping 等待</translation>
</message>
<message>
+ <source>Min Ping</source>
+ <translation type="unfinished">最小 Ping 值</translation>
+ </message>
+ <message>
+ <source>Time Offset</source>
+ <translation type="unfinished">时间偏移</translation>
+ </message>
+ <message>
+ <source>Last block time</source>
+ <translation type="unfinished">上一区块时间</translation>
+ </message>
+ <message>
<source>&amp;Open</source>
<translation type="unfinished">打开(&amp;O)</translation>
</message>
@@ -2038,6 +2477,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">總計</translation>
</message>
<message>
+ <source>Debug log file</source>
+ <translation type="unfinished">调试日志文件</translation>
+ </message>
+ <message>
<source>Clear console</source>
<translation type="unfinished">清主控台</translation>
</message>
@@ -2075,6 +2518,26 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
</message>
<message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">检测中: 节点可能是v1或是v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: 未加密,明文传输协议</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324加密传输协议</translation>
+ </message>
+ <message>
<source>we selected the peer for high bandwidth relay</source>
<translation type="unfinished">我们选择了用于高带宽转发的节点</translation>
</message>
@@ -2083,15 +2546,35 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">对端选择了我们用于高带宽转发</translation>
</message>
<message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
+ </message>
+ <message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
<translation type="unfinished">复制地址(&amp;C)</translation>
</message>
<message>
+ <source>&amp;Disconnect</source>
+ <translation type="unfinished">断开(&amp;D)</translation>
+ </message>
+ <message>
<source>1 &amp;hour</source>
<translation type="unfinished">1 小时(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
+ <source>1 &amp;week</source>
+ <translation type="unfinished">1 周(&amp;W)</translation>
+ </message>
+ <message>
+ <source>1 &amp;year</source>
+ <translation type="unfinished">1 年(&amp;Y)</translation>
+ </message>
+ <message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
<translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
@@ -2101,6 +2584,22 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">解封(&amp;U)</translation>
</message>
<message>
+ <source>Network activity disabled</source>
+ <translation type="unfinished">网络活动已禁用</translation>
+ </message>
+ <message>
+ <source>Executing command without any wallet</source>
+ <translation type="unfinished">不使用任何钱包执行命令</translation>
+ </message>
+ <message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
+ <source>Executing command using "%1" wallet</source>
+ <translation type="unfinished">使用“%1”钱包执行命令</translation>
+ </message>
+ <message>
<source>Welcome to the %1 RPC console.
Use up and down arrows to navigate history, and %2 to clear screen.
Use %3 and %4 to increase or decrease the font size.
@@ -2123,6 +2622,10 @@ For more information on using this console, type %6.
<translation type="unfinished">执行中……</translation>
</message>
<message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
+ </message>
+ <message>
<source>via %1</source>
<translation type="unfinished">經由 %1</translation>
</message>
@@ -2131,6 +2634,10 @@ For more information on using this console, type %6.
<translation type="unfinished">是</translation>
</message>
<message>
+ <source>No</source>
+ <translation type="unfinished">否</translation>
+ </message>
+ <message>
<source>To</source>
<translation type="unfinished">到</translation>
</message>
@@ -2158,6 +2665,10 @@ For more information on using this console, type %6.
<translation type="unfinished">金额(&amp;A):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
<source>&amp;Message:</source>
<translation type="unfinished">訊息(&amp;M):</translation>
</message>
@@ -2166,6 +2677,10 @@ For more information on using this console, type %6.
<translation type="unfinished">可在支付请求上备注一条信息,在打开支付请求时可以看到。注意:该消息不是通过比特币网络传送。</translation>
</message>
<message>
+ <source>An optional label to associate with the new receiving address.</source>
+ <translation type="unfinished">可为新建的收款地址添加一个标签。</translation>
+ </message>
+ <message>
<source>Use this form to request payments. All fields are &lt;b&gt;optional&lt;/b&gt;.</source>
<translation type="unfinished">使用此表单请求付款。所有字段都是&lt;b&gt;可选&lt;/b&gt;的。</translation>
</message>
@@ -2178,10 +2693,18 @@ For more information on using this console, type %6.
<translation type="unfinished">一个关联到新收款地址(被您用来识别发票)的可选标签。它也会被附加到付款请求中。</translation>
</message>
<message>
+ <source>An optional message that is attached to the payment request and may be displayed to the sender.</source>
+ <translation type="unfinished">一条附加到付款请求中的可选消息,可以显示给付款方。</translation>
+ </message>
+ <message>
<source>&amp;Create new receiving address</source>
<translation type="unfinished">&amp;產生新的接收地址</translation>
</message>
<message>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
<source>Clear</source>
<translation type="unfinished">清空</translation>
</message>
@@ -2202,6 +2725,10 @@ For more information on using this console, type %6.
<translation type="unfinished">从列表中移除选中的条目</translation>
</message>
<message>
+ <source>Remove</source>
+ <translation type="unfinished">移除</translation>
+ </message>
+ <message>
<source>Copy &amp;URI</source>
<translation type="unfinished">複製 &amp;URI</translation>
</message>
@@ -2257,6 +2784,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请求支付至...</translation>
</message>
<message>
+ <source>Address:</source>
+ <translation type="unfinished">地址:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
<source>Label:</source>
<translation type="unfinished">标签:</translation>
</message>
@@ -2277,10 +2812,22 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
<translation type="unfinished">保存图像(&amp;S)...</translation>
</message>
<message>
+ <source>Payment information</source>
+ <translation type="unfinished">付款信息</translation>
+ </message>
+ <message>
<source>Request payment to %1</source>
<translation type="unfinished">付款給 %1 的要求</translation>
</message>
@@ -2288,14 +2835,26 @@ For more information on using this console, type %6.
<context>
<name>RecentRequestsTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Label</source>
<translation type="unfinished">標記</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(無標記)</translation>
</message>
<message>
+ <source>(no message)</source>
+ <translation type="unfinished">(无消息)</translation>
+ </message>
+ <message>
<source>(no amount requested)</source>
<translation type="unfinished">(無要求金額)</translation>
</message>
@@ -2323,14 +2882,38 @@ For more information on using this console, type %6.
<translation type="unfinished">金额不足!</translation>
</message>
<message>
+ <source>Quantity:</source>
+ <translation type="unfinished">數量:</translation>
+ </message>
+ <message>
+ <source>Bytes:</source>
+ <translation type="unfinished">位元組:</translation>
+ </message>
+ <message>
+ <source>Amount:</source>
+ <translation type="unfinished">金额:</translation>
+ </message>
+ <message>
+ <source>Fee:</source>
+ <translation type="unfinished">費用:</translation>
+ </message>
+ <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
<message>
+ <source>Change:</source>
+ <translation type="unfinished">找零:</translation>
+ </message>
+ <message>
<source>If this is activated, but the change address is empty or invalid, change will be sent to a newly generated address.</source>
<translation type="unfinished">如果這項有打開,但是找零地址是空的或無效,那麼找零會送到一個產生出來的地址去。</translation>
</message>
<message>
+ <source>Custom change address</source>
+ <translation type="unfinished">自定义找零地址</translation>
+ </message>
+ <message>
<source>Transaction Fee:</source>
<translation type="unfinished">交易手续费:</translation>
</message>
@@ -2343,6 +2926,10 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 目前无法进行手续费估计。</translation>
</message>
<message>
+ <source>per kilobyte</source>
+ <translation type="unfinished">每KB</translation>
+ </message>
+ <message>
<source>Hide</source>
<translation type="unfinished">隐藏</translation>
</message>
@@ -2355,12 +2942,20 @@ For more information on using this console, type %6.
<translation type="unfinished">自訂:</translation>
</message>
<message>
+ <source>Send to multiple recipients at once</source>
+ <translation type="unfinished">一次发送给多个收款人</translation>
+ </message>
+ <message>
<source>Add &amp;Recipient</source>
<translation type="unfinished">增加收款人(&amp;R)</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
+ <source>Clear all fields of the form.</source>
+ <translation type="unfinished">清除此表单的所有字段。</translation>
+ </message>
+ <message>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
</message>
<message>
<source>Choose…</source>
@@ -2371,18 +2966,54 @@ For more information on using this console, type %6.
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
+ <source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
+ </message>
+ <message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
<translation type="unfinished">手續費太低的話可能會造成永遠無法確認的交易(請參考提示)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
+ <source>Confirmation time target:</source>
+ <translation type="unfinished">确认时间目标:</translation>
+ </message>
+ <message>
+ <source>Enable Replace-By-Fee</source>
+ <translation type="unfinished">启用手续费追加</translation>
+ </message>
+ <message>
<source>With Replace-By-Fee (BIP-125) you can increase a transaction's fee after it is sent. Without this, a higher fee may be recommended to compensate for increased transaction delay risk.</source>
<translation type="unfinished">手续费追加(Replace-By-Fee,BIP-125)可以让你在送出交易后继续追加手续费。不用这个功能的话,建议付比较高的手续费来降低交易延迟的风险。</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>Balance:</source>
<translation type="unfinished">餘額:</translation>
</message>
<message>
+ <source>Confirm the send action</source>
+ <translation type="unfinished">确认发送操作</translation>
+ </message>
+ <message>
+ <source>S&amp;end</source>
+ <translation type="unfinished">发送(&amp;E)</translation>
+ </message>
+ <message>
<source>Copy quantity</source>
<translation type="unfinished">复制数目</translation>
</message>
@@ -2403,10 +3034,6 @@ For more information on using this console, type %6.
<translation type="unfinished">复制字节数</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -2415,12 +3042,26 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 (%2个块)</translation>
</message>
<message>
- <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
- <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
+ </message>
+ <message>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">创建未签名交易(&amp;E)</translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
+ <source>Creates a Partially Signed Bitcoin Transaction (PSBT) for use with e.g. an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
+ <translation type="unfinished">创建一个“部分签名比特币交易”(PSBT),以用于诸如离线%1钱包,或是兼容PSBT的硬件钱包这类用途。</translation>
</message>
<message>
<source>%1 to %2</source>
@@ -2436,6 +3077,10 @@ For more information on using this console, type %6.
<translation type="unfinished">外部签名器失败</translation>
</message>
<message>
+ <source>Save Transaction Data</source>
+ <translation type="unfinished">保存交易数据</translation>
+ </message>
+ <message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
<translation type="unfinished">部分签名交易(二进制)</translation>
@@ -2449,6 +3094,10 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">要创建这笔交易吗?</translation>
@@ -2464,6 +3113,14 @@ For more information on using this console, type %6.
<translation type="unfinished">请检查您的交易。</translation>
</message>
<message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
+ <source>Not signalling Replace-By-Fee, BIP-125.</source>
+ <translation type="unfinished">没有打上BIP-125手续费追加的标记。</translation>
+ </message>
+ <message>
<source>Total Amount</source>
<translation type="unfinished">總金額</translation>
</message>
@@ -2498,6 +3155,22 @@ For more information on using this console, type %6.
<translation type="unfinished">支付金额必须大于0。</translation>
</message>
<message>
+ <source>The amount exceeds your balance.</source>
+ <translation type="unfinished">金额超出您的余额。</translation>
+ </message>
+ <message>
+ <source>The total exceeds your balance when the %1 transaction fee is included.</source>
+ <translation type="unfinished">计入 %1 手续费后,金额超出了您的余额。</translation>
+ </message>
+ <message>
+ <source>Duplicate address found: addresses should only be used once each.</source>
+ <translation type="unfinished">发现重复地址:每个地址应该只使用一次。</translation>
+ </message>
+ <message>
+ <source>Transaction creation failed!</source>
+ <translation type="unfinished">交易创建失败!</translation>
+ </message>
+ <message>
<source>A fee higher than %1 is considered an absurdly high fee.</source>
<translation type="unfinished">超过 %1 的手续费被视为高得离谱。</translation>
</message>
@@ -2512,10 +3185,18 @@ For more information on using this console, type %6.
<translation type="unfinished">警告: 比特币地址无效</translation>
</message>
<message>
+ <source>Warning: Unknown change address</source>
+ <translation type="unfinished">警告:未知的找零地址</translation>
+ </message>
+ <message>
<source>Confirm custom change address</source>
<translation type="unfinished">确认自定义找零地址</translation>
</message>
<message>
+ <source>The address you selected for change is not part of this wallet. Any or all funds in your wallet may be sent to this address. Are you sure?</source>
+ <translation type="unfinished">你选择的找零地址未被包含在本钱包中,你钱包中的部分或全部金额将被发送至该地址。你确定要这样做吗?</translation>
+ </message>
+ <message>
<source>(no label)</source>
<translation type="unfinished">(無標記)</translation>
</message>
@@ -2531,14 +3212,34 @@ For more information on using this console, type %6.
<translation type="unfinished">付給(&amp;T):</translation>
</message>
<message>
+ <source>&amp;Label:</source>
+ <translation type="unfinished">标签(&amp;L):</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
<source>The Bitcoin address to send the payment to</source>
<translation type="unfinished">將支付發送到的比特幣地址給</translation>
</message>
<message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Remove this entry</source>
+ <translation type="unfinished">移除此项</translation>
+ </message>
+ <message>
<source>The amount to send in the selected unit</source>
<translation type="unfinished">用被选单位表示的待发送金额</translation>
</message>
<message>
+ <source>The fee will be deducted from the amount being sent. The recipient will receive less bitcoins than you enter in the amount field. If multiple recipients are selected, the fee is split equally.</source>
+ <translation type="unfinished">交易费将从发送金额中扣除。接收人收到的比特币将会比您在金额框中输入的更少。如果选中了多个收件人,交易费平分。</translation>
+ </message>
+ <message>
<source>S&amp;ubtract fee from amount</source>
<translation type="unfinished">從付款金額減去手續費(&amp;U)</translation>
</message>
@@ -2585,6 +3286,22 @@ For more information on using this console, type %6.
<translation type="unfinished">您可以使用您的地址簽名訊息/協議,以證明您可以接收發送給他們的比特幣。但是請小心,不要簽名語意含糊不清,或隨機產生的內容,因為釣魚式詐騙可能會用騙你簽名的手法來冒充是你。只有簽名您同意的詳細內容。</translation>
</message>
<message>
+ <source>The Bitcoin address to sign the message with</source>
+ <translation type="unfinished">用来对消息签名的地址</translation>
+ </message>
+ <message>
+ <source>Choose previously used address</source>
+ <translation type="unfinished">选择以前用过的地址</translation>
+ </message>
+ <message>
+ <source>Paste address from clipboard</source>
+ <translation type="unfinished">从剪贴板粘贴地址</translation>
+ </message>
+ <message>
+ <source>Enter the message you want to sign here</source>
+ <translation type="unfinished">在这里输入您想要签名的消息</translation>
+ </message>
+ <message>
<source>Signature</source>
<translation type="unfinished">簽章</translation>
</message>
@@ -2605,10 +3322,18 @@ For more information on using this console, type %6.
<translation type="unfinished">清空所有签名消息栏</translation>
</message>
<message>
+ <source>Clear &amp;All</source>
+ <translation type="unfinished">清除所有(&amp;A)</translation>
+ </message>
+ <message>
<source>&amp;Verify Message</source>
<translation type="unfinished">消息验证(&amp;V)</translation>
</message>
<message>
+ <source>Enter the receiver's address, message (ensure you copy line breaks, spaces, tabs, etc. exactly) and signature below to verify the message. Be careful not to read more into the signature than what is in the signed message itself, to avoid being tricked by a man-in-the-middle attack. Note that this only proves the signing party receives with the address, it cannot prove sendership of any transaction!</source>
+ <translation type="unfinished">请在下面输入接收者地址、消息(确保换行符、空格符、制表符等完全相同)和签名以验证消息。请仔细核对签名信息,以提防中间人攻击。请注意,这只是证明接收方可以用这个地址签名,它不能证明任何交易的发送人身份!</translation>
+ </message>
+ <message>
<source>The Bitcoin address the message was signed with</source>
<translation type="unfinished">用来签名消息的地址</translation>
</message>
@@ -2625,6 +3350,14 @@ For more information on using this console, type %6.
<translation type="unfinished">驗證這個訊息來確定是用指定的比特幣地址簽名的</translation>
</message>
<message>
+ <source>Verify &amp;Message</source>
+ <translation type="unfinished">验证消息签名(&amp;M)</translation>
+ </message>
+ <message>
+ <source>Reset all verify message fields</source>
+ <translation type="unfinished">清空所有验证消息栏</translation>
+ </message>
+ <message>
<source>Click "Sign Message" to generate signature</source>
<translation type="unfinished">請按一下「簽署訊息」來產生簽章</translation>
</message>
@@ -2641,6 +3374,10 @@ For more information on using this console, type %6.
<translation type="unfinished">找不到与输入地址相关的密钥。</translation>
</message>
<message>
+ <source>Wallet unlock was cancelled.</source>
+ <translation type="unfinished">已取消解锁钱包。</translation>
+ </message>
+ <message>
<source>No error</source>
<translation type="unfinished">沒有錯誤</translation>
</message>
@@ -2653,6 +3390,14 @@ For more information on using this console, type %6.
<translation type="unfinished">消息签名失败。</translation>
</message>
<message>
+ <source>Message signed.</source>
+ <translation type="unfinished">消息已签名。</translation>
+ </message>
+ <message>
+ <source>The signature could not be decoded.</source>
+ <translation type="unfinished">签名无法解码。</translation>
+ </message>
+ <message>
<source>Please check the signature and try again.</source>
<translation type="unfinished">请检查签名后重试。</translation>
</message>
@@ -2661,6 +3406,10 @@ For more information on using this console, type %6.
<translation type="unfinished">這個簽章跟訊息的數位摘要不符。</translation>
</message>
<message>
+ <source>Message verification failed.</source>
+ <translation type="unfinished">消息验证失败。</translation>
+ </message>
+ <message>
<source>Message verified.</source>
<translation type="unfinished">消息验证成功。</translation>
</message>
@@ -2694,6 +3443,11 @@ For more information on using this console, type %6.
<translation type="unfinished">0/未确认,不在内存池中</translation>
</message>
<message>
+ <source>abandoned</source>
+ <extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an abandoned transaction.</extracomment>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>%1/unconfirmed</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents a transaction confirmed in at least one block, but less than 6 blocks.</extracomment>
<translation type="unfinished">%1 次/未確認</translation>
@@ -2708,10 +3462,18 @@ For more information on using this console, type %6.
<translation type="unfinished">状态</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Source</source>
<translation type="unfinished">來源</translation>
</message>
<message>
+ <source>Generated</source>
+ <translation type="unfinished">挖矿生成</translation>
+ </message>
+ <message>
<source>From</source>
<translation type="unfinished">來源</translation>
</message>
@@ -2724,6 +3486,10 @@ For more information on using this console, type %6.
<translation type="unfinished">到</translation>
</message>
<message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
<source>watch-only</source>
<translation type="unfinished">只能看</translation>
</message>
@@ -2731,6 +3497,10 @@ For more information on using this console, type %6.
<source>label</source>
<translation type="unfinished">标签</translation>
</message>
+ <message>
+ <source>Credit</source>
+ <translation type="unfinished">收入</translation>
+ </message>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
@@ -2738,18 +3508,46 @@ For more information on using this console, type %6.
</translation>
</message>
<message>
+ <source>not accepted</source>
+ <translation type="unfinished">未被接受</translation>
+ </message>
+ <message>
+ <source>Debit</source>
+ <translation type="unfinished">支出</translation>
+ </message>
+ <message>
<source>Total debit</source>
<translation type="unfinished">总支出</translation>
</message>
<message>
+ <source>Total credit</source>
+ <translation type="unfinished">总收入</translation>
+ </message>
+ <message>
+ <source>Transaction fee</source>
+ <translation type="unfinished">交易手续费</translation>
+ </message>
+ <message>
<source>Net amount</source>
<translation type="unfinished">淨額</translation>
</message>
<message>
+ <source>Message</source>
+ <translation type="unfinished">消息</translation>
+ </message>
+ <message>
+ <source>Comment</source>
+ <translation type="unfinished">备注</translation>
+ </message>
+ <message>
<source>Transaction ID</source>
<translation type="unfinished">交易 ID</translation>
</message>
<message>
+ <source>Transaction total size</source>
+ <translation type="unfinished">交易总大小</translation>
+ </message>
+ <message>
<source>Transaction virtual size</source>
<translation type="unfinished">交易擬真大小</translation>
</message>
@@ -2758,14 +3556,26 @@ For more information on using this console, type %6.
<translation type="unfinished">输出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
<translation type="unfinished">商家</translation>
</message>
<message>
+ <source>Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to "not accepted" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.</source>
+ <translation type="unfinished">新挖出的比特币在可以使用前必须经过 %1 个区块确认的成熟过程。当您挖出此区块后,它将被广播到网络中以加入区块链。如果它未成功进入区块链,其状态将变更为“不接受”并且不可使用。这可能偶尔会发生,在另一个节点比你早几秒钟成功挖出一个区块时就会这样。</translation>
+ </message>
+ <message>
+ <source>Debug information</source>
+ <translation type="unfinished">调试信息</translation>
+ </message>
+ <message>
+ <source>Transaction</source>
+ <translation type="unfinished">交易</translation>
+ </message>
+ <message>
<source>Inputs</source>
<translation type="unfinished">輸入</translation>
</message>
@@ -2777,7 +3587,11 @@ For more information on using this console, type %6.
<source>true</source>
<translation type="unfinished">是</translation>
</message>
- </context>
+ <message>
+ <source>false</source>
+ <translation type="unfinished">否</translation>
+ </message>
+</context>
<context>
<name>TransactionDescDialog</name>
<message>
@@ -2792,6 +3606,10 @@ For more information on using this console, type %6.
<context>
<name>TransactionTableModel</name>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2800,6 +3618,14 @@ For more information on using this console, type %6.
<translation type="unfinished">標記</translation>
</message>
<message>
+ <source>Unconfirmed</source>
+ <translation type="unfinished">未确认</translation>
+ </message>
+ <message>
+ <source>Abandoned</source>
+ <translation type="unfinished">已丢弃</translation>
+ </message>
+ <message>
<source>Confirming (%1 of %2 recommended confirmations)</source>
<translation type="unfinished">确认中 (推荐 %2个确认,已经有 %1个确认)</translation>
</message>
@@ -2808,6 +3634,18 @@ For more information on using this console, type %6.
<translation type="unfinished">已確認(%1 次)</translation>
</message>
<message>
+ <source>Conflicted</source>
+ <translation type="unfinished">有冲突</translation>
+ </message>
+ <message>
+ <source>Immature (%1 confirmations, will be available after %2)</source>
+ <translation type="unfinished">未成熟 (%1 个确认,将在 %2 个后可用)</translation>
+ </message>
+ <message>
+ <source>Generated but not accepted</source>
+ <translation type="unfinished">已生成但未被接受</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2820,10 +3658,6 @@ For more information on using this console, type %6.
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">付給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -2848,6 +3682,10 @@ For more information on using this console, type %6.
<translation type="unfinished">收到交易的日期和時間。</translation>
</message>
<message>
+ <source>Type of transaction.</source>
+ <translation type="unfinished">交易类型。</translation>
+ </message>
+ <message>
<source>Whether or not a watch-only address is involved in this transaction.</source>
<translation type="unfinished">该交易中是否涉及仅观察地址。</translation>
</message>
@@ -2863,6 +3701,10 @@ For more information on using this console, type %6.
<translation type="unfinished">全部</translation>
</message>
<message>
+ <source>Today</source>
+ <translation type="unfinished">今天</translation>
+ </message>
+ <message>
<source>This week</source>
<translation type="unfinished">這星期</translation>
</message>
@@ -2871,6 +3713,14 @@ For more information on using this console, type %6.
<translation type="unfinished">這個月</translation>
</message>
<message>
+ <source>Last month</source>
+ <translation type="unfinished">上个月</translation>
+ </message>
+ <message>
+ <source>This year</source>
+ <translation type="unfinished">今年</translation>
+ </message>
+ <message>
<source>Received with</source>
<translation type="unfinished">收款</translation>
</message>
@@ -2879,10 +3729,6 @@ For more information on using this console, type %6.
<translation type="unfinished">发送到</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -2895,6 +3741,10 @@ For more information on using this console, type %6.
<translation type="unfinished">输入地址、交易ID或标签进行搜索</translation>
</message>
<message>
+ <source>Min amount</source>
+ <translation type="unfinished">最小金额</translation>
+ </message>
+ <message>
<source>Range…</source>
<translation type="unfinished">范围...</translation>
</message>
@@ -2919,10 +3769,22 @@ For more information on using this console, type %6.
<translation type="unfinished">复制原始交易(&amp;R)</translation>
</message>
<message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
+ </message>
+ <message>
<source>Increase transaction &amp;fee</source>
<translation type="unfinished">增加矿工费(&amp;F)</translation>
</message>
<message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
+ </message>
+ <message>
<source>&amp;Edit address label</source>
<translation type="unfinished">编辑地址标签(&amp;E)</translation>
</message>
@@ -2932,6 +3794,10 @@ For more information on using this console, type %6.
<translation type="unfinished">在 %1中显示</translation>
</message>
<message>
+ <source>Export Transaction History</source>
+ <translation type="unfinished">导出交易历史</translation>
+ </message>
+ <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">逗號分隔文件</translation>
@@ -2945,6 +3811,10 @@ For more information on using this console, type %6.
<translation type="unfinished">只能觀看的</translation>
</message>
<message>
+ <source>Date</source>
+ <translation type="unfinished">日期</translation>
+ </message>
+ <message>
<source>Type</source>
<translation type="unfinished">类型</translation>
</message>
@@ -2980,7 +3850,11 @@ For more information on using this console, type %6.
<source>Range:</source>
<translation type="unfinished">範圍:</translation>
</message>
- </context>
+ <message>
+ <source>to</source>
+ <translation type="unfinished">到</translation>
+ </message>
+</context>
<context>
<name>WalletFrame</name>
<message>
@@ -3011,7 +3885,15 @@ Go to File &gt; Open Wallet to load a wallet.
<source>Partially Signed Transaction (*.psbt)</source>
<translation type="unfinished">部分签名交易 (*.psbt)</translation>
</message>
- </context>
+ <message>
+ <source>PSBT file must be smaller than 100 MiB</source>
+ <translation type="unfinished">PSBT文件必须小于100MiB</translation>
+ </message>
+ <message>
+ <source>Unable to decode PSBT</source>
+ <translation type="unfinished">无法解码PSBT</translation>
+ </message>
+</context>
<context>
<name>WalletModel</name>
<message>
@@ -3019,6 +3901,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">付款</translation>
</message>
<message>
+ <source>Fee bump error</source>
+ <translation type="unfinished">追加手续费出错</translation>
+ </message>
+ <message>
+ <source>Increasing transaction fee failed</source>
+ <translation type="unfinished">追加交易手续费失败</translation>
+ </message>
+ <message>
<source>Do you want to increase the fee?</source>
<extracomment>Asks a user if they would like to manually increase the fee of a transaction that has already been created.</extracomment>
<translation type="unfinished">想要提高手續費嗎?</translation>
@@ -3028,6 +3918,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">当前手续费:</translation>
</message>
<message>
+ <source>Increase:</source>
+ <translation type="unfinished">增加量:</translation>
+ </message>
+ <message>
<source>New fee:</source>
<translation type="unfinished">新的費用:</translation>
</message>
@@ -3044,6 +3938,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">無法草擬交易。</translation>
</message>
<message>
+ <source>PSBT copied</source>
+ <translation type="unfinished">PSBT已複製</translation>
+ </message>
+ <message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
<translation type="unfinished">复制到剪贴板</translation>
@@ -3057,6 +3955,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">沒辦法提交交易</translation>
</message>
<message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
<source>default wallet</source>
<translation type="unfinished">預設錢包</translation>
</message>
@@ -3108,6 +4010,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
<translation type="unfinished">%s请求监听端口%u。此端口被认为是“坏的”,所以不太可能有其他节点会连接过来。详情以及完整的端口列表请参见 doc/p2p-bad-ports.md 。</translation>
</message>
@@ -3116,6 +4022,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
</message>
<message>
+ <source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
+ <translation type="unfinished">无法锁定数据目录 %s。%s 可能已经在运行。</translation>
+ </message>
+ <message>
<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">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
</message>
@@ -3140,26 +4050,58 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
</message>
<message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
+ </message>
+ <message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
<translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
</message>
<message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">错误: 旧式钱包只支持 "legacy", "p2sh-segwit", 和 "bech32" 这三种地址类型</translation>
+ </message>
+ <message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
<translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
</message>
<message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
+ </message>
+ <message>
<source>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>
<translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
</message>
<message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
+ </message>
+ <message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
<translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
</message>
<message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
<translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
</message>
<message>
+ <source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
+ <translation type="unfinished">请检查电脑的日期时间设置是否正确!时间错误可能会导致 %s 运行异常。</translation>
+ </message>
+ <message>
+ <source>Please contribute if you find %s useful. Visit %s for further information about the software.</source>
+ <translation type="unfinished">如果你认为%s对你比较有用的话,请对我们进行一些自愿贡献。请访问%s网站来获取有关这个软件的更多信息。</translation>
+ </message>
+ <message>
+ <source>Prune configured below the minimum of %d MiB. Please use a higher number.</source>
+ <translation type="unfinished">修剪被设置得太小,已经低于最小值%d MiB,请使用更大的数值。</translation>
+ </message>
+ <message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
<translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
</message>
@@ -3168,6 +4110,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">修剪:上次同步钱包的位置已经超出(落后于)现有修剪后数据的范围。你需要进行-reindex(对于已经启用修剪节点,就需要重新下载整个区块链)</translation>
</message>
<message>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">重命名 '%s' -&gt; '%s' 失败。您需要手动移走或删除无效的快照目录 %s来解决这个问题,不然的话您就会在下一次启动时遇到相同的错误。</translation>
+ </message>
+ <message>
<source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
<translation type="unfinished">SQLiteDatabase: SQLite钱包schema版本%d未知。只支持%d版本</translation>
</message>
@@ -3176,14 +4122,14 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">區塊資料庫中有來自未來的區塊。可能是你電腦的日期時間不對。如果確定電腦日期時間沒錯的話,就重建區塊資料庫看看。</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">区块索引数据库含有历史遗留的 'txindex' 。可以运行完整的 -reindex 来清理被占用的磁盘空间;也可以忽略这个错误。这个错误消息将不会再次显示。</translation>
- </message>
- <message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
<translation type="unfinished">扣除手續費後的交易金額太少而不能傳送</translation>
</message>
<message>
+ <source>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>
+ <translation type="unfinished">如果这个钱包之前没有正确关闭,而且上一次是被新版的Berkeley DB加载过,就会发生这个错误。如果是这样,请使用上次加载过这个钱包的那个软件。</translation>
+ </message>
+ <message>
<source>This is a pre-release test build - use at your own risk - do not use for mining or merchant applications</source>
<translation type="unfinished">這是個還沒發表的測試版本 - 使用請自負風險 - 請不要用來開採或做商業應用</translation>
</message>
@@ -3212,6 +4158,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">提供了未知的钱包格式 "%s" 。请使用 "bdb" 或 "sqlite" 中的一种。</translation>
</message>
<message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">不支持的类别限定日志等级 %1$s=%2$s 。 预期参数 %1$s=&lt;category&gt;:&lt;loglevel&gt;。 有效的类别: %3$s 。有效的日志等级: %4$s 。</translation>
+ </message>
+ <message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
<translation type="unfinished">找到了不受支持的 chainstate 数据库格式。请使用 -reindex-chainstate 参数重启。这将会重建 chainstate 数据库。</translation>
</message>
@@ -3220,6 +4170,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">钱包创建成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。</translation>
</message>
<message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">钱包加载成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。可以使用 migratewallet 命令将旧式钱包迁移至输出描述符钱包。</translation>
+ </message>
+ <message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
<translation type="unfinished">警告: 转储文件的钱包格式 "%s" 与命令行指定的格式 "%s" 不符。</translation>
</message>
@@ -3228,6 +4182,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">警告:在已经禁用私钥的钱包 {%s} 中仍然检测到私钥</translation>
</message>
<message>
+ <source>Warning: We do not appear to fully agree with our peers! You may need to upgrade, or other nodes may need to upgrade.</source>
+ <translation type="unfinished">警告:我们和其他节点似乎没达成共识!您可能需要升级,或者就是其他节点可能需要升级。</translation>
+ </message>
+ <message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
<translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
</message>
@@ -3244,6 +4202,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">參數 -maxmempool 至少要給 %d 百萬位元組(MB)</translation>
</message>
<message>
+ <source>A fatal internal error occurred, see debug.log for details</source>
+ <translation type="unfinished">发生了致命的内部错误,请在debug.log中查看详情</translation>
+ </message>
+ <message>
<source>Cannot resolve -%s address: '%s'</source>
<translation type="unfinished">沒辦法解析 -%s 參數指定的地址: '%s'</translation>
</message>
@@ -3260,30 +4222,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">不能写入到数据目录'%s';请检查文件权限。</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">无法完成由之前版本启动的 -txindex 升级。请用之前的版本重新启动,或者进行一次完整的 -reindex 。</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上,以供诊断问题的原因。</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
<translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
</message>
<message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -blockfilterindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 blockfilterindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -coinstatsindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 coinstatsindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -txindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 txindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
<translation type="unfinished">在使用地址管理器(addrman)寻找出站连接时,无法同时提供特定的连接。</translation>
</message>
@@ -3292,6 +4234,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">加载%s时出错: 编译时未启用外部签名器支持,却仍然试图加载外部签名器钱包</translation>
</message>
<message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">读取 %s 时出错! 所有密钥都被正确读取,但交易数据或地址元数据可能缺失或有误。</translation>
+ </message>
+ <message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
<translation type="unfinished">错误:钱包中的地址簿数据无法被识别为属于迁移后的钱包</translation>
</message>
@@ -3304,6 +4250,10 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">错误:钱包中的交易%s无法被识别为属于迁移后的钱包</translation>
</message>
<message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">计算追加手续费失败,因为未确认UTXO依赖了大量未确认交易的簇集。</translation>
+ </message>
+ <message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
<translation type="unfinished">无法重命名无效的 peers.dat 文件。 请移动或删除它,然后重试。</translation>
</message>
@@ -3378,10 +4328,6 @@ Please try running the latest software version.
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">不支持的类别限定日志等级 -loglevel=%s。预期参数 -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s。有效的类别: %s。</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
@@ -3402,6 +4348,26 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话</translation>
</message>
<message>
+ <source>Copyright (C) %i-%i</source>
+ <translation type="unfinished">版权所有 (C) %i-%i</translation>
+ </message>
+ <message>
+ <source>Corrupted block database detected</source>
+ <translation type="unfinished">检测到区块数据库损坏</translation>
+ </message>
+ <message>
+ <source>Could not find asmap file %s</source>
+ <translation type="unfinished">找不到asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
+ <source>Disk space is too low!</source>
+ <translation type="unfinished">磁盘空间太低!</translation>
+ </message>
+ <message>
<source>Do you want to rebuild the block database now?</source>
<translation type="unfinished">你想现在就重建区块数据库吗?</translation>
</message>
@@ -3414,6 +4380,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">转储文件 %s 不存在</translation>
</message>
<message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
+ </message>
+ <message>
<source>Error creating %s</source>
<translation type="unfinished">创建%s时出错</translation>
</message>
@@ -3422,6 +4392,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化区块数据库时出错</translation>
</message>
<message>
+ <source>Error initializing wallet database environment %s!</source>
+ <translation type="unfinished">初始化钱包数据库环境错误 %s!</translation>
+ </message>
+ <message>
<source>Error loading %s</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤</translation>
</message>
@@ -3438,6 +4412,14 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">載入檔案 %s 時發生錯誤: 這個錢包需要新版的 %s</translation>
</message>
<message>
+ <source>Error loading block database</source>
+ <translation type="unfinished">加载区块数据库时出错</translation>
+ </message>
+ <message>
+ <source>Error opening block database</source>
+ <translation type="unfinished">打开区块数据库时出错</translation>
+ </message>
+ <message>
<source>Error reading configuration file: %s</source>
<translation type="unfinished">读取配置文件失败: %s</translation>
</message>
@@ -3446,16 +4428,16 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">读取数据库出错,关闭中。</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
@@ -3474,10 +4456,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
<translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
</message>
@@ -3502,6 +4480,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
</message>
<message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
<source>Error: Unable to remove watchonly address book data</source>
<translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
</message>
@@ -3510,10 +4492,34 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">错误: 无法写入记录到新钱包</translation>
</message>
<message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
+ </message>
+ <message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">无法启动索引,关闭中...</translation>
+ </message>
+ <message>
<source>Failed to verify database</source>
<translation type="unfinished">校验数据库失败</translation>
</message>
<message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手续费率 (%s) 低于最大手续费率设置 (%s)</translation>
</message>
@@ -3682,6 +4688,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">这是你每次交易付款时最少要付的手续费。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amounts must not be negative</source>
<translation type="unfinished">交易金额不不可为负数</translation>
</message>
@@ -3750,14 +4760,30 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">在 -onlynet 指定了不明的網路別: '%s'</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">不支持的全局日志等级 -loglevel=%s 。有效的数值:%s 。</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">不支持的日志分类 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">用户代理备注(%s)包含不安全的字符。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zh_TW.ts b/src/qt/locale/bitcoin_zh_TW.ts
index 82f833e60c..17332db7b1 100644
--- a/src/qt/locale/bitcoin_zh_TW.ts
+++ b/src/qt/locale/bitcoin_zh_TW.ts
@@ -54,14 +54,6 @@
<translation type="unfinished">選擇 (&amp;h)</translation>
</message>
<message>
- <source>Sending addresses</source>
- <translation type="unfinished">發送地址</translation>
- </message>
- <message>
- <source>Receiving addresses</source>
- <translation type="unfinished">接收地址</translation>
- </message>
- <message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">這些是你要發送過去的 比特幣地址。在發送幣之前,務必要檢查金額和接收地址是否正確。</translation>
</message>
@@ -97,6 +89,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">儲存地址清單到 %1 時發生錯誤。請重試一次。</translation>
</message>
<message>
+ <source>Sending addresses - %1</source>
+ <translation type="unfinished">付款地址 - %1</translation>
+ </message>
+ <message>
+ <source>Receiving addresses - %1</source>
+ <translation type="unfinished">收款地址 - %1</translation>
+ </message>
+ <message>
<source>Exporting Failed</source>
<translation type="unfinished">匯出失敗</translation>
</message>
@@ -220,7 +220,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>The passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character. If this is successful, please set a new passphrase to avoid this issue in the future.</source>
- <translation type="unfinished">输入的密码有误,无法解密钱包。输入的密码中包含空字符(例如,一个值为零的字节)。如果密码是在此软件早于25.0的版本上设置的,请只输入密码中首个空字符(不包括空字符本身)之前的部分来再尝试一次。如果这样可以成功解密,为避免未来出现问题,请设置一个新的密码。</translation>
+ <translation type="unfinished">輸入的密碼有誤,無法解密錢包。 輸入的密碼中包含空字元(例如,零值的位元組)。 如果密碼是在此軟體早於25.0的版本上設定的,請只輸入非空字元的密碼(不包括零值元本身)再嘗試一次。 如果這樣可以成功解密,為避免未來出現問題,請設定新的密碼。</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
@@ -228,11 +228,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Passphrase change failed</source>
- <translation type="unfinished">修改密码失败</translation>
+ <translation type="unfinished">修改密碼失敗</translation>
</message>
<message>
<source>The old passphrase entered for the wallet decryption is incorrect. It contains a null character (ie - a zero byte). If the passphrase was set with a version of this software prior to 25.0, please try again with only the characters up to — but not including — the first null character.</source>
- <translation type="unfinished">输入的旧密码有误,无法解密钱包。输入的密码中包含空字符(例如,一个值为零的字节)。如果密码是在此软件早于25.0的版本上设置的,请只输入密码中首个空字符(不包括空字符本身)之前的部分来再尝试一次。</translation>
+ <translation type="unfinished">輸入的舊密碼有誤,無法解密錢包。 輸入的密碼中包含空字元(例如,一個值為零的位元組)。 如果密碼是在此軟體早於25.0的版本上設定的,請只輸入密碼中首個空字元(不包括空字元本身)之前的部分來再嘗試一次。</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
@@ -261,6 +261,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">失控異常</translation>
</message>
<message>
+ <source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
+ <translation type="unfinished">發生致命錯誤。%1 無法再繼續安全地運行並離開。</translation>
+ </message>
+ <message>
<source>Internal error</source>
<translation type="unfinished">內部錯誤</translation>
</message>
@@ -283,7 +287,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Error: %1</source>
- <translation type="unfinished">错误:%1</translation>
+ <translation type="unfinished">錯誤:%1</translation>
</message>
<message>
<source>%1 didn't yet exit safely…</source>
@@ -294,6 +298,18 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">未知</translation>
</message>
<message>
+ <source>Embedded "%1"</source>
+ <translation type="unfinished">嵌入的 "%1"</translation>
+ </message>
+ <message>
+ <source>Default system font "%1"</source>
+ <translation type="unfinished">默认系统字体 "%1"</translation>
+ </message>
+ <message>
+ <source>Custom…</source>
+ <translation type="unfinished">自定义...</translation>
+ </message>
+ <message>
<source>Amount</source>
<translation type="unfinished">金額</translation>
</message>
@@ -308,22 +324,37 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Inbound</source>
<extracomment>An inbound connection from a peer. An inbound connection is a connection initiated by a peer.</extracomment>
- <translation type="unfinished">進來</translation>
+ <translation type="unfinished">傳入</translation>
</message>
<message>
<source>Outbound</source>
<extracomment>An outbound connection to a peer. An outbound connection is a connection initiated by us.</extracomment>
- <translation type="unfinished">出去</translation>
+ <translation type="unfinished">傳出</translation>
+ </message>
+ <message>
+ <source>Full Relay</source>
+ <extracomment>Peer connection type that relays all network information.</extracomment>
+ <translation type="unfinished">完整转发</translation>
</message>
<message>
<source>Block Relay</source>
<extracomment>Peer connection type that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">区块转发</translation>
+ <translation type="unfinished">區塊轉發</translation>
</message>
<message>
<source>Manual</source>
<extracomment>Peer connection type established manually through one of several methods.</extracomment>
- <translation type="unfinished">手册</translation>
+ <translation type="unfinished">手冊</translation>
+ </message>
+ <message>
+ <source>Feeler</source>
+ <extracomment>Short-lived peer connection type that tests the aliveness of known addresses.</extracomment>
+ <translation type="unfinished">触须</translation>
+ </message>
+ <message>
+ <source>Address Fetch</source>
+ <extracomment>Short-lived peer connection type that solicits known addresses from a peer.</extracomment>
+ <translation type="unfinished">地址取回</translation>
</message>
<message>
<source>%1 d</source>
@@ -362,13 +393,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
- <numerusform>%n分钟</numerusform>
+ <numerusform>%n分鐘</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
- <numerusform>%n 小时</numerusform>
+ <numerusform>%n 小時</numerusform>
</translation>
</message>
<message numerus="yes">
@@ -380,7 +411,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
- <numerusform>%n 周</numerusform>
+ <numerusform>%n 週</numerusform>
</translation>
</message>
<message>
@@ -429,6 +460,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">結束應用程式</translation>
</message>
<message>
+ <source>&amp;About %1</source>
+ <translation type="unfinished">關於%1(&amp;A)</translation>
+ </message>
+ <message>
<source>Show information about %1</source>
<translation type="unfinished">顯示 %1 的相關資訊</translation>
</message>
@@ -532,15 +567,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Close Wallet…</source>
- <translation type="unfinished">关钱包...</translation>
+ <translation type="unfinished">關錢包..</translation>
</message>
<message>
<source>Create Wallet…</source>
- <translation type="unfinished">创建钱包...</translation>
+ <translation type="unfinished">創建錢包...</translation>
</message>
<message>
<source>Close All Wallets…</source>
- <translation type="unfinished">关所有钱包...</translation>
+ <translation type="unfinished">關所有錢包...</translation>
</message>
<message>
<source>&amp;File</source>
@@ -576,7 +611,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Connecting to peers…</source>
- <translation type="unfinished">连到同行...</translation>
+ <translation type="unfinished">正在跟其他節點連線中...</translation>
</message>
<message>
<source>Request payments (generates QR codes and bitcoin: URIs)</source>
@@ -606,7 +641,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Catching up…</source>
- <translation type="unfinished">赶上...</translation>
+ <translation type="unfinished">追上中...</translation>
</message>
<message>
<source>Last received block was generated %1 ago.</source>
@@ -691,6 +726,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">關閉所有錢包</translation>
</message>
<message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">遷移錢包</translation>
+ </message>
+ <message>
+ <source>Migrate a wallet</source>
+ <translation type="unfinished">遷移一個錢包</translation>
+ </message>
+ <message>
<source>Show the %1 help message to get a list with possible Bitcoin command-line options</source>
<translation type="unfinished">顯示 %1 的說明訊息,來取得可用命令列選項的列表</translation>
</message>
@@ -704,7 +747,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
+ <translation type="unfinished">預設錢包</translation>
</message>
<message>
<source>No wallets available</source>
@@ -786,8 +829,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">預先同步標頭(%1%)</translation>
</message>
<message>
+ <source>Error creating wallet</source>
+ <translation type="unfinished">創建錢包時出錯</translation>
+ </message>
+ <message>
+ <source>Cannot create new wallet, the software was compiled without sqlite support (required for descriptor wallets)</source>
+ <translation type="unfinished">無法建立新錢包,軟體編譯時未啟用SQLite支援(descriptor錢包需要它)</translation>
+ </message>
+ <message>
<source>Error: %1</source>
- <translation type="unfinished">错误:%1</translation>
+ <translation type="unfinished">錯誤:%1</translation>
</message>
<message>
<source>Warning: %1</source>
@@ -892,10 +943,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">手續費:</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
- </message>
- <message>
<source>After Fee:</source>
<translation type="unfinished">計費後金額:</translation>
</message>
@@ -945,15 +992,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>&amp;Copy address</source>
- <translation type="unfinished">&amp;复制地址</translation>
+ <translation type="unfinished">&amp;複製地址</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">复制和标签</translation>
+ <translation type="unfinished">複製 &amp;label</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">复制和数量</translation>
+ <translation type="unfinished">複製 &amp;amount</translation>
</message>
<message>
<source>Copy transaction &amp;ID and output index</source>
@@ -984,10 +1031,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">複製位元組數</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -996,18 +1039,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">(鎖定 %1 枚)</translation>
</message>
<message>
- <source>yes</source>
- <translation type="unfinished">是</translation>
- </message>
- <message>
- <source>no</source>
- <translation type="unfinished">否</translation>
- </message>
- <message>
- <source>This label turns red if any recipient receives an amount smaller than the current dust threshold.</source>
- <translation type="unfinished">當任何一個收款金額小於目前的灰塵金額上限時,文字會變紅色。</translation>
- </message>
- <message>
<source>Can vary +/- %1 satoshi(s) per input.</source>
<translation type="unfinished">每組輸入可能有 +/- %1 個 satoshi 的誤差。</translation>
</message>
@@ -1054,6 +1085,57 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
</context>
<context>
+ <name>MigrateWalletActivity</name>
+ <message>
+ <source>Migrate wallet</source>
+ <translation type="unfinished">遷移錢包</translation>
+ </message>
+ <message>
+ <source>Are you sure you wish to migrate the wallet &lt;i&gt;%1&lt;/i&gt;?</source>
+ <translation type="unfinished">您確定想要遷移錢包&lt;i&gt;%1&lt;/i&gt;嗎?</translation>
+ </message>
+ <message>
+ <source>Migrating the wallet will convert this wallet to one or more descriptor wallets. A new wallet backup will need to be made.
+If this wallet contains any watchonly scripts, a new wallet will be created which contains those watchonly scripts.
+If this wallet contains any solvable but not watched scripts, a different and new wallet will be created which contains those scripts.
+
+The migration process will create a backup of the wallet before migrating. This backup file will be named &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak and can be found in the directory for this wallet. In the event of an incorrect migration, the backup can be restored with the "Restore Wallet" functionality.</source>
+ <translation type="unfinished">遷移錢包將會把這個錢包轉換成一個或多數的descriptor錢包。 將會需要建立一個新的錢包備份。
+如果這個錢包包含僅觀察腳本,將會建立一個包含那些只觀察腳本的新錢包。
+如果這個錢包包含可解但又未被監視的腳本,將會創建一個不同的錢包以包含那些腳本。
+
+遷移過程開始前將會建立一個錢包備份。 備份檔案將會被命名為 &lt;wallet name&gt;-&lt;timestamp&gt;.legacy.bak 然後被保存在該錢包所在目錄下。 如果遷移過程出錯,可以使用「恢復錢包」功能來恢復備份。</translation>
+ </message>
+ <message>
+ <source>Migrate Wallet</source>
+ <translation type="unfinished">遷移錢包</translation>
+ </message>
+ <message>
+ <source>Migrating Wallet &lt;b&gt;%1&lt;/b&gt;…</source>
+ <translation type="unfinished">遷移錢包 &lt;b&gt;%1&lt;/b&gt;...</translation>
+ </message>
+ <message>
+ <source>The wallet '%1' was migrated successfully.</source>
+ <translation type="unfinished">已成功遷移錢包 '%1' 。</translation>
+ </message>
+ <message>
+ <source>Watchonly scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">仅观察脚本已经被迁移到被命名为“%1”的新钱包中。</translation>
+ </message>
+ <message>
+ <source>Solvable but not watched scripts have been migrated to a new wallet named '%1'.</source>
+ <translation type="unfinished">可解决但未被观察到的脚本已经被迁移到被命名为“%1”的新钱包。</translation>
+ </message>
+ <message>
+ <source>Migration failed</source>
+ <translation type="unfinished">遷移失敗</translation>
+ </message>
+ <message>
+ <source>Migration Successful</source>
+ <translation type="unfinished">遷移成功</translation>
+ </message>
+</context>
+<context>
<name>OpenWalletActivity</name>
<message>
<source>Open wallet failed</source>
@@ -1065,7 +1147,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
+ <translation type="unfinished">預設錢包</translation>
</message>
<message>
<source>Open Wallet</source>
@@ -1127,6 +1209,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">新增錢包</translation>
</message>
<message>
+ <source>You are one step away from creating your new wallet!</source>
+ <translation type="unfinished">距離創建您的新錢包只有一步之遙了!</translation>
+ </message>
+ <message>
+ <source>Please provide a name and, if desired, enable any advanced options</source>
+ <translation type="unfinished">請指定名稱,如果需要的話,還可以啟用進階選項</translation>
+ </message>
+ <message>
<source>Wallet Name</source>
<translation type="unfinished">錢包名稱</translation>
</message>
@@ -1163,14 +1253,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">製作空白錢包</translation>
</message>
<message>
- <source>Use descriptors for scriptPubKey management</source>
- <translation type="unfinished">使用descriptors(描述符)進行scriptPubKey管理</translation>
- </message>
- <message>
- <source>Descriptor Wallet</source>
- <translation type="unfinished">描述符錢包</translation>
- </message>
- <message>
<source>Create</source>
<translation type="unfinished">產生</translation>
</message>
@@ -1271,7 +1353,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Choose data directory</source>
- <translation type="unfinished">选择数据目录</translation>
+ <translation type="unfinished">指定數據質料目錄</translation>
</message>
<message>
<source>At least %1 GB of data will be stored in this directory, and it will grow over time.</source>
@@ -1317,6 +1399,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">因為這是程式第一次啓動,你可以選擇 %1 儲存資料的地方。</translation>
</message>
<message>
+ <source>Limit block chain storage to</source>
+ <translation type="unfinished">將區塊鏈儲存限制為</translation>
+ </message>
+ <message>
<source>Reverting this setting requires re-downloading the entire blockchain. It is faster to download the full chain first and prune it later. Disables some advanced features.</source>
<translation type="unfinished">還原此設置需要重新下載整個區塊鏈。首先下載完整的鏈,然後再修剪它是更快的。禁用某些高級功能。</translation>
</message>
@@ -1360,7 +1446,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>ShutdownWindow</name>
<message>
<source>%1 is shutting down…</source>
- <translation type="unfinished">%1正在关闭...</translation>
+ <translation type="unfinished">%1正在關閉..</translation>
</message>
<message>
<source>Do not shut down the computer until this window disappears.</source>
@@ -1391,7 +1477,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>calculating…</source>
- <translation type="unfinished">计算...</translation>
+ <translation type="unfinished">計算...</translation>
</message>
<message>
<source>Last block time</source>
@@ -1419,7 +1505,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
- <translation type="unfinished">未知。同步区块头(%1, %2%)...</translation>
+ <translation type="unfinished">未知。同步區塊標頭(%1, %2%)中...</translation>
</message>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
@@ -1458,7 +1544,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Enabling pruning significantly reduces the disk space required to store transactions. All blocks are still fully validated. Reverting this setting requires re-downloading the entire blockchain.</source>
- <translation type="unfinished">启用区块修剪会显著减小存储交易对磁盘空间的需求。所有的区块仍然会被完整校验。取消这个设置需要重新下载整条区块链。</translation>
+ <translation type="unfinished">啟用區塊修剪(pruning)會顯著減少儲存交易對儲存空間的需求。 所有的區塊仍然會被完整校驗。 取消這個設定需要再重新下載整個區塊鏈。</translation>
</message>
<message>
<source>Size of &amp;database cache</source>
@@ -1470,7 +1556,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Full path to a %1 compatible script (e.g. C:\Downloads\hwi.exe or /Users/you/Downloads/hwi.py). Beware: malware can steal your coins!</source>
- <translation type="unfinished">与%1兼容的脚本文件路径(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:恶意软件可以偷币!</translation>
+ <translation type="unfinished">與%1相容的腳本檔案路徑(例如 C:\Downloads\hwi.exe 或者 /Users/you/Downloads/hwi.py )。注意:惡意軟體可以偷幣!</translation>
</message>
<message>
<source>IP address of the proxy (e.g. IPv4: 127.0.0.1 / IPv6: ::1)</source>
@@ -1485,8 +1571,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">當視窗關閉時,把應用程式縮到最小,而不是結束。當勾選這個選項時,只能夠用選單中的結束來關掉應用程式。</translation>
</message>
<message>
+ <source>Font in the Overview tab: </source>
+ <translation type="unfinished">在概览标签页的字体:</translation>
+ </message>
+ <message>
<source>Options set in this dialog are overridden by the command line:</source>
- <translation type="unfinished">这个对话框中的设置已被如下命令行选项覆盖:</translation>
+ <translation type="unfinished">這個窗面中的設定已被如下命令列選項覆蓋:</translation>
</message>
<message>
<source>Open the %1 configuration file from the working directory.</source>
@@ -1523,12 +1613,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Maximum database cache size. A larger cache can contribute to faster sync, after which the benefit is less pronounced for most use cases. Lowering the cache size will reduce memory usage. Unused mempool memory is shared for this cache.</source>
<extracomment>Tooltip text for Options window setting that sets the size of the database cache. Explains the corresponding effects of increasing/decreasing this value.</extracomment>
- <translation type="unfinished">数据库缓存的最大大小。加大缓存有助于加快同步,但对于大多数使用场景来说,继续加大后收效会越来越不明显。降低缓存大小将会减小内存使用量。内存池中尚未被使用的那部分内存也会被共享用于这里的数据库缓存。</translation>
+ <translation type="unfinished">資料庫快取的最大大小。 增加快取有助於加快同步,但對於大多數使用場景來說,繼續增加後收效會越來越不明顯。 降低快取大小將會減少記憶體使用量。 記憶體池中尚未被使用的那部分記憶體也會被共享用於這裡的資料庫快取。</translation>
</message>
<message>
<source>Set the number of script verification threads. Negative values correspond to the number of cores you want to leave free to the system.</source>
<extracomment>Tooltip text for Options window setting that sets the number of script verification threads. Explains that negative values mean to leave these many cores free to the system.</extracomment>
- <translation type="unfinished">设置脚本验证线程的数量。负值则表示你想要保留给系统的核心数量。</translation>
+ <translation type="unfinished">設定驗證執行緒的數量。 負值則表示你想要保留給系統的核心數量。</translation>
</message>
<message>
<source>(0 = auto, &lt;0 = leave that many cores free)</source>
@@ -1537,12 +1627,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>This allows you or a third party tool to communicate with the node through command-line and JSON-RPC commands.</source>
<extracomment>Tooltip text for Options window setting that enables the RPC server.</extracomment>
- <translation type="unfinished">这允许作为用户的你或第三方工具通过命令行和JSON-RPC命令行与节点通信。</translation>
+ <translation type="unfinished">這允許作為使用者的你或第三方工具透過命令列和JSON-RPC命令列與節點通訊。</translation>
</message>
<message>
<source>Enable R&amp;PC server</source>
<extracomment>An Options window setting to enable the RPC server.</extracomment>
- <translation type="unfinished">启用R&amp;PC服务器</translation>
+ <translation type="unfinished">啟動R&amp;PC伺服器</translation>
</message>
<message>
<source>W&amp;allet</source>
@@ -1551,12 +1641,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Whether to set subtract fee from amount as default or not.</source>
<extracomment>Tooltip text for Options window setting that sets subtracting the fee from a sending amount as default.</extracomment>
- <translation type="unfinished">是否要默认从金额中减去手续费。</translation>
+ <translation type="unfinished">是否金額中減去手續費當為預設行為</translation>
</message>
<message>
<source>Subtract &amp;fee from amount by default</source>
<extracomment>An Options window setting to set subtracting the fee from a sending amount as default.</extracomment>
- <translation type="unfinished">默认从金额中减去交易手续费(&amp;F)</translation>
+ <translation type="unfinished">預設從金額中減去交易手續費(&amp;F)</translation>
</message>
<message>
<source>Expert</source>
@@ -1577,16 +1667,20 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Enable &amp;PSBT controls</source>
<extracomment>An options window setting to enable PSBT controls.</extracomment>
- <translation type="unfinished">启用&amp;PSBT控件</translation>
+ <translation type="unfinished">啟動&amp;PSBT功能</translation>
</message>
<message>
<source>Whether to show PSBT controls.</source>
<extracomment>Tooltip text for options window setting that enables PSBT controls.</extracomment>
- <translation type="unfinished">是否要显示PSBT控件</translation>
+ <translation type="unfinished">是否要顯示PSBT功能選項</translation>
+ </message>
+ <message>
+ <source>External Signer (e.g. hardware wallet)</source>
+ <translation type="unfinished">外接簽證設備 (e.g. 硬體錢包)</translation>
</message>
<message>
<source>&amp;External signer script path</source>
- <translation type="unfinished">外部签名器脚本路径(&amp;E)</translation>
+ <translation type="unfinished">外接簽證設備執行檔路徑(&amp;E)</translation>
</message>
<message>
<source>Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled.</source>
@@ -1597,6 +1691,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">用 &amp;UPnP 設定通訊埠對應</translation>
</message>
<message>
+ <source>Automatically open the Bitcoin client port on the router. This only works when your router supports NAT-PMP and it is enabled. The external port could be random.</source>
+ <translation type="unfinished">自动在路由器中为比特币客户端打开端口。只有当您的路由器支持 NAT-PMP 功能并开启它,这个功能才会正常工作。外边端口可以是随机的。</translation>
+ </message>
+ <message>
+ <source>Map port using NA&amp;T-PMP</source>
+ <translation type="unfinished">使用 NA&amp;T-PMP 映射端口</translation>
+ </message>
+ <message>
<source>Accept connections from outside.</source>
<translation type="unfinished">接受外來連線</translation>
</message>
@@ -1633,6 +1735,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">&amp;視窗</translation>
</message>
<message>
+ <source>Show the icon in the system tray.</source>
+ <translation type="unfinished">在通知区域显示图标。</translation>
+ </message>
+ <message>
+ <source>&amp;Show tray icon</source>
+ <translation type="unfinished">显示通知区域图标(&amp;S)</translation>
+ </message>
+ <message>
<source>Show only a tray icon after minimizing the window.</source>
<translation type="unfinished">視窗縮到最小後只在通知區顯示圖示。</translation>
</message>
@@ -1666,11 +1776,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Third-party URLs (e.g. a block explorer) that appear in the transactions tab as context menu items. %s in the URL is replaced by transaction hash. Multiple URLs are separated by vertical bar |.</source>
- <translation type="unfinished">这个第三方网址(比如区块浏览器)会出现在交易选项卡的右键菜单中。 网址中的%s代表交易哈希。多个网址需要用竖线 | 相互分隔。</translation>
+ <translation type="unfinished">這個第三方網址(例如區塊瀏覽器)會出現在交易標籤的右鍵選單中。 網址中的%s代表交易哈希。 多個網址需要用垂直線 | 相互分隔。</translation>
</message>
<message>
<source>&amp;Third-party transaction URLs</source>
- <translation type="unfinished">第三方交易网址(&amp;T)</translation>
+ <translation type="unfinished">第三方交易網址(&amp;T)</translation>
</message>
<message>
<source>Whether to show coin control features or not.</source>
@@ -1685,14 +1795,6 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">使用個別的SOCKS&5代理介由Tor onion服務到達peers:</translation>
</message>
<message>
- <source>Monospaced font in the Overview tab:</source>
- <translation type="unfinished">在概览标签页的等宽字体:</translation>
- </message>
- <message>
- <source>embedded "%1"</source>
- <translation type="unfinished">嵌入的 "%1"</translation>
- </message>
- <message>
<source>&amp;OK</source>
<translation type="unfinished">好(&amp;O)</translation>
</message>
@@ -1701,6 +1803,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">取消(&amp;C)</translation>
</message>
<message>
+ <source>Compiled without external signing support (required for external signing)</source>
+ <extracomment>"External signing" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">軟體未編譯外接簽證功能所需的軟體庫(外接簽證必須有此功能)</translation>
+ </message>
+ <message>
<source>default</source>
<translation type="unfinished">預設值</translation>
</message>
@@ -1721,7 +1828,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Current settings will be backed up at "%1".</source>
<extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
- <translation type="unfinished">当前设置将会被备份到 "%1"。</translation>
+ <translation type="unfinished">當前設定將會備份到 "%1"。</translation>
</message>
<message>
<source>Client will be shut down. Do you want to proceed?</source>
@@ -1740,7 +1847,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Continue</source>
- <translation type="unfinished">继续</translation>
+ <translation type="unfinished">繼續</translation>
</message>
<message>
<source>Cancel</source>
@@ -1767,7 +1874,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<name>OptionsModel</name>
<message>
<source>Could not read setting "%1", %2.</source>
- <translation type="unfinished">无法读取设置 "%1",%2。</translation>
+ <translation type="unfinished">無法讀取設定 "%1",%2。</translation>
</message>
</context>
<context>
@@ -1869,7 +1976,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Save…</source>
- <translation type="unfinished">拯救...</translation>
+ <translation type="unfinished">儲存...</translation>
</message>
<message>
<source>Close</source>
@@ -1877,7 +1984,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</message>
<message>
<source>Cannot sign inputs while wallet is locked.</source>
- <translation type="unfinished">钱包已锁定,无法签名交易输入项。</translation>
+ <translation type="unfinished">錢包已鎖定,無法簽署交易輸入項。</translation>
</message>
<message>
<source>Could not sign any more inputs.</source>
@@ -1902,13 +2009,21 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">部分签名交易(二进制)</translation>
+ <translation type="unfinished">部分簽名交易(二進位)</translation>
</message>
<message>
<source>PSBT saved to disk.</source>
<translation type="unfinished">PSBT已儲存到磁碟。</translation>
</message>
<message>
+ <source>Sends %1 to %2</source>
+ <translation type="unfinished">将“%1”发送到“%2”</translation>
+ </message>
+ <message>
+ <source>own address</source>
+ <translation type="unfinished">自己的地址</translation>
+ </message>
+ <message>
<source>Unable to calculate transaction fee or total transaction amount.</source>
<translation type="unfinished">無法計算交易手續費或總交易金額。</translation>
</message>
@@ -1975,9 +2090,9 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Cannot process payment request because BIP70 is not supported.
Due to widespread security flaws in BIP70 it's strongly recommended that any merchant instructions to switch wallets be ignored.
If you are receiving this error you should request the merchant provide a BIP21 compatible URI.</source>
- <translation type="unfinished">因为不支持BIP70,无法处理付款请求。
-由于BIP70具有广泛的安全缺陷,无论哪个商家指引要求您更换钱包,我们都强烈建议您不要听信。
-如果您看到了这个错误,您应该要求商家提供兼容BIP21的URI。</translation>
+ <translation type="unfinished">因為不支援BIP70,無法處理付款請求。
+由於BIP70具有廣泛的安全缺陷,無論哪個商家指引要求更換錢包,強烈建議不要更換。
+如果您看到了這個錯誤,您應該要求商家提供與BIP21相容的URI。</translation>
</message>
<message>
<source>URI cannot be parsed! This can be caused by an invalid Bitcoin address or malformed URI parameters.</source>
@@ -2003,12 +2118,12 @@ If you are receiving this error you should request the merchant provide a BIP21
<message>
<source>Peer</source>
<extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
- <translation type="unfinished">同行</translation>
+ <translation type="unfinished">節點</translation>
</message>
<message>
<source>Age</source>
<extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
- <translation type="unfinished">连接时间</translation>
+ <translation type="unfinished">連接時間</translation>
</message>
<message>
<source>Direction</source>
@@ -2043,19 +2158,19 @@ If you are receiving this error you should request the merchant provide a BIP21
<message>
<source>Inbound</source>
<extracomment>An Inbound Connection from a Peer.</extracomment>
- <translation type="unfinished">進來</translation>
+ <translation type="unfinished">傳入</translation>
</message>
<message>
<source>Outbound</source>
<extracomment>An Outbound Connection to a Peer.</extracomment>
- <translation type="unfinished">出去</translation>
+ <translation type="unfinished">傳出</translation>
</message>
</context>
<context>
<name>QRImageWidget</name>
<message>
<source>&amp;Save Image…</source>
- <translation type="unfinished">保存图像(&amp;S)...</translation>
+ <translation type="unfinished">儲存圖片(&amp;S)...</translation>
</message>
<message>
<source>&amp;Copy Image</source>
@@ -2063,7 +2178,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Resulting URI too long, try to reduce the text for label / message.</source>
- <translation type="unfinished">URI 太长,请试着精简标签或消息文本。</translation>
+ <translation type="unfinished">URI 太長,請縮短標籤或訊息文字。</translation>
</message>
<message>
<source>Error encoding URI into QR Code.</source>
@@ -2080,7 +2195,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<message>
<source>PNG Image</source>
<extracomment>Expanded name of the PNG file format. See: https://en.wikipedia.org/wiki/Portable_Network_Graphics.</extracomment>
- <translation type="unfinished">PNG图像</translation>
+ <translation type="unfinished">PNG 圖</translation>
</message>
</context>
<context>
@@ -2107,15 +2222,15 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>To specify a non-default location of the data directory use the '%1' option.</source>
- <translation type="unfinished">如果不想用默认的数据目录位置,请用 '%1' 这个选项来指定新的位置。</translation>
+ <translation type="unfinished">如果不想用預設的資料目錄位置,請使用'%1' 這個選項來指定新的位置。</translation>
</message>
<message>
<source>Blocksdir</source>
- <translation type="unfinished">区块存储目录</translation>
+ <translation type="unfinished">區塊儲存目錄</translation>
</message>
<message>
<source>To specify a non-default location of the blocks directory use the '%1' option.</source>
- <translation type="unfinished">如果要自定义区块存储目录的位置,请用 '%1' 这个选项来指定新的位置。</translation>
+ <translation type="unfinished">如果要自訂區塊儲存目錄的位置,請使用 '%1' 這個選項來指定新的位置。</translation>
</message>
<message>
<source>Startup time</source>
@@ -2182,16 +2297,28 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">選一個節點來看詳細資訊</translation>
</message>
<message>
+ <source>The transport layer version: %1</source>
+ <translation type="unfinished">傳輸層版本: %1</translation>
+ </message>
+ <message>
+ <source>Transport</source>
+ <translation type="unfinished">傳輸</translation>
+ </message>
+ <message>
+ <source>The BIP324 session ID string in hex, if any.</source>
+ <translation type="unfinished">HEX格式的BIP324 session ID,如果有的話。</translation>
+ </message>
+ <message>
<source>Version</source>
<translation type="unfinished">版本</translation>
</message>
<message>
<source>Whether we relay transactions to this peer.</source>
- <translation type="unfinished">是否要将交易转发给这个节点。</translation>
+ <translation type="unfinished">是否要將交易轉送給這個節點。</translation>
</message>
<message>
<source>Transaction Relay</source>
- <translation type="unfinished">交易转发</translation>
+ <translation type="unfinished">交易轉發</translation>
</message>
<message>
<source>Starting Block</source>
@@ -2199,7 +2326,7 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>Synced Headers</source>
- <translation type="unfinished">已同步前導資料</translation>
+ <translation type="unfinished">已同步區塊頭標</translation>
</message>
<message>
<source>Synced Blocks</source>
@@ -2220,32 +2347,32 @@ If you are receiving this error you should request the merchant provide a BIP21
<message>
<source>Whether we relay addresses to this peer.</source>
<extracomment>Tooltip text for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">是否把地址转发给这个节点。</translation>
+ <translation type="unfinished">是否把位址轉寄給這個節點。</translation>
</message>
<message>
<source>Address Relay</source>
<extracomment>Text title for the Address Relay field in the peer details area, which displays whether we relay addresses to this peer (Yes/No).</extracomment>
- <translation type="unfinished">地址转发</translation>
+ <translation type="unfinished">地址轉發</translation>
</message>
<message>
<source>The total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</source>
<extracomment>Tooltip text for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">从这个节点接收并处理过的地址总数(除去因频次限制而丢弃的那些地址)。</translation>
+ <translation type="unfinished">從這個節點接收並處理過的位址總數(除去因頻次限製而丟棄的那些位址)。</translation>
</message>
<message>
<source>The total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</source>
<extracomment>Tooltip text for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">从这个节点接收后又因频次限制而丢弃(未被处理)的地址总数。</translation>
+ <translation type="unfinished">從這個節點接收後又因頻次限製而丟棄(未被處理)的位址總數。</translation>
</message>
<message>
<source>Addresses Processed</source>
<extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
- <translation type="unfinished">已处理地址</translation>
+ <translation type="unfinished">已處理地址</translation>
</message>
<message>
<source>Addresses Rate-Limited</source>
<extracomment>Text title for the Addresses Rate-Limited field in the peer details area, which displays the total number of addresses received from this peer that were dropped (not processed) due to rate-limiting.</extracomment>
- <translation type="unfinished">被频率限制丢弃的地址</translation>
+ <translation type="unfinished">被頻率限制丟棄的地址</translation>
</message>
<message>
<source>User Agent</source>
@@ -2277,15 +2404,15 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>The direction and type of peer connection: %1</source>
- <translation type="unfinished">节点连接的方向和类型: %1</translation>
+ <translation type="unfinished">節點連接的方向和類型: %1</translation>
</message>
<message>
<source>Direction/Type</source>
- <translation type="unfinished">方向/类型</translation>
+ <translation type="unfinished">方向/類型</translation>
</message>
<message>
<source>The network protocol this peer is connected through: IPv4, IPv6, Onion, I2P, or CJDNS.</source>
- <translation type="unfinished">这个节点是通过这种网络协议连接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
+ <translation type="unfinished">這個節點是透過這種網路協定連接到的: IPv4, IPv6, Onion, I2P, 或 CJDNS.</translation>
</message>
<message>
<source>Services</source>
@@ -2293,19 +2420,28 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>High bandwidth BIP152 compact block relay: %1</source>
- <translation type="unfinished">高带宽BIP152密实区块转发: %1</translation>
+ <translation type="unfinished">高頻寬BIP152密集區塊轉發: %1</translation>
</message>
<message>
<source>High Bandwidth</source>
- <translation type="unfinished">高带宽</translation>
+ <translation type="unfinished">高頻寬</translation>
</message>
<message>
<source>Connection Time</source>
<translation type="unfinished">連線時間</translation>
</message>
<message>
+ <source>Elapsed time since a novel block passing initial validity checks was received from this peer.</source>
+ <translation type="unfinished">來自這個節點上次成功驗證新區塊已經過的時間</translation>
+ </message>
+ <message>
<source>Last Block</source>
- <translation type="unfinished">上一个区块</translation>
+ <translation type="unfinished">上一個區塊</translation>
+ </message>
+ <message>
+ <source>Elapsed time since a novel transaction accepted into our mempool was received from this peer.</source>
+ <extracomment>Tooltip text for the Last Transaction field in the peer details area.</extracomment>
+ <translation type="unfinished">來自這個節點上次成功驗證新交易進入內存池已經過的時間</translation>
</message>
<message>
<source>Last Send</source>
@@ -2365,49 +2501,73 @@ If you are receiving this error you should request the merchant provide a BIP21
</message>
<message>
<source>In:</source>
- <translation type="unfinished">來:</translation>
+ <translation type="unfinished">傳入:</translation>
</message>
<message>
<source>Out:</source>
- <translation type="unfinished">去:</translation>
+ <translation type="unfinished">傳出:</translation>
</message>
<message>
<source>Inbound: initiated by peer</source>
<extracomment>Explanatory text for an inbound peer connection.</extracomment>
- <translation type="unfinished">入站: 由对端发起</translation>
+ <translation type="unfinished">Inbound: 由對端節點發起</translation>
</message>
<message>
<source>Outbound Full Relay: default</source>
<extracomment>Explanatory text for an outbound peer connection that relays all network information. This is the default behavior for outbound connections.</extracomment>
- <translation type="unfinished">出站完整转发: 默认</translation>
+ <translation type="unfinished">完整轉發: 預設</translation>
</message>
<message>
<source>Outbound Block Relay: does not relay transactions or addresses</source>
<extracomment>Explanatory text for an outbound peer connection that relays network information about blocks and not transactions or addresses.</extracomment>
- <translation type="unfinished">出站区块转发: 不转发交易和地址</translation>
+ <translation type="unfinished">出站區塊轉送: 不轉送交易和地址</translation>
</message>
<message>
<source>Outbound Manual: added using RPC %1 or %2/%3 configuration options</source>
<extracomment>Explanatory text for an outbound peer connection that was established manually through one of several methods. The numbered arguments are stand-ins for the methods available to establish manual connections.</extracomment>
- <translation type="unfinished">出站手动: 加入使用RPC %1 或 %2/%3 配置选项</translation>
+ <translation type="unfinished">手動Outbound: 加入使用RPC %1 或 %2/%3 配置選項</translation>
</message>
<message>
<source>Outbound Feeler: short-lived, for testing addresses</source>
<extracomment>Explanatory text for a short-lived outbound peer connection that is used to test the aliveness of known addresses.</extracomment>
- <translation type="unfinished">出站触须: 短暂,用于测试地址</translation>
+ <translation type="unfinished">Outbound Feeler: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
+ <source>Outbound Address Fetch: short-lived, for soliciting addresses</source>
+ <extracomment>Explanatory text for a short-lived outbound peer connection that is used to request addresses from a peer.</extracomment>
+ <translation type="unfinished">Outbound 地址取得: 用於短暫,暫時 測試地址</translation>
+ </message>
+ <message>
+ <source>detecting: peer could be v1 or v2</source>
+ <extracomment>Explanatory text for "detecting" transport type.</extracomment>
+ <translation type="unfinished">檢測中: 節點可能是v1或是v2</translation>
+ </message>
+ <message>
+ <source>v1: unencrypted, plaintext transport protocol</source>
+ <extracomment>Explanatory text for v1 transport type.</extracomment>
+ <translation type="unfinished">v1: 未加密,明文傳輸協定</translation>
+ </message>
+ <message>
+ <source>v2: BIP324 encrypted transport protocol</source>
+ <extracomment>Explanatory text for v2 transport type.</extracomment>
+ <translation type="unfinished">v2: BIP324加密傳輸協議</translation>
</message>
<message>
<source>we selected the peer for high bandwidth relay</source>
- <translation type="unfinished">我们选择了用于高带宽转发的节点</translation>
+ <translation type="unfinished">我們選擇了用於高頻寬轉送的節點</translation>
</message>
<message>
<source>the peer selected us for high bandwidth relay</source>
- <translation type="unfinished">对端选择了我们用于高带宽转发</translation>
+ <translation type="unfinished">對端選擇了我們用於高頻寬轉發</translation>
+ </message>
+ <message>
+ <source>no high bandwidth relay selected</source>
+ <translation type="unfinished">未選擇高頻寬轉發點</translation>
</message>
<message>
<source>&amp;Copy address</source>
<extracomment>Context menu action to copy the address of a peer.</extracomment>
- <translation type="unfinished">&amp;复制地址</translation>
+ <translation type="unfinished">&amp;複製地址</translation>
</message>
<message>
<source>&amp;Disconnect</source>
@@ -2418,6 +2578,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">1 小時(&amp;H)</translation>
</message>
<message>
+ <source>1 d&amp;ay</source>
+ <translation type="unfinished">1 天(&amp;A)</translation>
+ </message>
+ <message>
<source>1 &amp;week</source>
<translation type="unfinished">1 星期(&amp;W)</translation>
</message>
@@ -2428,7 +2592,7 @@ If you are receiving this error you should request the merchant provide a BIP21
<message>
<source>&amp;Copy IP/Netmask</source>
<extracomment>Context menu action to copy the IP/Netmask of a banned peer. IP/Netmask is the combination of a peer's IP address and its Netmask. For IP address, see: https://en.wikipedia.org/wiki/IP_address.</extracomment>
- <translation type="unfinished">复制IP/网络掩码(&amp;C)</translation>
+ <translation type="unfinished">複製IP/遮罩(&amp;C)</translation>
</message>
<message>
<source>&amp;Unban</source>
@@ -2443,6 +2607,10 @@ If you are receiving this error you should request the merchant provide a BIP21
<translation type="unfinished">不使用任何錢包來執行指令</translation>
</message>
<message>
+ <source>Node window - [%1]</source>
+ <translation type="unfinished">节点窗口 - [%1]</translation>
+ </message>
+ <message>
<source>Executing command using "%1" wallet</source>
<translation type="unfinished">使用 %1 錢包來執行指令</translation>
</message>
@@ -2455,18 +2623,22 @@ For more information on using this console, type %6.
%7WARNING: Scammers have been active, telling users to type commands here, stealing their wallet contents. Do not use this console without fully understanding the ramifications of a command.%8</source>
<extracomment>RPC console welcome message. Placeholders %7 and %8 are style tags for the warning content, and they are not space separated from the rest of the text intentionally.</extracomment>
- <translation type="unfinished">欢迎来到 %1 RPC 控制台。
-使用上与下箭头以进行历史导航,%2 以清除屏幕。
-使用%3 和 %4 以增加或减小字体大小。
-输入 %5 以显示可用命令的概览。
-查看更多关于此控制台的信息,输入 %6。
+ <translation type="unfinished">歡迎來到 %1 RPC 控制台。
+使用上與下箭頭以進行歷史導航,%2 以清除螢幕。
+使用%3 和 %4 以增加或減少字體大小。
+輸入 %5 以顯示可用命令的概覽。
+查看更多關於此控制台的信息,輸入 %6。
-%7 警告:骗子们很活跃,告诉用户在这里输入命令,偷走他们钱包中的内容。不要在不完全了解一个命令的后果的情况下使用此控制台。%8</translation>
+%7 警告:騙子們很狡猾,告訴用戶在這裡輸入命令,清空錢包。 不要在不完全了解一個命令的後果的情況下使用此控制台。%8</translation>
</message>
<message>
<source>Executing…</source>
<extracomment>A console message indicating an entered command is currently being executed.</extracomment>
- <translation type="unfinished">执行中……</translation>
+ <translation type="unfinished">執行中……</translation>
+ </message>
+ <message>
+ <source>(peer: %1)</source>
+ <translation type="unfinished">(节点: %1)</translation>
</message>
<message>
<source>via %1</source>
@@ -2577,39 +2749,39 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Copy address</source>
- <translation type="unfinished">&amp;复制地址</translation>
+ <translation type="unfinished">&amp;複製地址</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">复制和标签</translation>
+ <translation type="unfinished">複製 &amp;label</translation>
</message>
<message>
<source>Copy &amp;message</source>
- <translation type="unfinished">复制消息(&amp;M)</translation>
+ <translation type="unfinished">複製訊息(&amp;M)</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">复制和数量</translation>
+ <translation type="unfinished">複製金額 &amp;amount</translation>
</message>
<message>
<source>Base58 (Legacy)</source>
- <translation type="unfinished">Base58 (旧式)</translation>
+ <translation type="unfinished">Base58 (舊式)</translation>
</message>
<message>
<source>Not recommended due to higher fees and less protection against typos.</source>
- <translation type="unfinished">因手续费较高,而且打字错误防护较弱,故不推荐。</translation>
+ <translation type="unfinished">因手續費較高,打字錯誤防護較弱,故不推薦。</translation>
</message>
<message>
<source>Generates an address compatible with older wallets.</source>
- <translation type="unfinished">生成一个与旧版钱包兼容的地址。</translation>
+ <translation type="unfinished">產生一個與舊版錢包相容的位址。</translation>
</message>
<message>
<source>Generates a native segwit address (BIP-173). Some old wallets don't support it.</source>
- <translation type="unfinished">生成一个原生隔离见证地址 (BIP-173) 。不被部分旧版本钱包所支持。</translation>
+ <translation type="unfinished">產生一個原生隔離見證Segwit 位址 (BIP-173) 。 被部分舊版錢包不支援。</translation>
</message>
<message>
<source>Bech32m (BIP-350) is an upgrade to Bech32, wallet support is still limited.</source>
- <translation type="unfinished">Bech32m (BIP-350) 是对 Bech32 的更新升级,支持它的钱包仍然比较有限。</translation>
+ <translation type="unfinished">Bech32m (BIP-350) 是 Bech32 的更新升級,支援它的錢包仍然比較有限。</translation>
</message>
<message>
<source>Could not unlock wallet.</source>
@@ -2620,7 +2792,7 @@ For more information on using this console, type %6.
<name>ReceiveRequestDialog</name>
<message>
<source>Request payment to …</source>
- <translation type="unfinished">请求支付至...</translation>
+ <translation type="unfinished">請求支付至...</translation>
</message>
<message>
<source>Address:</source>
@@ -2651,8 +2823,16 @@ For more information on using this console, type %6.
<translation type="unfinished">複製 &amp;地址</translation>
</message>
<message>
+ <source>&amp;Verify</source>
+ <translation type="unfinished">验证(&amp;V)</translation>
+ </message>
+ <message>
+ <source>Verify this address on e.g. a hardware wallet screen</source>
+ <translation type="unfinished">在像是硬件钱包屏幕的地方检验这个地址</translation>
+ </message>
+ <message>
<source>&amp;Save Image…</source>
- <translation type="unfinished">保存图像(&amp;S)...</translation>
+ <translation type="unfinished">儲存圖片(&amp;S)...</translation>
</message>
<message>
<source>Payment information</source>
@@ -2785,26 +2965,38 @@ For more information on using this console, type %6.
<translation type="unfinished">把表單中的所有欄位清空。</translation>
</message>
<message>
- <source>Dust:</source>
- <translation type="unfinished">零散錢:</translation>
+ <source>Inputs…</source>
+ <translation type="unfinished">输入...</translation>
</message>
<message>
<source>Choose…</source>
- <translation type="unfinished">选择...</translation>
+ <translation type="unfinished">選擇...</translation>
</message>
<message>
<source>Hide transaction fee settings</source>
<translation type="unfinished">隱藏交易手續費設定</translation>
</message>
<message>
+ <source>Specify a custom fee per kB (1,000 bytes) of the transaction's virtual size.
+
+Note: Since the fee is calculated on a per-byte basis, a fee rate of "100 satoshis per kvB" for a transaction size of 500 virtual bytes (half of 1 kvB) would ultimately yield a fee of only 50 satoshis.</source>
+ <translation type="unfinished">指定交易虚拟大小的每kB (1,000字节) 自定义费率。
+
+附注:因为矿工费是按字节计费的,所以如果费率是“每kvB支付100聪”,那么对于一笔500虚拟字节 (1kvB的一半) 的交易,最终将只会产生50聪的矿工费。(译注:这里就是提醒单位是字节,而不是千字节,如果搞错的话,矿工费会过低,导致交易长时间无法确认,或者压根无法发出)</translation>
+ </message>
+ <message>
<source>When there is less transaction volume than space in the blocks, miners as well as relaying nodes may enforce a minimum fee. Paying only this minimum fee is just fine, but be aware that this can result in a never confirming transaction once there is more demand for bitcoin transactions than the network can process.</source>
- <translation type="unfinished">当交易量小于可用区块空间时,矿工和中继节点可能会执行最低手续费率限制。按照这个最低费率来支付手续费也是可以的,但请注意,一旦交易需求超出比特币网络能处理的限度,你的交易可能永远也无法确认。</translation>
+ <translation type="unfinished">當交易量小於可用區塊空間時,礦工和節點可能會執行最低手續費率限制。 以這個最低費率來支付手續費也是可以的,但請注意,一旦交易需求超出比特幣網路能處理的限度,你的交易可能永遠無法確認。</translation>
</message>
<message>
<source>A too low fee might result in a never confirming transaction (read the tooltip)</source>
<translation type="unfinished">手續費太低的話可能會造成永遠無法確認的交易(請參考提示)</translation>
</message>
<message>
+ <source>(Smart fee not initialized yet. This usually takes a few blocks…)</source>
+ <translation type="unfinished">(手續費智慧演算法還沒準備好。通常都要等幾個區塊才行...)</translation>
+ </message>
+ <message>
<source>Confirmation time target:</source>
<translation type="unfinished">目標確認時間:</translation>
</message>
@@ -2853,10 +3045,6 @@ For more information on using this console, type %6.
<translation type="unfinished">複製位元組數</translation>
</message>
<message>
- <source>Copy dust</source>
- <translation type="unfinished">複製零散金額</translation>
- </message>
- <message>
<source>Copy change</source>
<translation type="unfinished">複製找零金額</translation>
</message>
@@ -2865,12 +3053,22 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 (%2 個區塊)</translation>
</message>
<message>
- <source>Cr&amp;eate Unsigned</source>
- <translation type="unfinished">Cr&eate未簽名</translation>
+ <source>Sign on device</source>
+ <extracomment>"device" usually means a hardware wallet.</extracomment>
+ <translation type="unfinished">在設備上簽證</translation>
+ </message>
+ <message>
+ <source>Connect your hardware wallet first.</source>
+ <translation type="unfinished">請先連接硬體錢包</translation>
+ </message>
+ <message>
+ <source>Set external signer script path in Options -&gt; Wallet</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">在 選項 -&gt; 錢包 中設定外部簽名器腳本路徑 </translation>
</message>
<message>
- <source> from wallet '%1'</source>
- <translation type="unfinished">從錢包 %1</translation>
+ <source>Cr&amp;eate Unsigned</source>
+ <translation type="unfinished">Cr&eate未簽名</translation>
</message>
<message>
<source>%1 to '%2'</source>
@@ -2881,13 +3079,22 @@ For more information on using this console, type %6.
<translation type="unfinished">%1 給 %2</translation>
</message>
<message>
+ <source>To review recipient list click "Show Details…"</source>
+ <translation type="unfinished">要查看收件人列表,請單擊"顯示詳細訊息..."</translation>
+ </message>
+ <message>
<source>Sign failed</source>
<translation type="unfinished">簽署失敗</translation>
</message>
<message>
+ <source>External signer not found</source>
+ <extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
+ <translation type="unfinished">未找到外部簽名器</translation>
+ </message>
+ <message>
<source>External signer failure</source>
<extracomment>"External signer" means using devices such as hardware wallets.</extracomment>
- <translation type="unfinished">外部签名器失败</translation>
+ <translation type="unfinished">外部簽名器失敗</translation>
</message>
<message>
<source>Save Transaction Data</source>
@@ -2896,7 +3103,7 @@ For more information on using this console, type %6.
<message>
<source>Partially Signed Transaction (Binary)</source>
<extracomment>Expanded name of the binary PSBT file format. See: BIP 174.</extracomment>
- <translation type="unfinished">部分签名交易(二进制)</translation>
+ <translation type="unfinished">部分簽名交易(二進位)</translation>
</message>
<message>
<source>PSBT saved</source>
@@ -2912,14 +3119,18 @@ For more information on using this console, type %6.
<translation type="unfinished">你可以之後再提高手續費(有 BIP-125 手續費追加的標記)</translation>
</message>
<message>
+ <source>%1 from wallet '%2'</source>
+ <translation type="unfinished">%1 来自钱包 “%2”</translation>
+ </message>
+ <message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
- <translation type="unfinished">要创建这笔交易吗?</translation>
+ <translation type="unfinished">要創建這筆交易嗎?</translation>
</message>
<message>
<source>Please, review your transaction. You can create and send this transaction or create a Partially Signed Bitcoin Transaction (PSBT), which you can save or copy and then sign with, e.g., an offline %1 wallet, or a PSBT-compatible hardware wallet.</source>
<extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can send their transaction or create a PSBT. This string is displayed when both private keys and PSBT controls are enabled.</extracomment>
- <translation type="unfinished">请务必仔细检查您的交易。你可以创建并发送这笔交易;也可以创建一个“部分签名比特币交易(PSBT)”,它可以被保存下来或被复制出去,然后就可以对它进行签名,比如用离线%1钱包,或是用兼容PSBT的硬件钱包。</translation>
+ <translation type="unfinished">請務必仔細檢查您的交易。 你可以創建並發送這筆交易;也可以創建一個“部分簽名比特幣交易(PSBT)”,它可以被保存下來或被複製出去,然後就可以對它進行簽名,比如用離線%1錢包,或 是用相容PSBT的硬體錢包。</translation>
</message>
<message>
<source>Please, review your transaction.</source>
@@ -2942,15 +3153,15 @@ For more information on using this console, type %6.
<source>Unsigned Transaction</source>
<comment>PSBT copied</comment>
<extracomment>Caption of "PSBT has been copied" messagebox</extracomment>
- <translation type="unfinished">未签名交易</translation>
+ <translation type="unfinished">未被簽名交易</translation>
</message>
<message>
<source>The PSBT has been copied to the clipboard. You can also save it.</source>
- <translation type="unfinished">PSBT已被复制到剪贴板。您也可以保存它。</translation>
+ <translation type="unfinished">PSBT已被複製到剪貼簿。 您也可以保存它。</translation>
</message>
<message>
<source>PSBT saved to disk</source>
- <translation type="unfinished">PSBT已保存到磁盘</translation>
+ <translation type="unfinished">PSBT已儲存到磁碟。</translation>
</message>
<message>
<source>Confirm send coins</source>
@@ -2991,7 +3202,7 @@ For more information on using this console, type %6.
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
- <numerusform>预计%n个区块内确认。</numerusform>
+ <numerusform>預計%n個區塊內確認。</numerusform>
</translation>
</message>
<message>
@@ -3236,7 +3447,7 @@ For more information on using this console, type %6.
</message>
<message>
<source>press q to shutdown</source>
- <translation type="unfinished">按q键关闭并退出</translation>
+ <translation type="unfinished">按q鍵關閉並退出</translation>
</message>
</context>
<context>
@@ -3249,12 +3460,12 @@ For more information on using this console, type %6.
<message>
<source>0/unconfirmed, in memory pool</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is in the memory pool.</extracomment>
- <translation type="unfinished">0/未确认,在内存池中</translation>
+ <translation type="unfinished">0/未確認,在內存池中</translation>
</message>
<message>
<source>0/unconfirmed, not in memory pool</source>
<extracomment>Text explaining the current status of a transaction, shown in the status field of the details window for this transaction. This status represents an unconfirmed transaction that is not in the memory pool.</extracomment>
- <translation type="unfinished">0/未确认,不在内存池中</translation>
+ <translation type="unfinished">0/未確認,不在內存池中</translation>
</message>
<message>
<source>abandoned</source>
@@ -3318,7 +3529,7 @@ For more information on using this console, type %6.
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
- <numerusform>在%n个区块内成熟</numerusform>
+ <numerusform>在%n個區塊內成熟</numerusform>
</translation>
</message>
<message>
@@ -3370,8 +3581,8 @@ For more information on using this console, type %6.
<translation type="unfinished">輸出索引</translation>
</message>
<message>
- <source> (Certificate was not verified)</source>
- <translation type="unfinished">(證書未驗證)</translation>
+ <source>%1 (Certificate was not verified)</source>
+ <translation type="unfinished">%1(证书未被验证)</translation>
</message>
<message>
<source>Merchant</source>
@@ -3472,10 +3683,6 @@ For more information on using this console, type %6.
<translation type="unfinished">付款</translation>
</message>
<message>
- <source>Payment to yourself</source>
- <translation type="unfinished">付給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -3551,10 +3758,6 @@ For more information on using this console, type %6.
<translation type="unfinished">付款</translation>
</message>
<message>
- <source>To yourself</source>
- <translation type="unfinished">給自己</translation>
- </message>
- <message>
<source>Mined</source>
<translation type="unfinished">開採所得</translation>
</message>
@@ -3576,15 +3779,15 @@ For more information on using this console, type %6.
</message>
<message>
<source>&amp;Copy address</source>
- <translation type="unfinished">&amp;复制地址</translation>
+ <translation type="unfinished">&amp;複製地址</translation>
</message>
<message>
<source>Copy &amp;label</source>
- <translation type="unfinished">复制和标签</translation>
+ <translation type="unfinished">複製 &amp;label</translation>
</message>
<message>
<source>Copy &amp;amount</source>
- <translation type="unfinished">复制和数量</translation>
+ <translation type="unfinished">複製金額 &amp;amount</translation>
</message>
<message>
<source>Copy transaction &amp;ID</source>
@@ -3592,20 +3795,32 @@ For more information on using this console, type %6.
</message>
<message>
<source>Copy &amp;raw transaction</source>
- <translation type="unfinished">复制原始交易(&amp;R)</translation>
+ <translation type="unfinished">複製交易(原始)</translation>
+ </message>
+ <message>
+ <source>Copy full transaction &amp;details</source>
+ <translation type="unfinished">複製完整交易明細</translation>
+ </message>
+ <message>
+ <source>&amp;Show transaction details</source>
+ <translation type="unfinished">顯示交易明細</translation>
</message>
<message>
<source>Increase transaction &amp;fee</source>
- <translation type="unfinished">增加矿工费(&amp;F)</translation>
+ <translation type="unfinished">增加礦工費(&amp;fee)</translation>
+ </message>
+ <message>
+ <source>A&amp;bandon transaction</source>
+ <translation type="unfinished">放棄交易(&amp;b)</translation>
</message>
<message>
<source>&amp;Edit address label</source>
- <translation type="unfinished">编辑地址标签(&amp;E)</translation>
+ <translation type="unfinished">編輯地址標籤(&amp;E)</translation>
</message>
<message>
<source>Show in %1</source>
<extracomment>Transactions table context menu action to show the selected transaction in a third-party block explorer. %1 is a stand-in argument for the URL of the explorer.</extracomment>
- <translation type="unfinished">在 %1中显示</translation>
+ <translation type="unfinished">在 %1中顯示</translation>
</message>
<message>
<source>Export Transaction History</source>
@@ -3741,7 +3956,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Warning: This may pay the additional fee by reducing change outputs or adding inputs, when necessary. It may add a new change output if one does not already exist. These changes may potentially leak privacy.</source>
- <translation type="unfinished">警告: 因为在必要的时候会减少找零输出个数或增加输入个数,这可能要付出额外的费用。在没有找零输出的情况下可能会新增一个。这些变更可能会导致潜在的隐私泄露。</translation>
+ <translation type="unfinished">警告: 因為在必要的時候會減少找零輸出個數或增加輸入個數,這可能要付出額外的費用。 在沒有找零輸出的情況下可能會新增一個。 這些變更可能會導致潛在的隱私洩漏。</translation>
</message>
<message>
<source>Confirm fee bump</source>
@@ -3753,12 +3968,12 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>PSBT copied</source>
- <translation type="unfinished">PSBT已復制</translation>
+ <translation type="unfinished">PSBT已複製</translation>
</message>
<message>
<source>Copied to clipboard</source>
<comment>Fee-bump PSBT saved</comment>
- <translation type="unfinished">复制到剪贴板</translation>
+ <translation type="unfinished">複製到剪贴板</translation>
</message>
<message>
<source>Can't sign transaction.</source>
@@ -3769,8 +3984,12 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">沒辦法提交交易</translation>
</message>
<message>
+ <source>Can't display address</source>
+ <translation type="unfinished">無法顯示地址</translation>
+ </message>
+ <message>
<source>default wallet</source>
- <translation type="unfinished">默认钱包</translation>
+ <translation type="unfinished">預設錢包</translation>
</message>
</context>
<context>
@@ -3820,12 +4039,16 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">%s 開發人員</translation>
</message>
<message>
+ <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate will be left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
+ <translation type="unfinished">%s 驗證 -assumeutxo 快照狀態失敗。 這顯示硬體可能有問題,也可能是軟體bug,或是軟體被不當修改、從而讓非法快照也能夠載入。 因此,將關閉節點並停止使用從這個快照建構出的任何狀態,並將鏈高度從 %d 重置到 %d 。下次啟動時,節點將會不使用快照資料從 %d 繼續同步。 請將這個事件回報給 %s 並在報告中包括您是如何獲得這份快照的。 無效的鏈狀態快照仍保存至磁碟上,以供診斷問題的原因。</translation>
+ </message>
+ <message>
<source>%s request to listen on port %u. This port is considered "bad" and thus it is unlikely that any peer will connect to it. See doc/p2p-bad-ports.md for details and a full list.</source>
- <translation type="unfinished">%s请求监听端口%u。此端口被认为是“坏的”,所以不太可能有其他节点会连接过来。详情以及完整的端口列表请参见 doc/p2p-bad-ports.md 。</translation>
+ <translation type="unfinished">%s請求監聽端口%u。此連接埠被認為是“壞的”,所以不太可能有其他節點會連接過來。 詳情以及完整的連接埠清單請參閱 doc/p2p-bad-ports.md 。</translation>
</message>
<message>
<source>Cannot downgrade wallet from version %i to version %i. Wallet version unchanged.</source>
- <translation type="unfinished">无法把钱包版本从%i降级到%i。钱包版本未改变。</translation>
+ <translation type="unfinished">無法把皮夾版本從%i降級到%i。錢包版本未改變。</translation>
</message>
<message>
<source>Cannot obtain a lock on data directory %s. %s is probably already running.</source>
@@ -3833,11 +4056,11 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<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">无法在不支持“拆分前的密钥池”(pre split keypool)的情况下把“非拆分HD钱包”(non HD split wallet)从版本%i升级到%i。请使用版本号%i,或者压根不要指定版本号。</translation>
+ <translation type="unfinished">無法在不支援「分割前的金鑰池」(pre split keypool)的情況下把「非分割HD錢包」(non HD split wallet)從版本%i升级到%i。請使用版本號%i,或壓根不要指定版本號。</translation>
</message>
<message>
<source>Disk space for %s may not accommodate the block files. Approximately %u GB of data will be stored in this directory.</source>
- <translation type="unfinished">%s的磁盘空间可能无法容纳区块文件。大约要在这个目录中储存 %uGB 的数据。</translation>
+ <translation type="unfinished">%s的硬碟空間可能無法容納區塊文件。 大約要在這個目錄中儲存 %uGB的數據。</translation>
</message>
<message>
<source>Distributed under the MIT software license, see the accompanying file %s or %s</source>
@@ -3845,39 +4068,55 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height %s</source>
- <translation type="unfinished">加载钱包时出错。需要下载区块才能加载钱包,而且在使用assumeutxo快照时,下载区块是不按顺序的,这个时候软件不支持加载钱包。在节点同步至高度%s之后就应该可以加载钱包了。</translation>
- </message>
- <message>
- <source>Error reading %s! All keys read correctly, but transaction data or address book entries might be missing or incorrect.</source>
- <translation type="unfinished">讀取錢包檔 %s 時發生錯誤!所有的鑰匙都正確讀取了,但是交易資料或地址簿資料可能會缺少或不正確。</translation>
+ <translation type="unfinished">加載錢包時發生錯誤。 需要下載區塊才能載入錢包,而且在使用assumeutxo快照時,下載區塊是不按順序的,這個時候軟體不支援載入錢包。 在節點同步至高度%s之後就應該可以加載錢包了。</translation>
</message>
<message>
<source>Error reading %s! Transaction data may be missing or incorrect. Rescanning wallet.</source>
- <translation type="unfinished">读取%s出错!交易数据可能丢失或有误。重新扫描钱包中。</translation>
+ <translation type="unfinished">讀取%s出錯! 交易資料可能遺失或有誤。 重新掃描錢包中。</translation>
</message>
<message>
<source>Error: Dumpfile format record is incorrect. Got "%s", expected "format".</source>
- <translation type="unfinished">错误: 转储文件格式不正确。得到是"%s",而预期本应得到的是 "format"。</translation>
+ <translation type="unfinished">錯誤: 轉儲文件格式不正確。 得到是"%s",而預期本應得到的是 "format"。</translation>
+ </message>
+ <message>
+ <source>Error: Dumpfile identifier record is incorrect. Got "%s", expected "%s".</source>
+ <translation type="unfinished">错误: 转储文件标识符记录不正确。得到的是 "%s",而预期本应得到的是 "%s"。</translation>
</message>
<message>
<source>Error: Dumpfile version is not supported. This version of bitcoin-wallet only supports version 1 dumpfiles. Got dumpfile with version %s</source>
- <translation type="unfinished">错误: 转储文件版本不被支持。这个版本的 bitcoin-wallet 只支持版本为 1 的转储文件。得到的转储文件版本却是%s</translation>
+ <translation type="unfinished">錯誤: 轉儲文件版本不支援。 這個版本的 bitcoin-wallet 只支援版本為 1 的轉儲檔案。 得到的轉儲文件版本是%s</translation>
+ </message>
+ <message>
+ <source>Error: Legacy wallets only support the "legacy", "p2sh-segwit", and "bech32" address types</source>
+ <translation type="unfinished">錯誤: 舊式錢包只支援 "legacy", "p2sh-segwit", 和 "bech32" 這三種位址類型</translation>
</message>
<message>
<source>Error: Unable to produce descriptors for this legacy wallet. Make sure to provide the wallet's passphrase if it is encrypted.</source>
- <translation type="unfinished">错误: 无法为该旧式钱包生成描述符。如果钱包已被加密,请确保提供的钱包加密密码正确。</translation>
+ <translation type="unfinished">錯誤: 無法為該舊式錢包產生描述符。 如果錢包已加密,請確保提供的錢包加密密碼正確。</translation>
+ </message>
+ <message>
+ <source>File %s already exists. If you are sure this is what you want, move it out of the way first.</source>
+ <translation type="unfinished">檔案%s已經存在。 如果你確定這就是你想做的,先把這份檔案移開。</translation>
</message>
<message>
<source>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>
- <translation type="unfinished">无效或损坏的peers.dat (%s)。如果你确信这是一个bug,请反馈到%s。作为变通办法,你可以把现有文件 (%s) 移开(重命名、移动或删除),这样就可以在下次启动时创建一个新文件了。</translation>
+ <translation type="unfinished">無效或損壞的peers.dat(%s)。如果你確信這是一個bug,請回饋到%s。作為變通辦法,你可以把現有文件 (%s) 移開(重新命名、移動或刪除),這樣就可以在下次啟動時建立一個新檔案了。</translation>
+ </message>
+ <message>
+ <source>More than one onion bind address is provided. Using %s for the automatically created Tor onion service.</source>
+ <translation type="unfinished">提供多數TOR路由綁定位址。 對自動建立的Tor服務用%s</translation>
</message>
<message>
<source>No dump file provided. To use createfromdump, -dumpfile=&lt;filename&gt; must be provided.</source>
- <translation type="unfinished">没有提供转储文件。要使用 createfromdump ,必须提供 -dumpfile=&lt;filename&gt;。</translation>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 createfromdump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
+ </message>
+ <message>
+ <source>No dump file provided. To use dump, -dumpfile=&lt;filename&gt; must be provided.</source>
+ <translation type="unfinished">沒有提供轉儲文件。 要使用 dump ,必須提供 -dumpfile=&lt;filename&gt;。</translation>
</message>
<message>
<source>No wallet file format provided. To use createfromdump, -format=&lt;format&gt; must be provided.</source>
- <translation type="unfinished">没有提供钱包格式。要使用 createfromdump ,必须提供 -format=&lt;format&gt;</translation>
+ <translation type="unfinished">沒有提供錢包格式。 要使用 createfromdump ,必須提供 -format=&lt;format&gt;</translation>
</message>
<message>
<source>Please check that your computer's date and time are correct! If your clock is wrong, %s will not work properly.</source>
@@ -3893,19 +4132,23 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Prune mode is incompatible with -reindex-chainstate. Use full -reindex instead.</source>
- <translation type="unfinished">修剪模式与 -reindex-chainstate 不兼容。请进行一次完整的 -reindex 。</translation>
+ <translation type="unfinished">修剪模式與 -reindex-chainstate 不相容。 請進行一次完整的 -reindex 。</translation>
</message>
<message>
<source>Prune: last wallet synchronisation goes beyond pruned data. You need to -reindex (download the whole blockchain again in case of pruned node)</source>
<translation type="unfinished">修剪模式:錢包的最後同步狀態是在被修剪掉的區塊資料中。你需要用 -reindex 參數執行(會重新下載整個區塊鏈)</translation>
</message>
<message>
- <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
- <translation type="unfinished">區塊資料庫中有來自未來的區塊。可能是你電腦的日期時間不對。如果確定電腦日期時間沒錯的話,就重建區塊資料庫看看。</translation>
+ <source>Rename of '%s' -&gt; '%s' failed. You should resolve this by manually moving or deleting the invalid snapshot directory %s, otherwise you will encounter the same error again on the next startup.</source>
+ <translation type="unfinished">重命名 '%s' -&gt; '%s' 失敗。 您需要手動移除或刪除無效的快照目錄 %s來解決這個問題,不然的話您就會在下一次啟動時遇到相同的錯誤。</translation>
+ </message>
+ <message>
+ <source>SQLiteDatabase: Unknown sqlite wallet schema version %d. Only version %d is supported</source>
+ <translation type="unfinished">SQLiteDatabase: SQLite錢包schema版本%d未知。 只支持%d版本</translation>
</message>
<message>
- <source>The block index db contains a legacy 'txindex'. To clear the occupied disk space, run a full -reindex, otherwise ignore this error. This error message will not be displayed again.</source>
- <translation type="unfinished">区块索引数据库含有历史遗留的 'txindex' 。可以运行完整的 -reindex 来清理被占用的磁盘空间;也可以忽略这个错误。这个错误消息将不会再次显示。</translation>
+ <source>The block database contains a block which appears to be from the future. This may be due to your computer's date and time being set incorrectly. Only rebuild the block database if you are sure that your computer's date and time are correct</source>
+ <translation type="unfinished">區塊資料庫中有來自未來的區塊。可能是你電腦的日期時間不對。如果確定電腦日期時間沒錯的話,就重建區塊資料庫看看。</translation>
</message>
<message>
<source>The transaction amount is too small to send after the fee has been deducted</source>
@@ -3941,19 +4184,27 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Unknown wallet file format "%s" provided. Please provide one of "bdb" or "sqlite".</source>
- <translation type="unfinished">提供了未知的钱包格式 "%s" 。请使用 "bdb" 或 "sqlite" 中的一种。</translation>
+ <translation type="unfinished">提供了未知的錢包格式 "%s" 。請使用 "bdb" 或 "sqlite" 中的一種。</translation>
+ </message>
+ <message>
+ <source>Unsupported category-specific logging level %1$s=%2$s. Expected %1$s=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %3$s. Valid loglevels: %4$s.</source>
+ <translation type="unfinished">不支援的類別限定日誌等級 %1$s=%2$s 。 预期参数 %1$s=&lt;category&gt;:&lt;loglevel&gt;。 有效的類別: %3$s 。有效的日誌等級: %4$s 。</translation>
</message>
<message>
<source>Unsupported chainstate database format found. Please restart with -reindex-chainstate. This will rebuild the chainstate database.</source>
- <translation type="unfinished">找到了不受支持的 chainstate 数据库格式。请使用 -reindex-chainstate 参数重启。这将会重建 chainstate 数据库。</translation>
+ <translation type="unfinished">找到了不受支援的 chainstate 資料庫格式。 請使用 -reindex-chainstate 參數重新啟動。 這將會重建 chainstate 資料庫。</translation>
</message>
<message>
<source>Wallet created successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future.</source>
- <translation type="unfinished">钱包创建成功。旧式钱包已被弃用,未来将不再支持创建或打开旧式钱包。</translation>
+ <translation type="unfinished">錢包創建成功。 舊式錢包已被棄用,未來將不再支援創建或打開舊式錢包。</translation>
+ </message>
+ <message>
+ <source>Wallet loaded successfully. The legacy wallet type is being deprecated and support for creating and opening legacy wallets will be removed in the future. Legacy wallets can be migrated to a descriptor wallet with migratewallet.</source>
+ <translation type="unfinished">錢包加載成功。 舊式錢包已被棄用,未來將不再支援創建或打開舊式錢包。 可以使用 migratewallet 指令將舊式錢包遷移至輸出描述符錢包。</translation>
</message>
<message>
<source>Warning: Dumpfile wallet format "%s" does not match command line specified format "%s".</source>
- <translation type="unfinished">警告: 转储文件的钱包格式 "%s" 与命令行指定的格式 "%s" 不符。</translation>
+ <translation type="unfinished">警告: 轉儲文件的錢包格式 "%s" 與命令列指定的格式 "%s" 不符。</translation>
</message>
<message>
<source>Warning: Private keys detected in wallet {%s} with disabled private keys</source>
@@ -3965,7 +4216,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Witness data for blocks after height %d requires validation. Please restart with -reindex.</source>
- <translation type="unfinished">需要验证高度在%d之后的区块见证数据。请使用 -reindex 重新启动。</translation>
+ <translation type="unfinished">需要驗證高度在%d之後的區塊見證數據。 請使用 -reindex 重新啟動。</translation>
</message>
<message>
<source>You need to rebuild the database using -reindex to go back to unpruned mode. This will redownload the entire blockchain</source>
@@ -3989,7 +4240,7 @@ Go to File &gt; Open Wallet to load a wallet.
</message>
<message>
<source>Cannot set -forcednsseed to true when setting -dnsseed to false.</source>
- <translation type="unfinished">在 -dnsseed 被设为 false 时无法将 -forcednsseed 设为 true 。</translation>
+ <translation type="unfinished">在 -dnsseed 被設為 false 時無法將 -forcednsseed 設為 true 。</translation>
</message>
<message>
<source>Cannot set -peerblockfilters without -blockfilterindex.</source>
@@ -4000,109 +4251,97 @@ Go to File &gt; Open Wallet to load a wallet.
<translation type="unfinished">沒辦法寫入資料目錄 '%s',請檢查是否有權限。</translation>
</message>
<message>
- <source>The -txindex upgrade started by a previous version cannot be completed. Restart with the previous version or run a full -reindex.</source>
- <translation type="unfinished">无法完成由之前版本启动的 -txindex 升级。请用之前的版本重新启动,或者进行一次完整的 -reindex 。</translation>
- </message>
- <message>
- <source>%s failed to validate the -assumeutxo snapshot state. This indicates a hardware problem, or a bug in the software, or a bad software modification that allowed an invalid snapshot to be loaded. As a result of this, the node will shut down and stop using any state that was built on the snapshot, resetting the chain height from %d to %d. On the next restart, the node will resume syncing from %d without using any snapshot data. Please report this incident to %s, including how you obtained the snapshot. The invalid snapshot chainstate has been left on disk in case it is helpful in diagnosing the issue that caused this error.</source>
- <translation type="unfinished">%s 验证 -assumeutxo 快照状态失败。这表明硬件可能有问题,也可能是软件bug,或者还可能是软件被不当修改、从而让非法快照也能够被加载。因此,将关闭节点并停止使用从这个快照构建出的任何状态,并将链高度从 %d 重置到 %d 。下次启动时,节点将会不使用快照数据从 %d 继续同步。请将这个事件报告给 %s 并在报告中包括您是如何获得这份快照的。无效的链状态快照仍被保存至磁盘上以供诊断问题的原因。</translation>
- </message>
- <message>
<source>%s is set very high! Fees this large could be paid on a single transaction.</source>
- <translation type="unfinished">%s被设置得很高! 这可是一次交易就有可能付出的手续费。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -blockfilterindex. Please temporarily disable blockfilterindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -blockfilterindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 blockfilterindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -coinstatsindex. Please temporarily disable coinstatsindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -coinstatsindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 coinstatsindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
- </message>
- <message>
- <source>-reindex-chainstate option is not compatible with -txindex. Please temporarily disable txindex while using -reindex-chainstate, or replace -reindex-chainstate with -reindex to fully rebuild all indexes.</source>
- <translation type="unfinished">-reindex-chainstate 与 -txindex 不兼容。请在进行 -reindex-chainstate 时临时禁用 txindex ,或者改用 -reindex (而不是 -reindex-chainstate )来完整地重建所有索引。</translation>
+ <translation type="unfinished">%s被設定得很高! 這可是一次交易就有可能付出的手續費。</translation>
</message>
<message>
<source>Cannot provide specific connections and have addrman find outgoing connections at the same time.</source>
- <translation type="unfinished">在使用地址管理器(addrman)寻找出站连接时,无法同时提供特定的连接。</translation>
+ <translation type="unfinished">在使用位址管理器(addrman)尋找出站連線時,無法同時提供特定的連線。</translation>
</message>
<message>
<source>Error loading %s: External signer wallet being loaded without external signer support compiled</source>
- <translation type="unfinished">加载%s时出错: 编译时未启用外部签名器支持,却仍然试图加载外部签名器钱包</translation>
+ <translation type="unfinished">載入%s時出錯: 編譯時未啟用外部簽章器支持,卻仍試圖載入外部簽章器錢包</translation>
+ </message>
+ <message>
+ <source>Error reading %s! All keys read correctly, but transaction data or address metadata may be missing or incorrect.</source>
+ <translation type="unfinished">讀取 %s 時出錯! 所有金鑰都被正確讀取,但交易資料或位址元資料可能缺失或有誤。</translation>
</message>
<message>
<source>Error: Address book data in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">错误:钱包中的地址簿数据无法被识别为属于迁移后的钱包</translation>
+ <translation type="unfinished">錯誤:錢包中的通訊錄資料無法被辨識為屬於遷移後的錢包</translation>
</message>
<message>
<source>Error: Duplicate descriptors created during migration. Your wallet may be corrupted.</source>
- <translation type="unfinished">错误:迁移过程中创建了重复的输出描述符。你的钱包可能已损坏。</translation>
+ <translation type="unfinished">錯誤:遷移過程中創建了重複的輸出描述符。 你的錢包可能已損壞。</translation>
</message>
<message>
<source>Error: Transaction %s in wallet cannot be identified to belong to migrated wallets</source>
- <translation type="unfinished">错误:钱包中的交易%s无法被识别为属于迁移后的钱包</translation>
+ <translation type="unfinished">錯誤:錢包中的交易%s無法被辨識為屬於遷移後的錢包</translation>
+ </message>
+ <message>
+ <source>Failed to calculate bump fees, because unconfirmed UTXOs depend on enormous cluster of unconfirmed transactions.</source>
+ <translation type="unfinished">計算追加手續費失敗,因為未確認UTXO依賴了大量未確認交易的簇集。</translation>
</message>
<message>
<source>Failed to rename invalid peers.dat file. Please move or delete it and try again.</source>
- <translation type="unfinished">无法重命名无效的 peers.dat 文件。 请移动或删除它,然后重试。</translation>
+ <translation type="unfinished">無法重新命名無效的 peers.dat 檔案。 請移動或刪除它,然後重試。</translation>
</message>
<message>
<source>Fee estimation failed. Fallbackfee is disabled. Wait a few blocks or enable %s.</source>
- <translation type="unfinished">手续费估计失败。而且备用手续费估计(fallbackfee)已被禁用。请再等一些区块,或者启用%s。</translation>
+ <translation type="unfinished">手續費估計失敗。 而且備用手續費估計(fallbackfee)已停用。 請再等一些區塊,或啟用%s。</translation>
</message>
<message>
<source>Incompatible options: -dnsseed=1 was explicitly specified, but -onlynet forbids connections to IPv4/IPv6</source>
- <translation type="unfinished">互不兼容的选项:-dnsseed=1 已被显式指定,但 -onlynet 禁止了IPv4/IPv6 连接</translation>
+ <translation type="unfinished">互不相容的選項:-dnsseed=1 已被明確指定,但 -onlynet 禁止了IPv4/IPv6 連接</translation>
</message>
<message>
<source>Invalid amount for %s=&lt;amount&gt;: '%s' (must be at least the minrelay fee of %s to prevent stuck transactions)</source>
- <translation type="unfinished">%s=&lt;amount&gt;: '%s' 中指定了非法的金额 (手续费必须至少达到最小转发费率(minrelay fee) %s 以避免交易卡着发不出去)</translation>
+ <translation type="unfinished">%s=&lt;amount&gt;: '%s' 中指定了非法的金額 (手續費必須至少達到最小轉送費率(minrelay fee) %s 以避免交易卡著發不出去)</translation>
</message>
<message>
<source>Outbound connections restricted to CJDNS (-onlynet=cjdns) but -cjdnsreachable is not provided</source>
- <translation type="unfinished">传出连接被限制为仅使用CJDNS (-onlynet=cjdns) ,但却未提供 -cjdnsreachable 参数。</translation>
+ <translation type="unfinished">傳出連線被限制為僅使用CJDNS (-onlynet=cjdns) ,但卻未提供 -cjdnsreachable 參數。</translation>
</message>
<message>
<source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is explicitly forbidden: -onion=0</source>
- <translation type="unfinished">出站连接被限制为仅使用 Tor (-onlynet=onion),但是到达 Tor 网络的代理被显式禁止: -onion=0</translation>
+ <translation type="unfinished">Outbound連線被限制為僅使用 Tor (-onlynet=onion),但到達 Tor 網路的代理被明確禁止: -onion=0</translation>
</message>
<message>
<source>Outbound connections restricted to Tor (-onlynet=onion) but the proxy for reaching the Tor network is not provided: none of -proxy, -onion or -listenonion is given</source>
- <translation type="unfinished">出站连接被限制为仅使用 Tor (-onlynet=onion),但是未提供到达 Tor 网络的代理:没有提供 -proxy=, -onion= 或 -listenonion 参数</translation>
+ <translation type="unfinished">Outbound連線被限制為僅使用 Tor (-onlynet=onion),但未提供到達 Tor 網路的代理:沒有提供 -proxy=, -onion= 或 -listenonion 參數</translation>
</message>
<message>
<source>Outbound connections restricted to i2p (-onlynet=i2p) but -i2psam is not provided</source>
- <translation type="unfinished">传出连接被限制为仅使用I2P (-onlynet=i2p) ,但却未提供 -i2psam 参数。</translation>
+ <translation type="unfinished">Outbound連線被限制為僅使用I2P (-onlynet=i2p) ,但卻未提供 -i2psam 參數。</translation>
</message>
<message>
<source>The inputs size exceeds the maximum weight. Please try sending a smaller amount or manually consolidating your wallet's UTXOs</source>
- <translation type="unfinished">输入大小超出了最大重量。请尝试减少发出的金额,或者手动整合一下钱包UTXO</translation>
+ <translation type="unfinished">輸入大小超出了最大重量。 請嘗試減少發出的金額,或手動整合錢包UTXO</translation>
</message>
<message>
<source>The preselected coins total amount does not cover the transaction target. Please allow other inputs to be automatically selected or include more coins manually</source>
- <translation type="unfinished">预先选择的币总金额不能覆盖交易目标。请允许自动选择其他输入,或者手动加入更多的币</translation>
+ <translation type="unfinished">預先選擇的幣總金額不能覆蓋交易目標。 請允許自動選擇其他輸入,或手動加入更多的幣</translation>
</message>
<message>
<source>Transaction requires one destination of non-0 value, a non-0 feerate, or a pre-selected input</source>
- <translation type="unfinished">交易要求一个非零值目标,或是非零值手续费率,或是预选中的输入。</translation>
+ <translation type="unfinished">交易要求一個非零值目標,或是非零值手續費率,或是預先選取的輸入。</translation>
</message>
<message>
<source>UTXO snapshot failed to validate. Restart to resume normal initial block download, or try loading a different snapshot.</source>
- <translation type="unfinished">验证UTXO快照失败。重启后,可以普通方式继续初始区块下载,或者也可以加载一个不同的快照。</translation>
+ <translation type="unfinished">驗證UTXO快照失敗。 重啟後,可以普通方式繼續初始區塊下載,或者也可以載入一個不同的快照。</translation>
</message>
<message>
<source>Unconfirmed UTXOs are available, but spending them creates a chain of transactions that will be rejected by the mempool</source>
- <translation type="unfinished">未确认UTXO可用,但花掉它们将会创建一条会被内存池拒绝的交易链</translation>
+ <translation type="unfinished">未確認UTXO可用,但花掉它們將會創建一條會被記憶體池拒絕的交易鏈</translation>
</message>
<message>
<source>Unexpected legacy entry in descriptor wallet found. Loading wallet %s
The wallet might have been tampered with or created with malicious intent.
</source>
- <translation type="unfinished">在描述符钱包中意料之外地找到了旧式条目。加载钱包%s
+ <translation type="unfinished">在描述符錢包中意料之外地找到了舊式條目。 加載錢包%s
-钱包可能被篡改过,或者是出于恶意而被构建的。
+錢包可能被竄改過,或是出於惡意而被建構的。
</translation>
</message>
<message>
@@ -4111,35 +4350,31 @@ The wallet might have been tampered with or created with malicious intent.
The wallet might had been created on a newer version.
Please try running the latest software version.
</source>
- <translation type="unfinished">找到无法识别的输出描述符。加载钱包%s
+ <translation type="unfinished">找到無法辨識的輸出描述符。 加載錢包%s
-钱包可能由新版软件创建,
-请尝试运行最新的软件版本。
+錢包可能由新版軟體創建,
+請嘗試執行最新的軟體版本。
</translation>
</message>
<message>
- <source>Unsupported category-specific logging level -loglevel=%s. Expected -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s. Valid loglevels: %s.</source>
- <translation type="unfinished">不支持的类别限定日志等级 -loglevel=%s。预期参数 -loglevel=&lt;category&gt;:&lt;loglevel&gt;. Valid categories: %s。有效的类别: %s。</translation>
- </message>
- <message>
<source>
Unable to cleanup failed migration</source>
<translation type="unfinished">
-无法清理失败的迁移</translation>
+無法清理失敗的遷移</translation>
</message>
<message>
<source>
Unable to restore backup of wallet.</source>
<translation type="unfinished">
-无法还原钱包备份</translation>
+無法還原錢包備份</translation>
</message>
<message>
<source>Block verification was interrupted</source>
- <translation type="unfinished">区块验证已中断</translation>
+ <translation type="unfinished">區塊驗證已中斷</translation>
</message>
<message>
<source>Config setting for %s only applied on %s network when in [%s] section.</source>
- <translation type="unfinished">对 %s 的配置设置只对 %s 网络生效,如果它位于配置的 [%s] 章节的话</translation>
+ <translation type="unfinished">對 %s 的配置設定只對 %s 網路生效,如果它位於配置的 [%s] 章節的話</translation>
</message>
<message>
<source>Copyright (C) %i-%i</source>
@@ -4150,6 +4385,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">發現區塊資料庫壞掉了</translation>
</message>
<message>
+ <source>Could not parse asmap file %s</source>
+ <translation type="unfinished">無法解析asmap文件%s</translation>
+ </message>
+ <message>
<source>Disk space is too low!</source>
<translation type="unfinished">硬碟空間太小!</translation>
</message>
@@ -4163,11 +4402,15 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Dump file %s does not exist.</source>
- <translation type="unfinished">转储文件 %s 不存在</translation>
+ <translation type="unfinished">轉儲文件 %s 不存在</translation>
+ </message>
+ <message>
+ <source>Error committing db txn for wallet transactions removal</source>
+ <translation type="unfinished">在提交删除钱包交易的数据库事务时出错</translation>
</message>
<message>
<source>Error creating %s</source>
- <translation type="unfinished">创建%s时出错</translation>
+ <translation type="unfinished">創建%s時出錯</translation>
</message>
<message>
<source>Error initializing block database</source>
@@ -4203,75 +4446,91 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Error reading configuration file: %s</source>
- <translation type="unfinished">读取配置文件失败: %s</translation>
+ <translation type="unfinished">讀取設定檔失敗: %s</translation>
</message>
<message>
<source>Error reading from database, shutting down.</source>
<translation type="unfinished">讀取資料庫時發生錯誤,要關閉了。</translation>
</message>
<message>
- <source>Error: Cannot extract destination from the generated scriptpubkey</source>
- <translation type="unfinished">错误: 无法从生成的scriptpubkey提取目标</translation>
+ <source>Error reading next record from wallet database</source>
+ <translation type="unfinished">從錢包資料庫讀取下一筆記錄時出錯</translation>
</message>
<message>
- <source>Error: Could not add watchonly tx to watchonly wallet</source>
- <translation type="unfinished">错误:无法添加仅观察交易至仅观察钱包</translation>
+ <source>Error starting db txn for wallet transactions removal</source>
+ <translation type="unfinished">在开始删除钱包交易的数据库事务时出错</translation>
</message>
<message>
- <source>Error: Could not delete watchonly transactions</source>
- <translation type="unfinished">错误:无法删除仅观察交易</translation>
+ <source>Error: Cannot extract destination from the generated scriptpubkey</source>
+ <translation type="unfinished">錯誤: 無法從產生的scriptpubkey提取目標</translation>
</message>
<message>
<source>Error: Couldn't create cursor into database</source>
- <translation type="unfinished">错误: 无法在数据库中创建指针</translation>
+ <translation type="unfinished">錯誤: 無法在資料庫中建立指針</translation>
</message>
<message>
<source>Error: Disk space is low for %s</source>
- <translation type="unfinished">错误: %s 所在的磁盘空间低。</translation>
+ <translation type="unfinished">錯誤: 硬碟空間不足 %s</translation>
</message>
<message>
<source>Error: Failed to create new watchonly wallet</source>
- <translation type="unfinished">错误:创建新仅观察钱包失败</translation>
+ <translation type="unfinished">錯誤:建立新僅觀察錢包失敗</translation>
</message>
<message>
<source>Error: Keypool ran out, please call keypoolrefill first</source>
<translation type="unfinished">錯誤:keypool已用完,請先重新呼叫keypoolrefill</translation>
</message>
<message>
- <source>Error: Not all watchonly txs could be deleted</source>
- <translation type="unfinished">错误:有些仅观察交易无法被删除</translation>
- </message>
- <message>
<source>Error: This wallet already uses SQLite</source>
- <translation type="unfinished">错误:此钱包已经在使用SQLite</translation>
+ <translation type="unfinished">錯誤:此錢包已經在使用SQLite</translation>
</message>
<message>
<source>Error: This wallet is already a descriptor wallet</source>
- <translation type="unfinished">错误:这个钱包已经是输出描述符钱包</translation>
+ <translation type="unfinished">錯誤:這個錢包已經是輸出描述符descriptor錢包</translation>
</message>
<message>
<source>Error: Unable to begin reading all records in the database</source>
- <translation type="unfinished">错误:无法开始读取这个数据库中的所有记录</translation>
+ <translation type="unfinished">錯誤:無法開始讀取這個資料庫中的所有記錄</translation>
</message>
<message>
<source>Error: Unable to make a backup of your wallet</source>
- <translation type="unfinished">错误:无法为你的钱包创建备份</translation>
+ <translation type="unfinished">錯誤:無法為你的錢包建立備份</translation>
</message>
<message>
<source>Error: Unable to parse version %u as a uint32_t</source>
- <translation type="unfinished">错误:无法把版本号%u作为unit32_t解析</translation>
+ <translation type="unfinished">錯誤:無法把版本號%u作為unit32_t解析</translation>
</message>
<message>
<source>Error: Unable to read all records in the database</source>
- <translation type="unfinished">错误:无法读取这个数据库中的所有记录</translation>
+ <translation type="unfinished">錯誤:無法讀取這個資料庫中的所有記錄</translation>
+ </message>
+ <message>
+ <source>Error: Unable to read wallet's best block locator record</source>
+ <translation type="unfinished">错误:无法读取钱包最佳区块定位器记录</translation>
</message>
<message>
<source>Error: Unable to remove watchonly address book data</source>
- <translation type="unfinished">错误:无法移除仅观察地址簿数据</translation>
+ <translation type="unfinished">錯誤:無法移除僅觀察地址簿數據</translation>
</message>
<message>
<source>Error: Unable to write record to new wallet</source>
- <translation type="unfinished">错误: 无法写入记录到新钱包</translation>
+ <translation type="unfinished">錯誤: 無法寫入記錄到新錢包</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write solvable wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入可解决钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: Unable to write watchonly wallet best block locator record</source>
+ <translation type="unfinished">错误:无法写入仅观察钱包最佳区块定位器记录</translation>
+ </message>
+ <message>
+ <source>Error: address book copy failed for wallet %s</source>
+ <translation type="unfinished">错误: 复制钱包%s的地址本时失败</translation>
+ </message>
+ <message>
+ <source>Error: database transaction cannot be executed for wallet %s</source>
+ <translation type="unfinished">错误: 钱包%s的数据库事务无法被执行</translation>
</message>
<message>
<source>Failed to listen on any port. Use -listen=0 if you want this.</source>
@@ -4282,6 +4541,18 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">初始化時重新掃描錢包失敗了</translation>
</message>
<message>
+ <source>Failed to start indexes, shutting down..</source>
+ <translation type="unfinished">無法啟動索引,關閉中...</translation>
+ </message>
+ <message>
+ <source>Failed to verify database</source>
+ <translation type="unfinished">無法驗證資料庫</translation>
+ </message>
+ <message>
+ <source>Failure removing transaction: %s</source>
+ <translation type="unfinished">%s删除交易时失败: </translation>
+ </message>
+ <message>
<source>Fee rate (%s) is lower than the minimum fee rate setting (%s)</source>
<translation type="unfinished">手續費費率(%s) 低於最低費率設置(%s)</translation>
</message>
@@ -4311,7 +4582,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Invalid -i2psam address or hostname: '%s'</source>
- <translation type="unfinished">无效的 -i2psam 地址或主机名: '%s'</translation>
+ <translation type="unfinished">無效的 -i2psam 位址或主機名稱: '%s'</translation>
</message>
<message>
<source>Invalid -onion address or hostname: '%s'</source>
@@ -4343,15 +4614,15 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Invalid port specified in %s: '%s'</source>
- <translation type="unfinished">%s指定了无效的端口号: '%s'</translation>
+ <translation type="unfinished">%s指定了無效的連接埠號: '%s'</translation>
</message>
<message>
<source>Invalid pre-selected input %s</source>
- <translation type="unfinished">无效的预先选择输入%s</translation>
+ <translation type="unfinished">無效的預先選擇輸入%s</translation>
</message>
<message>
<source>Listening for incoming connections failed (listen returned error %s)</source>
- <translation type="unfinished">监听外部连接失败 (listen函数返回了错误 %s)</translation>
+ <translation type="unfinished">監聽外部連線失敗 (listen函數回傳了錯誤 %s)</translation>
</message>
<message>
<source>Loading P2P addresses…</source>
@@ -4391,11 +4662,11 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Not found pre-selected input %s</source>
- <translation type="unfinished">找不到预先选择输入%s</translation>
+ <translation type="unfinished">找不到預先選擇輸入%s</translation>
</message>
<message>
<source>Not solvable pre-selected input %s</source>
- <translation type="unfinished">无法求解的预先选择输入%s</translation>
+ <translation type="unfinished">無法求解的預先選擇輸入%s</translation>
</message>
<message>
<source>Prune cannot be configured with a negative value.</source>
@@ -4423,7 +4694,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Section [%s] is not recognized.</source>
- <translation type="unfinished">无法识别配置章节 [%s]。</translation>
+ <translation type="unfinished">無法辨識配置章節 [%s]。</translation>
</message>
<message>
<source>Signing transaction failed</source>
@@ -4447,7 +4718,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Specified data directory "%s" does not exist.</source>
- <translation type="unfinished">指定的数据目录 "%s" 不存在。</translation>
+ <translation type="unfinished">指定的資料目錄 "%s" 不存在。</translation>
</message>
<message>
<source>Starting network threads…</source>
@@ -4482,6 +4753,10 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">這是你交易付款時所要付的手續費。</translation>
</message>
<message>
+ <source>Transaction %s does not belong to this wallet</source>
+ <translation type="unfinished">交易%s不属于这个钱包</translation>
+ </message>
+ <message>
<source>Transaction amount too small</source>
<translation type="unfinished">交易金額太小</translation>
</message>
@@ -4494,10 +4769,6 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">交易尋找零輸出項超出範圍</translation>
</message>
<message>
- <source>Transaction has too long of a mempool chain</source>
- <translation type="unfinished">交易造成記憶池中的交易鏈太長</translation>
- </message>
- <message>
<source>Transaction must have at least one recipient</source>
<translation type="unfinished">交易必須至少有一個收款人</translation>
</message>
@@ -4511,7 +4782,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Unable to allocate memory for -maxsigcachesize: '%s' MiB</source>
- <translation type="unfinished">无法为 -maxsigcachesize: '%s' MiB 分配内存</translation>
+ <translation type="unfinished">無法為 -maxsigcachesize: '%s' MiB 分配内存</translation>
</message>
<message>
<source>Unable to bind to %s on this computer (bind returned error %s)</source>
@@ -4527,7 +4798,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Unable to find UTXO for external input</source>
- <translation type="unfinished">无法为外部输入找到UTXO</translation>
+ <translation type="unfinished">無法為外部輸入找到UTXO</translation>
</message>
<message>
<source>Unable to generate initial keys</source>
@@ -4551,7 +4822,7 @@ Unable to restore backup of wallet.</source>
</message>
<message>
<source>Unable to unload the wallet before migrating</source>
- <translation type="unfinished">在迁移前无法卸载钱包</translation>
+ <translation type="unfinished">在遷移前無法卸載錢包</translation>
</message>
<message>
<source>Unknown -blockfilterindex value %s.</source>
@@ -4574,14 +4845,30 @@ Unable to restore backup of wallet.</source>
<translation type="unfinished">未知的交易已經有新規則激活 (versionbit %i)</translation>
</message>
<message>
- <source>Unsupported global logging level -loglevel=%s. Valid values: %s.</source>
- <translation type="unfinished">不支持的全局日志等级 -loglevel=%s 。有效的数值:%s 。</translation>
+ <source>Unsupported global logging level %s=%s. Valid values: %s.</source>
+ <translation type="unfinished">不支持的全局日志等级 %s=%s。有效数值: %s.</translation>
+ </message>
+ <message>
+ <source>Wallet file creation failed: %s</source>
+ <translation type="unfinished">钱包文件创建失败:1%s</translation>
+ </message>
+ <message>
+ <source>acceptstalefeeestimates is not supported on %s chain.</source>
+ <translation type="unfinished">%s链上acceptstalefeeestimates 不受支持。</translation>
</message>
<message>
<source>Unsupported logging category %s=%s.</source>
<translation type="unfinished">不支援的紀錄類別 %s=%s。</translation>
</message>
<message>
+ <source>Error: Could not add watchonly tx %s to watchonly wallet</source>
+ <translation type="unfinished">错误:无法添加仅观察交易%s到仅观察钱包</translation>
+ </message>
+ <message>
+ <source>Error: Could not delete watchonly transactions. </source>
+ <translation type="unfinished">错误: 无法删除仅观察交易。</translation>
+ </message>
+ <message>
<source>User Agent comment (%s) contains unsafe characters.</source>
<translation type="unfinished">使用者代理註解(%s)中含有不安全的字元。</translation>
</message>
diff --git a/src/qt/locale/bitcoin_zu.ts b/src/qt/locale/bitcoin_zu.ts
index be77b79c6e..efab844068 100644
--- a/src/qt/locale/bitcoin_zu.ts
+++ b/src/qt/locale/bitcoin_zu.ts
@@ -10,10 +10,6 @@
<translation type="unfinished">&amp;Kopisha</translation>
</message>
<message>
- <source>Receiving addresses</source>
- <translation type="unfinished">Amakheli ukuthola</translation>
- </message>
- <message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">Ifayela elehlukaniswe ngo khefana.</translation>
diff --git a/src/qt/modaloverlay.cpp b/src/qt/modaloverlay.cpp
index b09e230bce..667db06574 100644
--- a/src/qt/modaloverlay.cpp
+++ b/src/qt/modaloverlay.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <qt/modaloverlay.h>
#include <qt/forms/ui_modaloverlay.h>
diff --git a/src/qt/notificator.cpp b/src/qt/notificator.cpp
index 88bc33098a..2021e5f9dc 100644
--- a/src/qt/notificator.cpp
+++ b/src/qt/notificator.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <qt/notificator.h>
#include <QApplication>
diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp
index 6e1d36effb..a87bef796c 100644
--- a/src/qt/optionsdialog.cpp
+++ b/src/qt/optionsdialog.cpp
@@ -23,14 +23,70 @@
#include <chrono>
+#include <QApplication>
#include <QDataWidgetMapper>
#include <QDir>
+#include <QFontDialog>
#include <QIntValidator>
#include <QLocale>
#include <QMessageBox>
#include <QSystemTrayIcon>
#include <QTimer>
+int setFontChoice(QComboBox* cb, const OptionsModel::FontChoice& fc)
+{
+ int i;
+ for (i = cb->count(); --i >= 0; ) {
+ QVariant item_data = cb->itemData(i);
+ if (!item_data.canConvert<OptionsModel::FontChoice>()) continue;
+ if (item_data.value<OptionsModel::FontChoice>() == fc) {
+ break;
+ }
+ }
+ if (i == -1) {
+ // New item needed
+ QFont chosen_font = OptionsModel::getFontForChoice(fc);
+ QSignalBlocker block_currentindexchanged_signal(cb); // avoid triggering QFontDialog
+ cb->insertItem(0, QFontInfo(chosen_font).family(), QVariant::fromValue(fc));
+ i = 0;
+ }
+
+ cb->setCurrentIndex(i);
+ return i;
+}
+
+void setupFontOptions(QComboBox* cb, QLabel* preview)
+{
+ QFont embedded_font{GUIUtil::fixedPitchFont(true)};
+ QFont system_font{GUIUtil::fixedPitchFont(false)};
+ cb->addItem(QObject::tr("Embedded \"%1\"").arg(QFontInfo(embedded_font).family()), QVariant::fromValue(OptionsModel::FontChoice{OptionsModel::FontChoiceAbstract::EmbeddedFont}));
+ cb->addItem(QObject::tr("Default system font \"%1\"").arg(QFontInfo(system_font).family()), QVariant::fromValue(OptionsModel::FontChoice{OptionsModel::FontChoiceAbstract::BestSystemFont}));
+ cb->addItem(QObject::tr("Custom…"));
+
+ const auto& on_font_choice_changed = [cb, preview](int index) {
+ static int previous_index = -1;
+ QVariant item_data = cb->itemData(index);
+ QFont f;
+ if (item_data.canConvert<OptionsModel::FontChoice>()) {
+ f = OptionsModel::getFontForChoice(item_data.value<OptionsModel::FontChoice>());
+ } else {
+ bool ok;
+ f = QFontDialog::getFont(&ok, GUIUtil::fixedPitchFont(false), cb->parentWidget());
+ if (!ok) {
+ cb->setCurrentIndex(previous_index);
+ return;
+ }
+ index = setFontChoice(cb, OptionsModel::FontChoice{f});
+ }
+ if (preview) {
+ preview->setFont(f);
+ }
+ previous_index = index;
+ };
+ QObject::connect(cb, QOverload<int>::of(&QComboBox::currentIndexChanged), on_font_choice_changed);
+ on_font_choice_changed(cb->currentIndex());
+}
+
OptionsDialog::OptionsDialog(QWidget* parent, bool enableWallet)
: QDialog(parent, GUIUtil::dialog_flags),
ui(new Ui::OptionsDialog)
@@ -148,19 +204,7 @@ OptionsDialog::OptionsDialog(QWidget* parent, bool enableWallet)
ui->minimizeToTray->setEnabled(false);
}
- QFont embedded_font{GUIUtil::fixedPitchFont(true)};
- ui->embeddedFont_radioButton->setText(ui->embeddedFont_radioButton->text().arg(QFontInfo(embedded_font).family()));
- embedded_font.setWeight(QFont::Bold);
- ui->embeddedFont_label_1->setFont(embedded_font);
- ui->embeddedFont_label_9->setFont(embedded_font);
-
- QFont system_font{GUIUtil::fixedPitchFont(false)};
- ui->systemFont_radioButton->setText(ui->systemFont_radioButton->text().arg(QFontInfo(system_font).family()));
- system_font.setWeight(QFont::Bold);
- ui->systemFont_label_1->setFont(system_font);
- ui->systemFont_label_9->setFont(system_font);
- // Checking the embeddedFont_radioButton automatically unchecks the systemFont_radioButton.
- ui->systemFont_radioButton->setChecked(true);
+ setupFontOptions(ui->moneyFont, ui->moneyFont_preview);
GUIUtil::handleCloseWindowShortcut(this);
}
@@ -198,6 +242,9 @@ void OptionsDialog::setModel(OptionsModel *_model)
setMapper();
mapper->toFirst();
+ const auto& font_for_money = _model->data(_model->index(OptionsModel::FontForMoney, 0), Qt::EditRole).value<OptionsModel::FontChoice>();
+ setFontChoice(ui->moneyFont, font_for_money);
+
updateDefaultProxyNets();
}
@@ -275,7 +322,6 @@ void OptionsDialog::setMapper()
mapper->addMapping(ui->lang, OptionsModel::Language);
mapper->addMapping(ui->unit, OptionsModel::DisplayUnit);
mapper->addMapping(ui->thirdPartyTxUrls, OptionsModel::ThirdPartyTxUrls);
- mapper->addMapping(ui->embeddedFont_radioButton, OptionsModel::UseEmbeddedMonospacedFont);
}
void OptionsDialog::setOkButtonState(bool fState)
@@ -337,6 +383,8 @@ void OptionsDialog::on_openBitcoinConfButton_clicked()
void OptionsDialog::on_okButton_clicked()
{
+ model->setData(model->index(OptionsModel::FontForMoney, 0), ui->moneyFont->itemData(ui->moneyFont->currentIndex()));
+
mapper->submit();
accept();
updateDefaultProxyNets();
diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp
index 43564dad16..d816a72ca3 100644
--- a/src/qt/optionsmodel.cpp
+++ b/src/qt/optionsmodel.cpp
@@ -119,6 +119,37 @@ struct ProxySetting {
static ProxySetting ParseProxyString(const std::string& proxy);
static std::string ProxyString(bool is_set, QString ip, QString port);
+static const QLatin1String fontchoice_str_embedded{"embedded"};
+static const QLatin1String fontchoice_str_best_system{"best_system"};
+static const QString fontchoice_str_custom_prefix{QStringLiteral("custom, ")};
+
+QString OptionsModel::FontChoiceToString(const OptionsModel::FontChoice& f)
+{
+ if (std::holds_alternative<FontChoiceAbstract>(f)) {
+ if (f == UseBestSystemFont) {
+ return fontchoice_str_best_system;
+ } else {
+ return fontchoice_str_embedded;
+ }
+ }
+ return fontchoice_str_custom_prefix + std::get<QFont>(f).toString();
+}
+
+OptionsModel::FontChoice OptionsModel::FontChoiceFromString(const QString& s)
+{
+ if (s == fontchoice_str_best_system) {
+ return FontChoiceAbstract::BestSystemFont;
+ } else if (s == fontchoice_str_embedded) {
+ return FontChoiceAbstract::EmbeddedFont;
+ } else if (s.startsWith(fontchoice_str_custom_prefix)) {
+ QFont f;
+ f.fromString(s.mid(fontchoice_str_custom_prefix.size()));
+ return f;
+ } else {
+ return FontChoiceAbstract::EmbeddedFont; // default
+ }
+}
+
OptionsModel::OptionsModel(interfaces::Node& node, QObject *parent) :
QAbstractListModel(parent), m_node{node}
{
@@ -216,11 +247,16 @@ bool OptionsModel::Init(bilingual_str& error)
#endif
// Display
- if (!settings.contains("UseEmbeddedMonospacedFont")) {
- settings.setValue("UseEmbeddedMonospacedFont", "true");
+ if (settings.contains("FontForMoney")) {
+ m_font_money = FontChoiceFromString(settings.value("FontForMoney").toString());
+ } else if (settings.contains("UseEmbeddedMonospacedFont")) {
+ if (settings.value("UseEmbeddedMonospacedFont").toBool()) {
+ m_font_money = FontChoiceAbstract::EmbeddedFont;
+ } else {
+ m_font_money = FontChoiceAbstract::BestSystemFont;
+ }
}
- m_use_embedded_monospaced_font = settings.value("UseEmbeddedMonospacedFont").toBool();
- Q_EMIT useEmbeddedMonospacedFontChanged(m_use_embedded_monospaced_font);
+ Q_EMIT fontForMoneyChanged(getFontForMoney());
m_mask_values = settings.value("mask_values", false).toBool();
@@ -428,8 +464,8 @@ QVariant OptionsModel::getOption(OptionID option, const std::string& suffix) con
return strThirdPartyTxUrls;
case Language:
return QString::fromStdString(SettingToString(setting(), ""));
- case UseEmbeddedMonospacedFont:
- return m_use_embedded_monospaced_font;
+ case FontForMoney:
+ return QVariant::fromValue(m_font_money);
case CoinControlFeatures:
return fCoinControlFeatures;
case EnablePSBTControls:
@@ -455,6 +491,23 @@ QVariant OptionsModel::getOption(OptionID option, const std::string& suffix) con
}
}
+QFont OptionsModel::getFontForChoice(const FontChoice& fc)
+{
+ QFont f;
+ if (std::holds_alternative<FontChoiceAbstract>(fc)) {
+ f = GUIUtil::fixedPitchFont(fc != UseBestSystemFont);
+ f.setWeight(QFont::Bold);
+ } else {
+ f = std::get<QFont>(fc);
+ }
+ return f;
+}
+
+QFont OptionsModel::getFontForMoney() const
+{
+ return getFontForChoice(m_font_money);
+}
+
bool OptionsModel::setOption(OptionID option, const QVariant& value, const std::string& suffix)
{
auto changed = [&] { return value.isValid() && value != getOption(option, suffix); };
@@ -587,11 +640,15 @@ bool OptionsModel::setOption(OptionID option, const QVariant& value, const std::
setRestartRequired(true);
}
break;
- case UseEmbeddedMonospacedFont:
- m_use_embedded_monospaced_font = value.toBool();
- settings.setValue("UseEmbeddedMonospacedFont", m_use_embedded_monospaced_font);
- Q_EMIT useEmbeddedMonospacedFontChanged(m_use_embedded_monospaced_font);
+ case FontForMoney:
+ {
+ const auto& new_font = value.value<FontChoice>();
+ if (m_font_money == new_font) break;
+ settings.setValue("FontForMoney", FontChoiceToString(new_font));
+ m_font_money = new_font;
+ Q_EMIT fontForMoneyChanged(getFontForMoney());
break;
+ }
case CoinControlFeatures:
fCoinControlFeatures = value.toBool();
settings.setValue("fCoinControlFeatures", fCoinControlFeatures);
diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h
index f28a1087ba..b5ea6c783e 100644
--- a/src/qt/optionsmodel.h
+++ b/src/qt/optionsmodel.h
@@ -10,8 +10,10 @@
#include <qt/guiconstants.h>
#include <QAbstractListModel>
+#include <QFont>
#include <assert.h>
+#include <variant>
struct bilingual_str;
namespace interfaces {
@@ -60,7 +62,7 @@ public:
DisplayUnit, // BitcoinUnit
ThirdPartyTxUrls, // QString
Language, // QString
- UseEmbeddedMonospacedFont, // bool
+ FontForMoney, // FontChoice
CoinControlFeatures, // bool
SubFeeFromAmount, // bool
ThreadsScriptVerif, // int
@@ -76,6 +78,14 @@ public:
OptionIDRowCount,
};
+ enum class FontChoiceAbstract {
+ EmbeddedFont,
+ BestSystemFont,
+ };
+ typedef std::variant<FontChoiceAbstract, QFont> FontChoice;
+ static inline const FontChoice UseBestSystemFont{FontChoiceAbstract::BestSystemFont};
+ static QFont getFontForChoice(const FontChoice& fc);
+
bool Init(bilingual_str& error);
void Reset();
@@ -93,7 +103,7 @@ public:
bool getMinimizeOnClose() const { return fMinimizeOnClose; }
BitcoinUnit getDisplayUnit() const { return m_display_bitcoin_unit; }
QString getThirdPartyTxUrls() const { return strThirdPartyTxUrls; }
- bool getUseEmbeddedMonospacedFont() const { return m_use_embedded_monospaced_font; }
+ QFont getFontForMoney() const;
bool getCoinControlFeatures() const { return fCoinControlFeatures; }
bool getSubFeeFromAmount() const { return m_sub_fee_from_amount; }
bool getEnablePSBTControls() const { return m_enable_psbt_controls; }
@@ -120,7 +130,7 @@ private:
QString language;
BitcoinUnit m_display_bitcoin_unit;
QString strThirdPartyTxUrls;
- bool m_use_embedded_monospaced_font;
+ FontChoice m_font_money{FontChoiceAbstract::EmbeddedFont};
bool fCoinControlFeatures;
bool m_sub_fee_from_amount;
bool m_enable_psbt_controls;
@@ -129,6 +139,9 @@ private:
/* settings that were overridden by command-line */
QString strOverriddenByCommandLine;
+ static QString FontChoiceToString(const OptionsModel::FontChoice&);
+ static FontChoice FontChoiceFromString(const QString&);
+
// Add option to list of GUI options overridden through command line/config file
void addOverriddenOption(const std::string &option);
@@ -139,7 +152,9 @@ Q_SIGNALS:
void displayUnitChanged(BitcoinUnit unit);
void coinControlFeaturesChanged(bool);
void showTrayIconChanged(bool);
- void useEmbeddedMonospacedFontChanged(bool);
+ void fontForMoneyChanged(const QFont&);
};
+Q_DECLARE_METATYPE(OptionsModel::FontChoice)
+
#endif // BITCOIN_QT_OPTIONSMODEL_H
diff --git a/src/qt/overviewpage.cpp b/src/qt/overviewpage.cpp
index 0f00d167f7..7d58492082 100644
--- a/src/qt/overviewpage.cpp
+++ b/src/qt/overviewpage.cpp
@@ -250,8 +250,8 @@ void OverviewPage::setClientModel(ClientModel *model)
connect(model, &ClientModel::alertsChanged, this, &OverviewPage::updateAlerts);
updateAlerts(model->getStatusBarWarnings());
- connect(model->getOptionsModel(), &OptionsModel::useEmbeddedMonospacedFontChanged, this, &OverviewPage::setMonospacedFont);
- setMonospacedFont(model->getOptionsModel()->getUseEmbeddedMonospacedFont());
+ connect(model->getOptionsModel(), &OptionsModel::fontForMoneyChanged, this, &OverviewPage::setMonospacedFont);
+ setMonospacedFont(clientModel->getOptionsModel()->getFontForMoney());
}
}
@@ -340,10 +340,8 @@ void OverviewPage::showOutOfSyncWarning(bool fShow)
ui->labelTransactionsStatus->setVisible(fShow);
}
-void OverviewPage::setMonospacedFont(bool use_embedded_font)
+void OverviewPage::setMonospacedFont(const QFont& f)
{
- QFont f = GUIUtil::fixedPitchFont(use_embedded_font);
- f.setWeight(QFont::Bold);
ui->labelBalance->setFont(f);
ui->labelUnconfirmed->setFont(f);
ui->labelImmature->setFont(f);
diff --git a/src/qt/overviewpage.h b/src/qt/overviewpage.h
index 5c487ee116..fc7a99f319 100644
--- a/src/qt/overviewpage.h
+++ b/src/qt/overviewpage.h
@@ -65,7 +65,7 @@ private Q_SLOTS:
void handleTransactionClicked(const QModelIndex &index);
void updateAlerts(const QString &warnings);
void updateWatchOnlyLabels(bool showWatchOnly);
- void setMonospacedFont(bool use_embedded_font);
+ void setMonospacedFont(const QFont&);
};
#endif // BITCOIN_QT_OVERVIEWPAGE_H
diff --git a/src/qt/paymentserver.cpp b/src/qt/paymentserver.cpp
index 592e591edb..d4c325b7b1 100644
--- a/src/qt/paymentserver.cpp
+++ b/src/qt/paymentserver.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/paymentserver.h>
#include <qt/bitcoinunits.h>
diff --git a/src/qt/paymentserver.h b/src/qt/paymentserver.h
index f73aa1e61e..b9ea97d5ec 100644
--- a/src/qt/paymentserver.h
+++ b/src/qt/paymentserver.h
@@ -32,10 +32,6 @@
// sends them to the server.
//
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/sendcoinsrecipient.h>
#include <QObject>
diff --git a/src/qt/rpcconsole.cpp b/src/qt/rpcconsole.cpp
index ceaa3ac46b..d2b184ebdf 100644
--- a/src/qt/rpcconsole.cpp
+++ b/src/qt/rpcconsole.cpp
@@ -581,6 +581,8 @@ RPCConsole::RPCConsole(interfaces::Node& node, const PlatformStyle *_platformSty
clear();
GUIUtil::handleCloseWindowShortcut(this);
+
+ updateWindowTitle();
}
RPCConsole::~RPCConsole()
@@ -964,6 +966,7 @@ void RPCConsole::message(int category, const QString &message, bool html)
void RPCConsole::updateNetworkState()
{
+ if (!clientModel) return;
QString connections = QString::number(clientModel->getNumConnections()) + " (";
connections += tr("In:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_IN)) + " / ";
connections += tr("Out:") + " " + QString::number(clientModel->getNumConnections(CONNECTIONS_OUT)) + ")";
@@ -1387,3 +1390,13 @@ void RPCConsole::updateAlerts(const QString& warnings)
this->ui->label_alerts->setVisible(!warnings.isEmpty());
this->ui->label_alerts->setText(warnings);
}
+
+void RPCConsole::updateWindowTitle()
+{
+ const ChainType chain = Params().GetChainType();
+ if (chain == ChainType::MAIN) return;
+
+ const QString chainType = QString::fromStdString(Params().GetChainTypeString());
+ const QString title = tr("Node window - [%1]").arg(chainType);
+ this->setWindowTitle(title);
+} \ No newline at end of file
diff --git a/src/qt/rpcconsole.h b/src/qt/rpcconsole.h
index 65eef7fbba..358f68c3c8 100644
--- a/src/qt/rpcconsole.h
+++ b/src/qt/rpcconsole.h
@@ -189,6 +189,8 @@ private:
return time_at_event.count() ? GUIUtil::formatDurationStr(time_now - time_at_event) : tr("Never");
}
+ void updateWindowTitle();
+
private Q_SLOTS:
void updateAlerts(const QString& warnings);
};
diff --git a/src/qt/sendcoinsdialog.cpp b/src/qt/sendcoinsdialog.cpp
index 3c331c70ef..89bd35eb1b 100644
--- a/src/qt/sendcoinsdialog.cpp
+++ b/src/qt/sendcoinsdialog.cpp
@@ -406,6 +406,7 @@ void SendCoinsDialog::presentPSBT(PartiallySignedTransaction& psbtx)
msgBox.setInformativeText(tr("The PSBT has been copied to the clipboard. You can also save it."));
msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard);
msgBox.setDefaultButton(QMessageBox::Discard);
+ msgBox.setObjectName("psbt_copied_message");
switch (msgBox.exec()) {
case QMessageBox::Save: {
QString selectedFilter;
diff --git a/src/qt/sendcoinsentry.cpp b/src/qt/sendcoinsentry.cpp
index 0536635c84..d8102c1dca 100644
--- a/src/qt/sendcoinsentry.cpp
+++ b/src/qt/sendcoinsentry.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/sendcoinsentry.h>
#include <qt/forms/ui_sendcoinsentry.h>
diff --git a/src/qt/sendcoinsrecipient.h b/src/qt/sendcoinsrecipient.h
index 787a52b8b3..aa2ea0498e 100644
--- a/src/qt/sendcoinsrecipient.h
+++ b/src/qt/sendcoinsrecipient.h
@@ -5,10 +5,6 @@
#ifndef BITCOIN_QT_SENDCOINSRECIPIENT_H
#define BITCOIN_QT_SENDCOINSRECIPIENT_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <consensus/amount.h>
#include <serialize.h>
diff --git a/src/qt/test/addressbooktests.cpp b/src/qt/test/addressbooktests.cpp
index f17a6b7f74..f7d66f316e 100644
--- a/src/qt/test/addressbooktests.cpp
+++ b/src/qt/test/addressbooktests.cpp
@@ -85,8 +85,7 @@ void TestAddAddressesToSendBook(interfaces::Node& node)
}
auto build_address = [&wallet]() {
- CKey key;
- key.MakeNewKey(true);
+ CKey key = GenerateRandomKey();
CTxDestination dest(GetDestinationForKey(
key.GetPubKey(), wallet->m_default_address_type));
diff --git a/src/qt/test/apptests.cpp b/src/qt/test/apptests.cpp
index 9007b183aa..10abcb00eb 100644
--- a/src/qt/test/apptests.cpp
+++ b/src/qt/test/apptests.cpp
@@ -14,10 +14,6 @@
#include <test/util/setup_common.h>
#include <validation.h>
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <QAction>
#include <QLineEdit>
#include <QRegularExpression>
diff --git a/src/qt/test/optiontests.cpp b/src/qt/test/optiontests.cpp
index e5a5179d87..5f9f2cb449 100644
--- a/src/qt/test/optiontests.cpp
+++ b/src/qt/test/optiontests.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <common/args.h>
#include <init.h>
#include <qt/bitcoin.h>
@@ -46,6 +50,17 @@ void OptionTests::migrateSettings()
settings.sync();
+ QVERIFY(settings.contains("nDatabaseCache"));
+ QVERIFY(settings.contains("nThreadsScriptVerif"));
+ QVERIFY(settings.contains("fUseUPnP"));
+ QVERIFY(settings.contains("fListen"));
+ QVERIFY(settings.contains("bPrune"));
+ QVERIFY(settings.contains("nPruneSize"));
+ QVERIFY(settings.contains("fUseProxy"));
+ QVERIFY(settings.contains("addrProxy"));
+ QVERIFY(settings.contains("fUseSeparateProxyTor"));
+ QVERIFY(settings.contains("addrSeparateProxyTor"));
+
OptionsModel options{m_node};
bilingual_str error;
QVERIFY(options.Init(error));
@@ -61,7 +76,11 @@ void OptionTests::migrateSettings()
QVERIFY(!settings.contains("addrSeparateProxyTor"));
std::ifstream file(gArgs.GetDataDirNet() / "settings.json");
+ std::string default_warning = strprintf("This file is automatically generated and updated by %s. Please do not edit this file while the node "
+ "is running, as any changes might be ignored or overwritten.",
+ PACKAGE_NAME);
QCOMPARE(std::string(std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>()).c_str(), "{\n"
+ " \"_warning_\": \""+ default_warning+"\",\n"
" \"dbcache\": \"600\",\n"
" \"listen\": false,\n"
" \"onion\": \"onion:234\",\n"
diff --git a/src/qt/test/test_main.cpp b/src/qt/test/test_main.cpp
index 8c09e9f540..c5405cca98 100644
--- a/src/qt/test/test_main.cpp
+++ b/src/qt/test/test_main.cpp
@@ -9,6 +9,7 @@
#include <interfaces/init.h>
#include <interfaces/node.h>
#include <qt/bitcoin.h>
+#include <qt/guiconstants.h>
#include <qt/test/apptests.h>
#include <qt/test/optiontests.h>
#include <qt/test/rpcnestedtests.h>
@@ -24,6 +25,7 @@
#include <QApplication>
#include <QDebug>
#include <QObject>
+#include <QSettings>
#include <QTest>
#include <functional>
@@ -85,36 +87,45 @@ int main(int argc, char* argv[])
setenv("QT_QPA_PLATFORM", "minimal", 0 /* overwrite */);
#endif
- BitcoinApplication app;
- app.setApplicationName("Bitcoin-Qt-test");
- app.createNode(*init);
+
+ QCoreApplication::setOrganizationName(QAPP_ORG_NAME);
+ QCoreApplication::setApplicationName(QAPP_APP_NAME_DEFAULT "-test");
int num_test_failures{0};
- AppTests app_tests(app);
- num_test_failures += QTest::qExec(&app_tests);
+ {
+ BitcoinApplication app;
+ app.createNode(*init);
+
+ AppTests app_tests(app);
+ num_test_failures += QTest::qExec(&app_tests);
- OptionTests options_tests(app.node());
- num_test_failures += QTest::qExec(&options_tests);
+ OptionTests options_tests(app.node());
+ num_test_failures += QTest::qExec(&options_tests);
- URITests test1;
- num_test_failures += QTest::qExec(&test1);
+ URITests test1;
+ num_test_failures += QTest::qExec(&test1);
- RPCNestedTests test3(app.node());
- num_test_failures += QTest::qExec(&test3);
+ RPCNestedTests test3(app.node());
+ num_test_failures += QTest::qExec(&test3);
#ifdef ENABLE_WALLET
- WalletTests test5(app.node());
- num_test_failures += QTest::qExec(&test5);
+ WalletTests test5(app.node());
+ num_test_failures += QTest::qExec(&test5);
- AddressBookTests test6(app.node());
- num_test_failures += QTest::qExec(&test6);
+ AddressBookTests test6(app.node());
+ num_test_failures += QTest::qExec(&test6);
#endif
- if (num_test_failures) {
- qWarning("\nFailed tests: %d\n", num_test_failures);
- } else {
- qDebug("\nAll tests passed.\n");
+ if (num_test_failures) {
+ qWarning("\nFailed tests: %d\n", num_test_failures);
+ } else {
+ qDebug("\nAll tests passed.\n");
+ }
}
+
+ QSettings settings;
+ settings.clear();
+
return num_test_failures;
}
diff --git a/src/qt/test/wallettests.cpp b/src/qt/test/wallettests.cpp
index f5b86f44a6..603df0b15f 100644
--- a/src/qt/test/wallettests.cpp
+++ b/src/qt/test/wallettests.cpp
@@ -418,7 +418,7 @@ void TestGUIWatchOnly(interfaces::Node& node, TestChain100Setup& test)
timer.setInterval(500);
QObject::connect(&timer, &QTimer::timeout, [&](){
for (QWidget* widget : QApplication::topLevelWidgets()) {
- if (widget->inherits("QMessageBox")) {
+ if (widget->inherits("QMessageBox") && widget->objectName().compare("psbt_copied_message") == 0) {
QMessageBox* dialog = qobject_cast<QMessageBox*>(widget);
QAbstractButton* button = dialog->button(QMessageBox::Discard);
button->setEnabled(true);
diff --git a/src/qt/transactiondesc.cpp b/src/qt/transactiondesc.cpp
index a916e4ead6..b848b8fe94 100644
--- a/src/qt/transactiondesc.cpp
+++ b/src/qt/transactiondesc.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifdef HAVE_CONFIG_H
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/transactiondesc.h>
#include <qt/bitcoinunits.h>
diff --git a/src/qt/utilitydialog.cpp b/src/qt/utilitydialog.cpp
index f43b993628..22fe219def 100644
--- a/src/qt/utilitydialog.cpp
+++ b/src/qt/utilitydialog.cpp
@@ -58,7 +58,8 @@ HelpMessageDialog::HelpMessageDialog(QWidget *parent, bool about) :
ui->helpMessage->setVisible(false);
} else {
setWindowTitle(tr("Command-line options"));
- QString header = "Usage: bitcoin-qt [command-line options] \n";
+ QString header = "Usage: bitcoin-qt [command-line options] [URI]\n\n"
+ "Optional URI is a Bitcoin address in BIP21 URI format.\n";
QTextCursor cursor(ui->helpMessage->document());
cursor.insertText(version);
cursor.insertBlock();
diff --git a/src/qt/walletmodel.cpp b/src/qt/walletmodel.cpp
index 9821f8504a..1bdf94d3b5 100644
--- a/src/qt/walletmodel.cpp
+++ b/src/qt/walletmodel.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/walletmodel.h>
#include <qt/addresstablemodel.h>
@@ -448,6 +444,13 @@ void WalletModel::unsubscribeFromCoreSignals()
// WalletModel::UnlockContext implementation
WalletModel::UnlockContext WalletModel::requestUnlock()
{
+ // Bugs in earlier versions may have resulted in wallets with private keys disabled to become "encrypted"
+ // (encryption keys are present, but not actually doing anything).
+ // To avoid issues with such wallets, check if the wallet has private keys disabled, and if so, return a context
+ // that indicates the wallet is not encrypted.
+ if (m_wallet->privateKeysDisabled()) {
+ return UnlockContext(this, /*valid=*/true, /*relock=*/false);
+ }
bool was_locked = getEncryptionStatus() == Locked;
if(was_locked)
{
diff --git a/src/qt/walletmodel.h b/src/qt/walletmodel.h
index 68218b0c1b..503ee16823 100644
--- a/src/qt/walletmodel.h
+++ b/src/qt/walletmodel.h
@@ -5,10 +5,6 @@
#ifndef BITCOIN_QT_WALLETMODEL_H
#define BITCOIN_QT_WALLETMODEL_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <key.h>
#include <qt/walletmodeltransaction.h>
diff --git a/src/qt/walletmodeltransaction.cpp b/src/qt/walletmodeltransaction.cpp
index 61ccd9dd82..8222672bf3 100644
--- a/src/qt/walletmodeltransaction.cpp
+++ b/src/qt/walletmodeltransaction.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#ifdef HAVE_CONFIG_H
-#include <config/bitcoin-config.h>
-#endif
-
#include <qt/walletmodeltransaction.h>
#include <policy/policy.h>
diff --git a/src/qt/winshutdownmonitor.h b/src/qt/winshutdownmonitor.h
index 78f287637f..060d8546e3 100644
--- a/src/qt/winshutdownmonitor.h
+++ b/src/qt/winshutdownmonitor.h
@@ -10,7 +10,7 @@
#include <QString>
#include <functional>
-#include <windef.h> // for HWND
+#include <windows.h>
#include <QAbstractNativeEventFilter>
diff --git a/src/random.cpp b/src/random.cpp
index ce4266a567..4fc9099704 100644
--- a/src/random.cpp
+++ b/src/random.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <random.h>
#include <compat/compat.h>
diff --git a/src/random.h b/src/random.h
index 76bae5838d..f7c20ee4b0 100644
--- a/src/random.h
+++ b/src/random.h
@@ -11,6 +11,7 @@
#include <span.h>
#include <uint256.h>
+#include <bit>
#include <cassert>
#include <chrono>
#include <cstdint>
@@ -203,7 +204,7 @@ public:
{
assert(range);
--range;
- int bits = CountBits(range);
+ int bits = std::bit_width(range);
while (true) {
uint64_t ret = randbits(bits);
if (ret <= range) return ret;
diff --git a/src/rest.cpp b/src/rest.cpp
index e47b52fb53..91184745c8 100644
--- a/src/rest.cpp
+++ b/src/rest.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <rest.h>
#include <blockfilter.h>
@@ -316,7 +320,7 @@ static bool rest_block(const std::any& context,
switch (rf) {
case RESTResponseFormat::BINARY: {
DataStream ssBlock;
- ssBlock << RPCTxSerParams(block);
+ ssBlock << TX_WITH_WITNESS(block);
std::string binaryBlock = ssBlock.str();
req->WriteHeader("Content-Type", "application/octet-stream");
req->WriteReply(HTTP_OK, binaryBlock);
@@ -325,7 +329,7 @@ static bool rest_block(const std::any& context,
case RESTResponseFormat::HEX: {
DataStream ssBlock;
- ssBlock << RPCTxSerParams(block);
+ ssBlock << TX_WITH_WITNESS(block);
std::string strHex = HexStr(ssBlock) + "\n";
req->WriteHeader("Content-Type", "text/plain");
req->WriteReply(HTTP_OK, strHex);
@@ -722,7 +726,7 @@ static bool rest_tx(const std::any& context, HTTPRequest* req, const std::string
switch (rf) {
case RESTResponseFormat::BINARY: {
DataStream ssTx;
- ssTx << RPCTxSerParams(tx);
+ ssTx << TX_WITH_WITNESS(tx);
std::string binaryTx = ssTx.str();
req->WriteHeader("Content-Type", "application/octet-stream");
@@ -732,7 +736,7 @@ static bool rest_tx(const std::any& context, HTTPRequest* req, const std::string
case RESTResponseFormat::HEX: {
DataStream ssTx;
- ssTx << RPCTxSerParams(tx);
+ ssTx << TX_WITH_WITNESS(tx);
std::string strHex = HexStr(ssTx) + "\n";
req->WriteHeader("Content-Type", "text/plain");
diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp
index afd80d8788..dfdddeacea 100644
--- a/src/rpc/blockchain.cpp
+++ b/src/rpc/blockchain.cpp
@@ -187,7 +187,7 @@ UniValue blockToJSON(BlockManager& blockman, const CBlock& block, const CBlockIn
// coinbase transaction (i.e. i == 0) doesn't have undo data
const CTxUndo* txundo = (have_undo && i > 0) ? &blockUndo.vtxundo.at(i - 1) : nullptr;
UniValue objTx(UniValue::VOBJ);
- TxToUniv(*tx, /*block_hash=*/uint256(), /*entry=*/objTx, /*include_hex=*/true, /*without_witness=*/RPCSerializationWithoutWitness(), txundo, verbosity);
+ TxToUniv(*tx, /*block_hash=*/uint256(), /*entry=*/objTx, /*include_hex=*/true, txundo, verbosity);
txs.push_back(objTx);
}
break;
@@ -395,7 +395,8 @@ static RPCHelpMan syncwithvalidationinterfacequeue()
},
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
- SyncWithValidationInterfaceQueue();
+ NodeContext& node = EnsureAnyNodeContext(request.context);
+ CHECK_NONFATAL(node.validation_signals)->SyncWithValidationInterfaceQueue();
return UniValue::VNULL;
},
};
@@ -736,10 +737,9 @@ static RPCHelpMan getblock()
const CBlock block{GetBlockChecked(chainman.m_blockman, *pblockindex)};
- if (verbosity <= 0)
- {
+ if (verbosity <= 0) {
DataStream ssBlock;
- ssBlock << RPCTxSerParams(block);
+ ssBlock << TX_WITH_WITNESS(block);
std::string strHex = HexStr(ssBlock);
return strHex;
}
@@ -2307,7 +2307,7 @@ static RPCHelpMan scanblocks()
RPCArg{"start_height", RPCArg::Type::NUM, RPCArg::Default{0}, "Height to start to scan from"},
RPCArg{"stop_height", RPCArg::Type::NUM, RPCArg::DefaultHint{"chain tip"}, "Height to stop to scan"},
RPCArg{"filtertype", RPCArg::Type::STR, RPCArg::Default{BlockFilterTypeName(BlockFilterType::BASIC)}, "The type name of the filter"},
- RPCArg{"options", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "",
+ RPCArg{"options", RPCArg::Type::OBJ_NAMED_PARAMS, RPCArg::Optional::OMITTED, "",
{
{"filter_false_positives", RPCArg::Type::BOOL, RPCArg::Default{false}, "Filter false positives (slower and may fail on pruned nodes). Otherwise they may occur at a rate of 1/M"},
},
@@ -2572,7 +2572,7 @@ static RPCHelpMan dumptxoutset()
{
return RPCHelpMan{
"dumptxoutset",
- "Write the serialized UTXO set to disk.",
+ "Write the serialized UTXO set to a file.",
{
{"path", RPCArg::Type::STR, RPCArg::Optional::NO, "Path to the output file. If relative, will be prefixed by datadir."},
},
@@ -2700,7 +2700,7 @@ static RPCHelpMan loadtxoutset()
{
return RPCHelpMan{
"loadtxoutset",
- "Load the serialized UTXO set from disk.\n"
+ "Load the serialized UTXO set from a file.\n"
"Once this snapshot is loaded, its contents will be "
"deserialized into a second chainstate data structure, which is then used to sync to "
"the network's tip. "
@@ -2754,44 +2754,23 @@ static RPCHelpMan loadtxoutset()
throw JSONRPCError(RPC_INTERNAL_ERROR, strprintf("Unable to load UTXO snapshot, "
"assumeutxo block hash in snapshot metadata not recognized (%s)", base_blockhash.ToString()));
}
- int max_secs_to_wait_for_headers = 60 * 10;
- CBlockIndex* snapshot_start_block = nullptr;
-
- LogPrintf("[snapshot] waiting to see blockheader %s in headers chain before snapshot activation\n",
- base_blockhash.ToString());
-
- while (max_secs_to_wait_for_headers > 0) {
- snapshot_start_block = WITH_LOCK(::cs_main,
+ CBlockIndex* snapshot_start_block = WITH_LOCK(::cs_main,
return chainman.m_blockman.LookupBlockIndex(base_blockhash));
- max_secs_to_wait_for_headers -= 1;
-
- if (!IsRPCRunning()) {
- throw JSONRPCError(RPC_CLIENT_NOT_CONNECTED, "Shutting down");
- }
-
- if (!snapshot_start_block) {
- std::this_thread::sleep_for(std::chrono::seconds(1));
- } else {
- break;
- }
- }
if (!snapshot_start_block) {
- LogPrintf("[snapshot] timed out waiting for snapshot start blockheader %s\n",
- base_blockhash.ToString());
throw JSONRPCError(
RPC_INTERNAL_ERROR,
- "Timed out waiting for base block header to appear in headers chain");
+ strprintf("The base block header (%s) must appear in the headers chain. Make sure all headers are syncing, and call this RPC again.",
+ base_blockhash.ToString()));
}
if (!chainman.ActivateSnapshot(afile, metadata, false)) {
throw JSONRPCError(RPC_INTERNAL_ERROR, "Unable to load UTXO snapshot " + fs::PathToString(path));
}
- CBlockIndex* new_tip{WITH_LOCK(::cs_main, return chainman.ActiveTip())};
UniValue result(UniValue::VOBJ);
result.pushKV("coins_loaded", metadata.m_coins_count);
- result.pushKV("tip_hash", new_tip->GetBlockHash().ToString());
- result.pushKV("base_height", new_tip->nHeight);
+ result.pushKV("tip_hash", snapshot_start_block->GetBlockHash().ToString());
+ result.pushKV("base_height", snapshot_start_block->nHeight);
result.pushKV("path", fs::PathToString(path));
return result;
},
diff --git a/src/rpc/client.cpp b/src/rpc/client.cpp
index 49820f25a3..5825efdf82 100644
--- a/src/rpc/client.cpp
+++ b/src/rpc/client.cpp
@@ -91,6 +91,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "scanblocks", 2, "start_height" },
{ "scanblocks", 3, "stop_height" },
{ "scanblocks", 5, "options" },
+ { "scanblocks", 5, "filter_false_positives" },
{ "scantxoutset", 1, "scanobjects" },
{ "addmultisigaddress", 0, "nrequired" },
{ "addmultisigaddress", 1, "keys" },
@@ -302,6 +303,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
{ "sendmsgtopeer", 0, "peer_id" },
{ "stop", 0, "wait" },
{ "addnode", 2, "v2transport" },
+ { "addconnection", 2, "v2transport" },
};
// clang-format on
diff --git a/src/rpc/external_signer.cpp b/src/rpc/external_signer.cpp
index 310eec5f15..8d06ae4258 100644
--- a/src/rpc/external_signer.cpp
+++ b/src/rpc/external_signer.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <common/args.h>
#include <common/system.h>
#include <external_signer.h>
diff --git a/src/rpc/fees.cpp b/src/rpc/fees.cpp
index 57ba486ed9..f3345b4f1c 100644
--- a/src/rpc/fees.cpp
+++ b/src/rpc/fees.cpp
@@ -4,6 +4,7 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <core_io.h>
+#include <node/context.h>
#include <policy/feerate.h>
#include <policy/fees.h>
#include <rpc/protocol.h>
@@ -21,10 +22,6 @@
#include <cmath>
#include <string>
-namespace node {
-struct NodeContext;
-}
-
using node::NodeContext;
static RPCHelpMan estimatesmartfee()
@@ -68,7 +65,7 @@ static RPCHelpMan estimatesmartfee()
const NodeContext& node = EnsureAnyNodeContext(request.context);
const CTxMemPool& mempool = EnsureMemPool(node);
- SyncWithValidationInterfaceQueue();
+ CHECK_NONFATAL(mempool.m_signals)->SyncWithValidationInterfaceQueue();
unsigned int max_target = fee_estimator.HighestTargetTracked(FeeEstimateHorizon::LONG_HALFLIFE);
unsigned int conf_target = ParseConfirmTarget(request.params[0], max_target);
bool conservative = true;
@@ -156,8 +153,9 @@ static RPCHelpMan estimaterawfee()
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
CBlockPolicyEstimator& fee_estimator = EnsureAnyFeeEstimator(request.context);
+ const NodeContext& node = EnsureAnyNodeContext(request.context);
- SyncWithValidationInterfaceQueue();
+ CHECK_NONFATAL(node.validation_signals)->SyncWithValidationInterfaceQueue();
unsigned int max_target = fee_estimator.HighestTargetTracked(FeeEstimateHorizon::LONG_HALFLIFE);
unsigned int conf_target = ParseConfirmTarget(request.params[0], max_target);
double threshold = 0.95;
diff --git a/src/rpc/mempool.cpp b/src/rpc/mempool.cpp
index f6d9d42f0f..25bfec2d45 100644
--- a/src/rpc/mempool.cpp
+++ b/src/rpc/mempool.cpp
@@ -45,7 +45,7 @@ static RPCHelpMan sendrawtransaction()
{"hexstring", RPCArg::Type::STR_HEX, RPCArg::Optional::NO, "The hex string of the raw transaction"},
{"maxfeerate", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(DEFAULT_MAX_RAW_TX_FEE_RATE.GetFeePerK())},
"Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT +
- "/kvB.\nSet to 0 to accept any fee rate."},
+ "/kvB.\nFee rates larger than 1BTC/kvB are rejected.\nSet to 0 to accept any fee rate."},
{"maxburnamount", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(0)},
"Reject transactions with provably unspendable outputs (e.g. 'datacarrier' outputs that use the OP_RETURN opcode) greater than the specified value, expressed in " + CURRENCY_UNIT + ".\n"
"If burning funds through unspendable outputs is desired, increase this value.\n"
@@ -81,9 +81,7 @@ static RPCHelpMan sendrawtransaction()
CTransactionRef tx(MakeTransactionRef(std::move(mtx)));
- const CFeeRate max_raw_tx_fee_rate = request.params[1].isNull() ?
- DEFAULT_MAX_RAW_TX_FEE_RATE :
- CFeeRate(AmountFromValue(request.params[1]));
+ const CFeeRate max_raw_tx_fee_rate{ParseFeeRate(self.Arg<UniValue>(1))};
int64_t virtual_size = GetVirtualTransactionSize(*tx);
CAmount max_raw_tx_fee = max_raw_tx_fee_rate.GetFee(virtual_size);
@@ -117,7 +115,8 @@ static RPCHelpMan testmempoolaccept()
},
},
{"maxfeerate", RPCArg::Type::AMOUNT, RPCArg::Default{FormatMoney(DEFAULT_MAX_RAW_TX_FEE_RATE.GetFeePerK())},
- "Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT + "/kvB\n"},
+ "Reject transactions whose fee rate is higher than the specified value, expressed in " + CURRENCY_UNIT +
+ "/kvB.\nFee rates larger than 1BTC/kvB are rejected.\nSet to 0 to accept any fee rate."},
},
RPCResult{
RPCResult::Type::ARR, "", "The result of the mempool acceptance test for each raw transaction in the input array.\n"
@@ -162,9 +161,7 @@ static RPCHelpMan testmempoolaccept()
"Array must contain between 1 and " + ToString(MAX_PACKAGE_COUNT) + " transactions.");
}
- const CFeeRate max_raw_tx_fee_rate = request.params[1].isNull() ?
- DEFAULT_MAX_RAW_TX_FEE_RATE :
- CFeeRate(AmountFromValue(request.params[1]));
+ const CFeeRate max_raw_tx_fee_rate{ParseFeeRate(self.Arg<UniValue>(1))};
std::vector<CTransactionRef> txns;
txns.reserve(raw_transactions.size());
@@ -199,7 +196,7 @@ static RPCHelpMan testmempoolaccept()
result_inner.pushKV("txid", tx->GetHash().GetHex());
result_inner.pushKV("wtxid", tx->GetWitnessHash().GetHex());
if (package_result.m_state.GetResult() == PackageValidationResult::PCKG_POLICY) {
- result_inner.pushKV("package-error", package_result.m_state.GetRejectReason());
+ result_inner.pushKV("package-error", package_result.m_state.ToString());
}
auto it = package_result.m_tx_results.find(tx->GetWitnessHash());
if (exit_early || it == package_result.m_tx_results.end()) {
@@ -353,17 +350,15 @@ UniValue MempoolToJSON(const CTxMemPool& pool, bool verbose, bool include_mempoo
}
return o;
} else {
+ UniValue a(UniValue::VARR);
uint64_t mempool_sequence;
- std::vector<uint256> vtxid;
{
LOCK(pool.cs);
- pool.queryHashes(vtxid);
+ for (const CTxMemPoolEntry& e : pool.entryAll()) {
+ a.push_back(e.GetTx().GetHash().ToString());
+ }
mempool_sequence = pool.GetSequence();
}
- UniValue a(UniValue::VARR);
- for (const uint256& hash : vtxid)
- a.push_back(hash.ToString());
-
if (!include_mempool_sequence) {
return a;
} else {
@@ -909,7 +904,7 @@ static RPCHelpMan submitpackage()
case PackageValidationResult::PCKG_TX:
{
// Package-wide error we want to return, but we also want to return individual responses
- package_msg = package_result.m_state.GetRejectReason();
+ package_msg = package_result.m_state.ToString();
CHECK_NONFATAL(package_result.m_tx_results.size() == txns.size() ||
package_result.m_tx_results.empty());
break;
diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp
index fdb694b5f1..f7cdbf52dd 100644
--- a/src/rpc/mining.cpp
+++ b/src/rpc/mining.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <chain.h>
#include <chainparams.h>
#include <common/system.h>
@@ -27,11 +31,11 @@
#include <script/descriptor.h>
#include <script/script.h>
#include <script/signingprovider.h>
-#include <timedata.h>
#include <txmempool.h>
#include <univalue.h>
#include <util/strencodings.h>
#include <util/string.h>
+#include <util/time.h>
#include <util/translation.h>
#include <validation.h>
#include <validationinterface.h>
@@ -383,7 +387,7 @@ static RPCHelpMan generateblock()
LOCK(cs_main);
BlockValidationState state;
- if (!TestBlockValidity(state, chainman.GetParams(), chainman.ActiveChainstate(), block, chainman.m_blockman.LookupBlockIndex(block.hashPrevBlock), GetAdjustedTime, false, false)) {
+ if (!TestBlockValidity(state, chainman.GetParams(), chainman.ActiveChainstate(), block, chainman.m_blockman.LookupBlockIndex(block.hashPrevBlock), false, false)) {
throw JSONRPCError(RPC_VERIFY_ERROR, strprintf("TestBlockValidity failed: %s", state.ToString()));
}
}
@@ -399,7 +403,7 @@ static RPCHelpMan generateblock()
obj.pushKV("hash", block_out->GetHash().GetHex());
if (!process_new_block) {
DataStream block_ser;
- block_ser << RPCTxSerParams(*block_out);
+ block_ser << TX_WITH_WITNESS(*block_out);
obj.pushKV("hex", HexStr(block_ser));
}
return obj;
@@ -495,11 +499,12 @@ static RPCHelpMan getprioritisedtransactions()
"Returns a map of all user-created (see prioritisetransaction) fee deltas by txid, and whether the tx is present in mempool.",
{},
RPCResult{
- RPCResult::Type::OBJ_DYN, "prioritisation-map", "prioritisation keyed by txid",
+ RPCResult::Type::OBJ_DYN, "", "prioritisation keyed by txid",
{
- {RPCResult::Type::OBJ, "txid", "", {
+ {RPCResult::Type::OBJ, "<transactionid>", "", {
{RPCResult::Type::NUM, "fee_delta", "transaction fee delta in satoshis"},
{RPCResult::Type::BOOL, "in_mempool", "whether this transaction is currently in mempool"},
+ {RPCResult::Type::NUM, "modified_fee", /*optional=*/true, "modified fee in satoshis. Only returned if in_mempool=true"},
}}
},
},
@@ -516,6 +521,9 @@ static RPCHelpMan getprioritisedtransactions()
UniValue result_inner{UniValue::VOBJ};
result_inner.pushKV("fee_delta", delta_info.delta);
result_inner.pushKV("in_mempool", delta_info.in_mempool);
+ if (delta_info.in_mempool) {
+ result_inner.pushKV("modified_fee", *delta_info.modified_fee);
+ }
rpc_result.pushKV(delta_info.txid.GetHex(), result_inner);
}
return rpc_result;
@@ -693,7 +701,7 @@ static RPCHelpMan getblocktemplate()
if (block.hashPrevBlock != pindexPrev->GetBlockHash())
return "inconclusive-not-best-prevblk";
BlockValidationState state;
- TestBlockValidity(state, chainman.GetParams(), active_chainstate, block, pindexPrev, GetAdjustedTime, false, true);
+ TestBlockValidity(state, chainman.GetParams(), active_chainstate, block, pindexPrev, false, true);
return BIP22ValidationResult(state);
}
@@ -1034,9 +1042,9 @@ static RPCHelpMan submitblock()
bool new_block;
auto sc = std::make_shared<submitblock_StateCatcher>(block.GetHash());
- RegisterSharedValidationInterface(sc);
+ CHECK_NONFATAL(chainman.m_options.signals)->RegisterSharedValidationInterface(sc);
bool accepted = chainman.ProcessNewBlock(blockptr, /*force_processing=*/true, /*min_pow_checked=*/true, /*new_block=*/&new_block);
- UnregisterSharedValidationInterface(sc);
+ CHECK_NONFATAL(chainman.m_options.signals)->UnregisterSharedValidationInterface(sc);
if (!new_block && accepted) {
return "duplicate";
}
diff --git a/src/rpc/net.cpp b/src/rpc/net.cpp
index 5fea8c22c9..5e6f42b596 100644
--- a/src/rpc/net.cpp
+++ b/src/rpc/net.cpp
@@ -313,7 +313,7 @@ static RPCHelpMan addnode()
{
{"node", RPCArg::Type::STR, RPCArg::Optional::NO, "The address of the peer to connect to"},
{"command", RPCArg::Type::STR, RPCArg::Optional::NO, "'add' to add a node to the list, 'remove' to remove a node from the list, 'onetry' to try a connection to the node once"},
- {"v2transport", RPCArg::Type::BOOL, RPCArg::Default{false}, "Attempt to connect using BIP324 v2 transport protocol (ignored for 'remove' command)"},
+ {"v2transport", RPCArg::Type::BOOL, RPCArg::DefaultHint{"set by -v2transport"}, "Attempt to connect using BIP324 v2 transport protocol (ignored for 'remove' command)"},
},
RPCResult{RPCResult::Type::NONE, "", ""},
RPCExamples{
@@ -332,9 +332,10 @@ static RPCHelpMan addnode()
CConnman& connman = EnsureConnman(node);
const std::string node_arg{request.params[0].get_str()};
- bool use_v2transport = self.Arg<bool>(2);
+ bool node_v2transport = connman.GetLocalServices() & NODE_P2P_V2;
+ bool use_v2transport = self.MaybeArg<bool>(2).value_or(node_v2transport);
- if (use_v2transport && !(node.connman->GetLocalServices() & NODE_P2P_V2)) {
+ if (use_v2transport && !node_v2transport) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Error: v2transport requested but not enabled (see -v2transport)");
}
@@ -370,6 +371,7 @@ static RPCHelpMan addconnection()
{
{"address", RPCArg::Type::STR, RPCArg::Optional::NO, "The IP address and port to attempt connecting to."},
{"connection_type", RPCArg::Type::STR, RPCArg::Optional::NO, "Type of connection to open (\"outbound-full-relay\", \"block-relay-only\", \"addr-fetch\" or \"feeler\")."},
+ {"v2transport", RPCArg::Type::BOOL, RPCArg::Optional::NO, "Attempt to connect using BIP324 v2 transport protocol"},
},
RPCResult{
RPCResult::Type::OBJ, "", "",
@@ -378,8 +380,8 @@ static RPCHelpMan addconnection()
{ RPCResult::Type::STR, "connection_type", "Type of connection opened." },
}},
RPCExamples{
- HelpExampleCli("addconnection", "\"192.168.0.6:8333\" \"outbound-full-relay\"")
- + HelpExampleRpc("addconnection", "\"192.168.0.6:8333\" \"outbound-full-relay\"")
+ HelpExampleCli("addconnection", "\"192.168.0.6:8333\" \"outbound-full-relay\" true")
+ + HelpExampleRpc("addconnection", "\"192.168.0.6:8333\" \"outbound-full-relay\" true")
},
[&](const RPCHelpMan& self, const JSONRPCRequest& request) -> UniValue
{
@@ -401,11 +403,16 @@ static RPCHelpMan addconnection()
} else {
throw JSONRPCError(RPC_INVALID_PARAMETER, self.ToString());
}
+ bool use_v2transport = self.Arg<bool>(2);
NodeContext& node = EnsureAnyNodeContext(request.context);
CConnman& connman = EnsureConnman(node);
- const bool success = connman.AddConnection(address, conn_type);
+ if (use_v2transport && !(connman.GetLocalServices() & NODE_P2P_V2)) {
+ throw JSONRPCError(RPC_INVALID_PARAMETER, "Error: Adding v2transport connections requires -v2transport init flag to be set.");
+ }
+
+ const bool success = connman.AddConnection(address, conn_type, use_v2transport);
if (!success) {
throw JSONRPCError(RPC_CLIENT_NODE_CAPACITY_REACHED, "Error: Already at capacity for specified connection type.");
}
diff --git a/src/rpc/node.cpp b/src/rpc/node.cpp
index b085828215..b8c0080aef 100644
--- a/src/rpc/node.cpp
+++ b/src/rpc/node.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <chainparams.h>
#include <httpserver.h>
#include <index/blockfilterindex.h>
@@ -90,7 +94,7 @@ static RPCHelpMan mockscheduler()
const NodeContext& node_context{EnsureAnyNodeContext(request.context)};
CHECK_NONFATAL(node_context.scheduler)->MockForward(std::chrono::seconds{delta_seconds});
- SyncWithValidationInterfaceQueue();
+ CHECK_NONFATAL(node_context.validation_signals)->SyncWithValidationInterfaceQueue();
for (const auto& chain_client : node_context.chain_clients) {
chain_client->schedulerMockForward(std::chrono::seconds(delta_seconds));
}
diff --git a/src/rpc/rawtransaction.cpp b/src/rpc/rawtransaction.cpp
index b1e6d677f8..634be2f7fb 100644
--- a/src/rpc/rawtransaction.cpp
+++ b/src/rpc/rawtransaction.cpp
@@ -62,7 +62,7 @@ static void TxToJSON(const CTransaction& tx, const uint256 hashBlock, UniValue&
// Blockchain contextual information (confirmations and blocktime) is not
// available to code in bitcoin-common, so we query them here and push the
// data into the returned UniValue.
- TxToUniv(tx, /*block_hash=*/uint256(), entry, /*include_hex=*/true, RPCSerializationWithoutWitness(), txundo, verbosity);
+ TxToUniv(tx, /*block_hash=*/uint256(), entry, /*include_hex=*/true, txundo, verbosity);
if (!hashBlock.IsNull()) {
LOCK(cs_main);
@@ -383,7 +383,7 @@ static RPCHelpMan getrawtransaction()
}
if (verbosity <= 0) {
- return EncodeHexTx(*tx, /*without_witness=*/RPCSerializationWithoutWitness());
+ return EncodeHexTx(*tx);
}
UniValue result(UniValue::VOBJ);
diff --git a/src/rpc/rawtransaction_util.cpp b/src/rpc/rawtransaction_util.cpp
index c471986a44..a9e11622a7 100644
--- a/src/rpc/rawtransaction_util.cpp
+++ b/src/rpc/rawtransaction_util.cpp
@@ -70,7 +70,7 @@ void AddInputs(CMutableTransaction& rawTx, const UniValue& inputs_in, std::optio
}
}
-void AddOutputs(CMutableTransaction& rawTx, const UniValue& outputs_in)
+UniValue NormalizeOutputs(const UniValue& outputs_in)
{
if (outputs_in.isNull()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, output argument must be non-null");
@@ -94,11 +94,15 @@ void AddOutputs(CMutableTransaction& rawTx, const UniValue& outputs_in)
}
outputs = std::move(outputs_dict);
}
+ return outputs;
+}
+std::vector<std::pair<CTxDestination, CAmount>> ParseOutputs(const UniValue& outputs)
+{
// Duplicate checking
std::set<CTxDestination> destinations;
+ std::vector<std::pair<CTxDestination, CAmount>> parsed_outputs;
bool has_data{false};
-
for (const std::string& name_ : outputs.getKeys()) {
if (name_ == "data") {
if (has_data) {
@@ -106,11 +110,12 @@ void AddOutputs(CMutableTransaction& rawTx, const UniValue& outputs_in)
}
has_data = true;
std::vector<unsigned char> data = ParseHexV(outputs[name_].getValStr(), "Data");
-
- CTxOut out(0, CScript() << OP_RETURN << data);
- rawTx.vout.push_back(out);
+ CTxDestination destination{CNoDestination{CScript() << OP_RETURN << data}};
+ CAmount amount{0};
+ parsed_outputs.emplace_back(destination, amount);
} else {
- CTxDestination destination = DecodeDestination(name_);
+ CTxDestination destination{DecodeDestination(name_)};
+ CAmount amount{AmountFromValue(outputs[name_])};
if (!IsValidDestination(destination)) {
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, std::string("Invalid Bitcoin address: ") + name_);
}
@@ -118,13 +123,23 @@ void AddOutputs(CMutableTransaction& rawTx, const UniValue& outputs_in)
if (!destinations.insert(destination).second) {
throw JSONRPCError(RPC_INVALID_PARAMETER, std::string("Invalid parameter, duplicated address: ") + name_);
}
+ parsed_outputs.emplace_back(destination, amount);
+ }
+ }
+ return parsed_outputs;
+}
+
+void AddOutputs(CMutableTransaction& rawTx, const UniValue& outputs_in)
+{
+ UniValue outputs(UniValue::VOBJ);
+ outputs = NormalizeOutputs(outputs_in);
- CScript scriptPubKey = GetScriptForDestination(destination);
- CAmount nAmount = AmountFromValue(outputs[name_]);
+ std::vector<std::pair<CTxDestination, CAmount>> parsed_outputs = ParseOutputs(outputs);
+ for (const auto& [destination, nAmount] : parsed_outputs) {
+ CScript scriptPubKey = GetScriptForDestination(destination);
- CTxOut out(nAmount, scriptPubKey);
- rawTx.vout.push_back(out);
- }
+ CTxOut out(nAmount, scriptPubKey);
+ rawTx.vout.push_back(out);
}
}
diff --git a/src/rpc/rawtransaction_util.h b/src/rpc/rawtransaction_util.h
index a863432b7a..964d0b095b 100644
--- a/src/rpc/rawtransaction_util.h
+++ b/src/rpc/rawtransaction_util.h
@@ -5,6 +5,8 @@
#ifndef BITCOIN_RPC_RAWTRANSACTION_UTIL_H
#define BITCOIN_RPC_RAWTRANSACTION_UTIL_H
+#include <addresstype.h>
+#include <consensus/amount.h>
#include <map>
#include <string>
#include <optional>
@@ -38,11 +40,16 @@ void SignTransactionResultToJSON(CMutableTransaction& mtx, bool complete, const
*/
void ParsePrevouts(const UniValue& prevTxsUnival, FillableSigningProvider* keystore, std::map<COutPoint, Coin>& coins);
-
/** Normalize univalue-represented inputs and add them to the transaction */
void AddInputs(CMutableTransaction& rawTx, const UniValue& inputs_in, bool rbf);
-/** Normalize univalue-represented outputs and add them to the transaction */
+/** Normalize univalue-represented outputs */
+UniValue NormalizeOutputs(const UniValue& outputs_in);
+
+/** Parse normalized outputs into destination, amount tuples */
+std::vector<std::pair<CTxDestination, CAmount>> ParseOutputs(const UniValue& outputs);
+
+/** Normalize, parse, and add outputs to the transaction */
void AddOutputs(CMutableTransaction& rawTx, const UniValue& outputs_in);
/** Create a transaction from univalue parameters */
diff --git a/src/rpc/register.h b/src/rpc/register.h
index c88f49ecf0..fd23dde75b 100644
--- a/src/rpc/register.h
+++ b/src/rpc/register.h
@@ -5,6 +5,10 @@
#ifndef BITCOIN_RPC_REGISTER_H
#define BITCOIN_RPC_REGISTER_H
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
/** These are in one header file to avoid creating tons of single-function
* headers for everything under src/rpc/ */
class CRPCTable;
diff --git a/src/rpc/server.cpp b/src/rpc/server.cpp
index 4883341522..e7d1e3db4e 100644
--- a/src/rpc/server.cpp
+++ b/src/rpc/server.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <rpc/server.h>
#include <common/args.h>
@@ -597,9 +601,4 @@ void RPCRunLater(const std::string& name, std::function<void()> func, int64_t nS
deadlineTimers.emplace(name, std::unique_ptr<RPCTimerBase>(timerInterface->NewTimer(func, nSeconds*1000)));
}
-bool RPCSerializationWithoutWitness()
-{
- return (gArgs.GetIntArg("-rpcserialversion", DEFAULT_RPC_SERIALIZE_VERSION) == 0);
-}
-
CRPCTable tableRPC;
diff --git a/src/rpc/server.h b/src/rpc/server.h
index 9a49d82570..b8348e4aa6 100644
--- a/src/rpc/server.h
+++ b/src/rpc/server.h
@@ -16,8 +16,6 @@
#include <univalue.h>
-static const unsigned int DEFAULT_RPC_SERIALIZE_VERSION = 1;
-
class CRPCCommand;
namespace RPCServer
@@ -183,14 +181,4 @@ void InterruptRPC();
void StopRPC();
std::string JSONRPCExecBatch(const JSONRPCRequest& jreq, const UniValue& vReq);
-// Drop witness when serializing for RPC?
-bool RPCSerializationWithoutWitness();
-
-template<typename T>
-auto RPCTxSerParams(T&& t)
-{
- if (RPCSerializationWithoutWitness()) return TX_NO_WITNESS(t);
- return TX_WITH_WITNESS(t);
-}
-
#endif // BITCOIN_RPC_SERVER_H
diff --git a/src/rpc/util.cpp b/src/rpc/util.cpp
index cf48ee11e7..51c88cc1ba 100644
--- a/src/rpc/util.cpp
+++ b/src/rpc/util.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <clientversion.h>
#include <core_io.h>
#include <common/args.h>
@@ -75,6 +79,13 @@ CAmount AmountFromValue(const UniValue& value, int decimals)
return amount;
}
+CFeeRate ParseFeeRate(const UniValue& json)
+{
+ CAmount val{AmountFromValue(json)};
+ if (val >= COIN) throw JSONRPCError(RPC_INVALID_PARAMETER, "Fee rates larger than or equal to 1BTC/kvB are not accepted");
+ return CFeeRate{val};
+}
+
uint256 ParseHashV(const UniValue& v, std::string_view name)
{
const std::string& strHex(v.get_str());
@@ -678,11 +689,13 @@ static void CheckRequiredOrDefault(const RPCArg& param)
void force_semicolon(ret_type)
// Optional arg (without default). Can also be called on required args, if needed.
+TMPL_INST(nullptr, const UniValue*, maybe_arg;);
TMPL_INST(nullptr, std::optional<double>, maybe_arg ? std::optional{maybe_arg->get_real()} : std::nullopt;);
TMPL_INST(nullptr, std::optional<bool>, maybe_arg ? std::optional{maybe_arg->get_bool()} : std::nullopt;);
TMPL_INST(nullptr, const std::string*, maybe_arg ? &maybe_arg->get_str() : nullptr;);
// Required arg or optional arg with default value.
+TMPL_INST(CheckRequiredOrDefault, const UniValue&, *CHECK_NONFATAL(maybe_arg););
TMPL_INST(CheckRequiredOrDefault, bool, CHECK_NONFATAL(maybe_arg)->get_bool(););
TMPL_INST(CheckRequiredOrDefault, int, CHECK_NONFATAL(maybe_arg)->getInt<int>(););
TMPL_INST(CheckRequiredOrDefault, uint64_t, CHECK_NONFATAL(maybe_arg)->getInt<uint64_t>(););
diff --git a/src/rpc/util.h b/src/rpc/util.h
index e2d5ed333c..ad3ed97b2e 100644
--- a/src/rpc/util.h
+++ b/src/rpc/util.h
@@ -103,6 +103,11 @@ std::vector<unsigned char> ParseHexO(const UniValue& o, std::string_view strKey)
* @returns a CAmount if the various checks pass.
*/
CAmount AmountFromValue(const UniValue& value, int decimals = 8);
+/**
+ * Parse a json number or string, denoting BTC/kvB, into a CFeeRate (sat/kvB).
+ * Reject negative values or rates larger than 1BTC/kvB.
+ */
+CFeeRate ParseFeeRate(const UniValue& json);
using RPCArgList = std::vector<std::pair<std::string, UniValue>>;
std::string HelpExampleCli(const std::string& methodname, const std::string& args);
diff --git a/src/scheduler.cpp b/src/scheduler.cpp
index 6c6f644142..a1158e0c07 100644
--- a/src/scheduler.cpp
+++ b/src/scheduler.cpp
@@ -129,7 +129,7 @@ bool CScheduler::AreThreadsServicingQueue() const
}
-void SingleThreadedSchedulerClient::MaybeScheduleProcessQueue()
+void SerialTaskRunner::MaybeScheduleProcessQueue()
{
{
LOCK(m_callbacks_mutex);
@@ -142,7 +142,7 @@ void SingleThreadedSchedulerClient::MaybeScheduleProcessQueue()
m_scheduler.schedule([this] { this->ProcessQueue(); }, std::chrono::steady_clock::now());
}
-void SingleThreadedSchedulerClient::ProcessQueue()
+void SerialTaskRunner::ProcessQueue()
{
std::function<void()> callback;
{
@@ -158,8 +158,8 @@ void SingleThreadedSchedulerClient::ProcessQueue()
// RAII the setting of fCallbacksRunning and calling MaybeScheduleProcessQueue
// to ensure both happen safely even if callback() throws.
struct RAIICallbacksRunning {
- SingleThreadedSchedulerClient* instance;
- explicit RAIICallbacksRunning(SingleThreadedSchedulerClient* _instance) : instance(_instance) {}
+ SerialTaskRunner* instance;
+ explicit RAIICallbacksRunning(SerialTaskRunner* _instance) : instance(_instance) {}
~RAIICallbacksRunning()
{
{
@@ -173,7 +173,7 @@ void SingleThreadedSchedulerClient::ProcessQueue()
callback();
}
-void SingleThreadedSchedulerClient::AddToProcessQueue(std::function<void()> func)
+void SerialTaskRunner::insert(std::function<void()> func)
{
{
LOCK(m_callbacks_mutex);
@@ -182,7 +182,7 @@ void SingleThreadedSchedulerClient::AddToProcessQueue(std::function<void()> func
MaybeScheduleProcessQueue();
}
-void SingleThreadedSchedulerClient::EmptyQueue()
+void SerialTaskRunner::flush()
{
assert(!m_scheduler.AreThreadsServicingQueue());
bool should_continue = true;
@@ -193,7 +193,7 @@ void SingleThreadedSchedulerClient::EmptyQueue()
}
}
-size_t SingleThreadedSchedulerClient::CallbacksPending()
+size_t SerialTaskRunner::size()
{
LOCK(m_callbacks_mutex);
return m_callbacks_pending.size();
diff --git a/src/scheduler.h b/src/scheduler.h
index 9212582b97..454c083b31 100644
--- a/src/scheduler.h
+++ b/src/scheduler.h
@@ -8,6 +8,7 @@
#include <attributes.h>
#include <sync.h>
#include <threadsafety.h>
+#include <util/task_runner.h>
#include <chrono>
#include <condition_variable>
@@ -120,12 +121,16 @@ private:
* B() will be able to observe all of the effects of callback A() which executed
* before it.
*/
-class SingleThreadedSchedulerClient
+class SerialTaskRunner : public util::TaskRunnerInterface
{
private:
CScheduler& m_scheduler;
Mutex m_callbacks_mutex;
+
+ // We are not allowed to assume the scheduler only runs in one thread,
+ // but must ensure all callbacks happen in-order, so we end up creating
+ // our own queue here :(
std::list<std::function<void()>> m_callbacks_pending GUARDED_BY(m_callbacks_mutex);
bool m_are_callbacks_running GUARDED_BY(m_callbacks_mutex) = false;
@@ -133,7 +138,7 @@ private:
void ProcessQueue() EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
public:
- explicit SingleThreadedSchedulerClient(CScheduler& scheduler LIFETIMEBOUND) : m_scheduler{scheduler} {}
+ explicit SerialTaskRunner(CScheduler& scheduler LIFETIMEBOUND) : m_scheduler{scheduler} {}
/**
* Add a callback to be executed. Callbacks are executed serially
@@ -141,15 +146,15 @@ public:
* Practically, this means that callbacks can behave as if they are executed
* in order by a single thread.
*/
- void AddToProcessQueue(std::function<void()> func) EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
+ void insert(std::function<void()> func) override EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
/**
* Processes all remaining queue members on the calling thread, blocking until queue is empty
* Must be called after the CScheduler has no remaining processing threads!
*/
- void EmptyQueue() EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
+ void flush() override EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
- size_t CallbacksPending() EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
+ size_t size() override EXCLUSIVE_LOCKS_REQUIRED(!m_callbacks_mutex);
};
#endif // BITCOIN_SCHEDULER_H
diff --git a/src/secp256k1/.cirrus.yml b/src/secp256k1/.cirrus.yml
new file mode 100644
index 0000000000..04aa8f2409
--- /dev/null
+++ b/src/secp256k1/.cirrus.yml
@@ -0,0 +1,95 @@
+env:
+ ### cirrus config
+ CIRRUS_CLONE_DEPTH: 1
+ ### compiler options
+ HOST:
+ WRAPPER_CMD:
+ # Specific warnings can be disabled with -Wno-error=foo.
+ # -pedantic-errors is not equivalent to -Werror=pedantic and thus not implied by -Werror according to the GCC manual.
+ WERROR_CFLAGS: -Werror -pedantic-errors
+ MAKEFLAGS: -j4
+ BUILD: check
+ ### secp256k1 config
+ ECMULTWINDOW: auto
+ ECMULTGENPRECISION: auto
+ ASM: no
+ WIDEMUL: auto
+ WITH_VALGRIND: yes
+ EXTRAFLAGS:
+ ### secp256k1 modules
+ EXPERIMENTAL: no
+ ECDH: no
+ RECOVERY: no
+ SCHNORRSIG: no
+ ELLSWIFT: no
+ ### test options
+ SECP256K1_TEST_ITERS:
+ BENCH: yes
+ SECP256K1_BENCH_ITERS: 2
+ CTIMETESTS: yes
+ # Compile and run the tests
+ EXAMPLES: yes
+
+cat_logs_snippet: &CAT_LOGS
+ always:
+ cat_tests_log_script:
+ - cat tests.log || true
+ cat_noverify_tests_log_script:
+ - cat noverify_tests.log || true
+ cat_exhaustive_tests_log_script:
+ - cat exhaustive_tests.log || true
+ cat_ctime_tests_log_script:
+ - cat ctime_tests.log || true
+ cat_bench_log_script:
+ - cat bench.log || true
+ cat_config_log_script:
+ - cat config.log || true
+ cat_test_env_script:
+ - cat test_env.log || true
+ cat_ci_env_script:
+ - env
+
+linux_arm64_container_snippet: &LINUX_ARM64_CONTAINER
+ env_script:
+ - env | tee /tmp/env
+ build_script:
+ - DOCKER_BUILDKIT=1 docker build --file "ci/linux-debian.Dockerfile" --tag="ci_secp256k1_arm"
+ - docker image prune --force # Cleanup stale layers
+ test_script:
+ - docker run --rm --mount "type=bind,src=./,dst=/ci_secp256k1" --env-file /tmp/env --replace --name "ci_secp256k1_arm" "ci_secp256k1_arm" bash -c "cd /ci_secp256k1/ && ./ci/ci.sh"
+
+task:
+ name: "ARM64: Linux (Debian stable)"
+ persistent_worker:
+ labels:
+ type: arm64
+ env:
+ ECDH: yes
+ RECOVERY: yes
+ SCHNORRSIG: yes
+ ELLSWIFT: yes
+ matrix:
+ # Currently only gcc-snapshot, the other compilers are tested on GHA with QEMU
+ - env: { CC: 'gcc-snapshot' }
+ << : *LINUX_ARM64_CONTAINER
+ << : *CAT_LOGS
+
+task:
+ name: "ARM64: Linux (Debian stable), Valgrind"
+ persistent_worker:
+ labels:
+ type: arm64
+ env:
+ ECDH: yes
+ RECOVERY: yes
+ SCHNORRSIG: yes
+ ELLSWIFT: yes
+ WRAPPER_CMD: 'valgrind --error-exitcode=42'
+ SECP256K1_TEST_ITERS: 2
+ matrix:
+ - env: { CC: 'gcc' }
+ - env: { CC: 'clang' }
+ - env: { CC: 'gcc-snapshot' }
+ - env: { CC: 'clang-snapshot' }
+ << : *LINUX_ARM64_CONTAINER
+ << : *CAT_LOGS
diff --git a/src/secp256k1/.github/actions/run-in-docker-action/action.yml b/src/secp256k1/.github/actions/run-in-docker-action/action.yml
index d357c3cf75..dbfaa4fece 100644
--- a/src/secp256k1/.github/actions/run-in-docker-action/action.yml
+++ b/src/secp256k1/.github/actions/run-in-docker-action/action.yml
@@ -14,9 +14,9 @@ inputs:
runs:
using: "composite"
steps:
- - uses: docker/setup-buildx-action@v2
+ - uses: docker/setup-buildx-action@v3
- - uses: docker/build-push-action@v4
+ - uses: docker/build-push-action@v5
id: main_builder
continue-on-error: true
with:
@@ -26,7 +26,7 @@ runs:
load: true
cache-from: type=gha
- - uses: docker/build-push-action@v4
+ - uses: docker/build-push-action@v5
id: retry_builder
if: steps.main_builder.outcome == 'failure'
with:
diff --git a/src/secp256k1/.github/workflows/ci.yml b/src/secp256k1/.github/workflows/ci.yml
index b9a9eaa82e..4ad905af52 100644
--- a/src/secp256k1/.github/workflows/ci.yml
+++ b/src/secp256k1/.github/workflows/ci.yml
@@ -47,14 +47,14 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v2
+ uses: docker/setup-buildx-action@v3
with:
# See: https://github.com/moby/buildkit/issues/3969.
driver-opts: |
network=host
- name: Build container
- uses: docker/build-push-action@v4
+ uses: docker/build-push-action@v5
with:
file: ./ci/linux-debian.Dockerfile
tags: linux-debian-image
@@ -792,7 +792,7 @@ jobs:
- name: Check installation with Autotools
env:
- CI_INSTALL: ${{ runner.temp }}/${{ github.run_id }}${{ github.action }}
+ CI_INSTALL: ${{ runner.temp }}/${{ github.run_id }}${{ github.action }}/install
run: |
./autogen.sh && ./configure --prefix=${{ env.CI_INSTALL }} && make clean && make install && ls -RlAh ${{ env.CI_INSTALL }}
gcc -o ecdsa examples/ecdsa.c $(PKG_CONFIG_PATH=${{ env.CI_INSTALL }}/lib/pkgconfig pkg-config --cflags --libs libsecp256k1) -Wl,-rpath,"${{ env.CI_INSTALL }}/lib" && ./ecdsa
diff --git a/src/secp256k1/CHANGELOG.md b/src/secp256k1/CHANGELOG.md
index e8d8db5a1e..04ac9b7e5a 100644
--- a/src/secp256k1/CHANGELOG.md
+++ b/src/secp256k1/CHANGELOG.md
@@ -5,6 +5,17 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
+## [Unreleased]
+
+## [0.4.1] - 2023-12-21
+
+#### Changed
+ - The point multiplication algorithm used for ECDH operations (module `ecdh`) was replaced with a slightly faster one.
+ - Optional handwritten x86_64 assembly for field operations was removed because modern C compilers are able to output more efficient assembly. This change results in a significant speedup of some library functions when handwritten x86_64 assembly is enabled (`--with-asm=x86_64` in GNU Autotools, `-DSECP256K1_ASM=x86_64` in CMake), which is the default on x86_64. Benchmarks with GCC 10.5.0 show a 10% speedup for `secp256k1_ecdsa_verify` and `secp256k1_schnorrsig_verify`.
+
+#### ABI Compatibility
+The ABI is backward compatible with versions 0.4.0 and 0.3.x.
+
## [0.4.0] - 2023-09-04
#### Added
@@ -104,7 +115,8 @@ This version was in fact never released.
The number was given by the build system since the introduction of autotools in Jan 2014 (ea0fe5a5bf0c04f9cc955b2966b614f5f378c6f6).
Therefore, this version number does not uniquely identify a set of source files.
-[unreleased]: https://github.com/bitcoin-core/secp256k1/compare/v0.4.0...HEAD
+[unreleased]: https://github.com/bitcoin-core/secp256k1/compare/v0.4.1...HEAD
+[0.4.1]: https://github.com/bitcoin-core/secp256k1/compare/v0.4.0...v0.4.1
[0.4.0]: https://github.com/bitcoin-core/secp256k1/compare/v0.3.2...v0.4.0
[0.3.2]: https://github.com/bitcoin-core/secp256k1/compare/v0.3.1...v0.3.2
[0.3.1]: https://github.com/bitcoin-core/secp256k1/compare/v0.3.0...v0.3.1
diff --git a/src/secp256k1/CMakeLists.txt b/src/secp256k1/CMakeLists.txt
index cdac47ba9d..cf0dc3ba93 100644
--- a/src/secp256k1/CMakeLists.txt
+++ b/src/secp256k1/CMakeLists.txt
@@ -11,7 +11,7 @@ project(libsecp256k1
# The package (a.k.a. release) version is based on semantic versioning 2.0.0 of
# the API. All changes in experimental modules are treated as
# backwards-compatible and therefore at most increase the minor version.
- VERSION 0.4.0
+ VERSION 0.4.2
DESCRIPTION "Optimized C library for ECDSA signatures and secret/public key operations on curve secp256k1."
HOMEPAGE_URL "https://github.com/bitcoin-core/secp256k1"
LANGUAGES C
@@ -35,7 +35,7 @@ endif()
# All changes in experimental modules are treated as if they don't affect the
# interface and therefore only increase the revision.
set(${PROJECT_NAME}_LIB_VERSION_CURRENT 3)
-set(${PROJECT_NAME}_LIB_VERSION_REVISION 0)
+set(${PROJECT_NAME}_LIB_VERSION_REVISION 2)
set(${PROJECT_NAME}_LIB_VERSION_AGE 1)
set(CMAKE_C_STANDARD 90)
@@ -107,7 +107,7 @@ if(SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY)
endif()
mark_as_advanced(FORCE SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY)
-set(SECP256K1_ASM "AUTO" CACHE STRING "Assembly optimizations to use: \"AUTO\", \"OFF\", \"x86_64\" or \"arm32\" (experimental). [default=AUTO]")
+set(SECP256K1_ASM "AUTO" CACHE STRING "Assembly to use: \"AUTO\", \"OFF\", \"x86_64\" or \"arm32\" (experimental). [default=AUTO]")
set_property(CACHE SECP256K1_ASM PROPERTY STRINGS "AUTO" "OFF" "x86_64" "arm32")
check_string_option_value(SECP256K1_ASM)
if(SECP256K1_ASM STREQUAL "arm32")
@@ -117,7 +117,7 @@ if(SECP256K1_ASM STREQUAL "arm32")
if(HAVE_ARM32_ASM)
add_compile_definitions(USE_EXTERNAL_ASM=1)
else()
- message(FATAL_ERROR "ARM32 assembly optimization requested but not available.")
+ message(FATAL_ERROR "ARM32 assembly requested but not available.")
endif()
elseif(SECP256K1_ASM)
include(CheckX86_64Assembly)
@@ -128,14 +128,14 @@ elseif(SECP256K1_ASM)
elseif(SECP256K1_ASM STREQUAL "AUTO")
set(SECP256K1_ASM "OFF")
else()
- message(FATAL_ERROR "x86_64 assembly optimization requested but not available.")
+ message(FATAL_ERROR "x86_64 assembly requested but not available.")
endif()
endif()
option(SECP256K1_EXPERIMENTAL "Allow experimental configuration options." OFF)
if(NOT SECP256K1_EXPERIMENTAL)
if(SECP256K1_ASM STREQUAL "arm32")
- message(FATAL_ERROR "ARM32 assembly optimization is experimental. Use -DSECP256K1_EXPERIMENTAL=ON to allow.")
+ message(FATAL_ERROR "ARM32 assembly is experimental. Use -DSECP256K1_EXPERIMENTAL=ON to allow.")
endif()
endif()
@@ -280,7 +280,7 @@ message("Parameters:")
message(" ecmult window size .................. ${SECP256K1_ECMULT_WINDOW_SIZE}")
message(" ecmult gen precision bits ........... ${SECP256K1_ECMULT_GEN_PREC_BITS}")
message("Optional features:")
-message(" assembly optimization ............... ${SECP256K1_ASM}")
+message(" assembly ............................ ${SECP256K1_ASM}")
message(" external callbacks .................. ${SECP256K1_USE_EXTERNAL_DEFAULT_CALLBACKS}")
if(SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY)
message(" wide multiplication (test-only) ..... ${SECP256K1_TEST_OVERRIDE_WIDE_MULTIPLY}")
diff --git a/src/secp256k1/CONTRIBUTING.md b/src/secp256k1/CONTRIBUTING.md
new file mode 100644
index 0000000000..a5e457913a
--- /dev/null
+++ b/src/secp256k1/CONTRIBUTING.md
@@ -0,0 +1,107 @@
+# Contributing to libsecp256k1
+
+## Scope
+
+libsecp256k1 is a library for elliptic curve cryptography on the curve secp256k1, not a general-purpose cryptography library.
+The library primarily serves the needs of the Bitcoin Core project but provides additional functionality for the benefit of the wider Bitcoin ecosystem.
+
+## Adding new functionality or modules
+
+The libsecp256k1 project welcomes contributions in the form of new functionality or modules, provided they are within the project's scope.
+
+It is the responsibility of the contributors to convince the maintainers that the proposed functionality is within the project's scope, high-quality and maintainable.
+Contributors are recommended to provide the following in addition to the new code:
+
+* **Specification:**
+ A specification can help significantly in reviewing the new code as it provides documentation and context.
+ It may justify various design decisions, give a motivation and outline security goals.
+ If the specification contains pseudocode, a reference implementation or test vectors, these can be used to compare with the proposed libsecp256k1 code.
+* **Security Arguments:**
+ In addition to a defining the security goals, it should be argued that the new functionality meets these goals.
+ Depending on the nature of the new functionality, a wide range of security arguments are acceptable, ranging from being "obviously secure" to rigorous proofs of security.
+* **Relevance Arguments:**
+ The relevance of the new functionality for the Bitcoin ecosystem should be argued by outlining clear use cases.
+
+These are not the only factors taken into account when considering to add new functionality.
+The proposed new libsecp256k1 code must be of high quality, including API documentation and tests, as well as featuring a misuse-resistant API design.
+
+We recommend reaching out to other contributors (see [Communication Channels](#communication-channels)) and get feedback before implementing new functionality.
+
+## Communication channels
+
+Most communication about libsecp256k1 occurs on the GitHub repository: in issues, pull request or on the discussion board.
+
+Additionally, there is an IRC channel dedicated to libsecp256k1, with biweekly meetings (see channel topic).
+The channel is `#secp256k1` on Libera Chat.
+The easiest way to participate on IRC is with the web client, [web.libera.chat](https://web.libera.chat/#secp256k1).
+Chat history logs can be found at https://gnusha.org/secp256k1/.
+
+## Contributor workflow & peer review
+
+The Contributor Workflow & Peer Review in libsecp256k1 are similar to Bitcoin Core's workflow and review processes described in its [CONTRIBUTING.md](https://github.com/bitcoin/bitcoin/blob/master/CONTRIBUTING.md).
+
+### Coding conventions
+
+In addition, libsecp256k1 tries to maintain the following coding conventions:
+
+* No runtime heap allocation (e.g., no `malloc`) unless explicitly requested by the caller (via `secp256k1_context_create` or `secp256k1_scratch_space_create`, for example). Morever, it should be possible to use the library without any heap allocations.
+* The tests should cover all lines and branches of the library (see [Test coverage](#coverage)).
+* Operations involving secret data should be tested for being constant time with respect to the secrets (see [src/ctime_tests.c](src/ctime_tests.c)).
+* Local variables containing secret data should be cleared explicitly to try to delete secrets from memory.
+* Use `secp256k1_memcmp_var` instead of `memcmp` (see [#823](https://github.com/bitcoin-core/secp256k1/issues/823)).
+
+#### Style conventions
+
+* Commits should be atomic and diffs should be easy to read. For this reason, do not mix any formatting fixes or code moves with actual code changes. Make sure each individual commit is hygienic: that it builds successfully on its own without warnings, errors, regressions, or test failures.
+* New code should adhere to the style of existing, in particular surrounding, code. Other than that, we do not enforce strict rules for code formatting.
+* The code conforms to C89. Most notably, that means that only `/* ... */` comments are allowed (no `//` line comments). Moreover, any declarations in a `{ ... }` block (e.g., a function) must appear at the beginning of the block before any statements. When you would like to declare a variable in the middle of a block, you can open a new block:
+ ```C
+ void secp256k_foo(void) {
+ unsigned int x; /* declaration */
+ int y = 2*x; /* declaration */
+ x = 17; /* statement */
+ {
+ int a, b; /* declaration */
+ a = x + y; /* statement */
+ secp256k_bar(x, &b); /* statement */
+ }
+ }
+ ```
+* Use `unsigned int` instead of just `unsigned`.
+* Use `void *ptr` instead of `void* ptr`.
+* Arguments of the publicly-facing API must have a specific order defined in [include/secp256k1.h](include/secp256k1.h).
+* User-facing comment lines in headers should be limited to 80 chars if possible.
+* All identifiers in file scope should start with `secp256k1_`.
+* Avoid trailing whitespace.
+
+### Tests
+
+#### Coverage
+
+This library aims to have full coverage of reachable lines and branches.
+
+To create a test coverage report, configure with `--enable-coverage` (use of GCC is necessary):
+
+ $ ./configure --enable-coverage
+
+Run the tests:
+
+ $ make check
+
+To create a report, `gcovr` is recommended, as it includes branch coverage reporting:
+
+ $ gcovr --exclude 'src/bench*' --print-summary
+
+To create a HTML report with coloured and annotated source code:
+
+ $ mkdir -p coverage
+ $ gcovr --exclude 'src/bench*' --html --html-details -o coverage/coverage.html
+
+#### Exhaustive tests
+
+There are tests of several functions in which a small group replaces secp256k1.
+These tests are *exhaustive* since they provide all elements and scalars of the small group as input arguments (see [src/tests_exhaustive.c](src/tests_exhaustive.c)).
+
+### Benchmarks
+
+See `src/bench*.c` for examples of benchmarks.
diff --git a/src/secp256k1/Makefile.am b/src/secp256k1/Makefile.am
index 32bc729a41..5498617915 100644
--- a/src/secp256k1/Makefile.am
+++ b/src/secp256k1/Makefile.am
@@ -37,7 +37,6 @@ noinst_HEADERS += src/field_10x26_impl.h
noinst_HEADERS += src/field_5x52.h
noinst_HEADERS += src/field_5x52_impl.h
noinst_HEADERS += src/field_5x52_int128_impl.h
-noinst_HEADERS += src/field_5x52_asm_impl.h
noinst_HEADERS += src/modinv32.h
noinst_HEADERS += src/modinv32_impl.h
noinst_HEADERS += src/modinv64.h
@@ -46,6 +45,7 @@ noinst_HEADERS += src/precomputed_ecmult.h
noinst_HEADERS += src/precomputed_ecmult_gen.h
noinst_HEADERS += src/assumptions.h
noinst_HEADERS += src/checkmem.h
+noinst_HEADERS += src/testutil.h
noinst_HEADERS += src/util.h
noinst_HEADERS += src/int128.h
noinst_HEADERS += src/int128_impl.h
diff --git a/src/secp256k1/README.md b/src/secp256k1/README.md
index 19dabe8505..4013e6a93b 100644
--- a/src/secp256k1/README.md
+++ b/src/secp256k1/README.md
@@ -1,11 +1,10 @@
libsecp256k1
============
-[![Build Status](https://api.cirrus-ci.com/github/bitcoin-core/secp256k1.svg?branch=master)](https://cirrus-ci.com/github/bitcoin-core/secp256k1)
![Dependencies: None](https://img.shields.io/badge/dependencies-none-success)
[![irc.libera.chat #secp256k1](https://img.shields.io/badge/irc.libera.chat-%23secp256k1-success)](https://web.libera.chat/#secp256k1)
-Optimized C library for ECDSA signatures and secret/public key operations on curve secp256k1.
+High-performance high-assurance C library for digital signatures and other cryptographic primitives on the secp256k1 elliptic curve.
This library is intended to be the highest quality publicly available library for cryptography on the secp256k1 curve. However, the primary focus of its development has been for usage in the Bitcoin system and usage unlike Bitcoin's may be less well tested, verified, or suffer from a less well thought out interface. Correct usage requires some care and consideration that the library is fit for your application's purpose.
@@ -34,7 +33,7 @@ Implementation details
* Expose only higher level interfaces to minimize the API surface and improve application security. ("Be difficult to use insecurely.")
* Field operations
* Optimized implementation of arithmetic modulo the curve's field size (2^256 - 0x1000003D1).
- * Using 5 52-bit limbs (including hand-optimized assembly for x86_64, by Diederik Huys).
+ * Using 5 52-bit limbs
* Using 10 26-bit limbs (including hand-optimized assembly for 32-bit ARM, by Wladimir J. van der Laan).
* This is an experimental feature that has not received enough scrutiny to satisfy the standard of quality of this library but is made available for testing and review by the community.
* Scalar operations
@@ -117,28 +116,6 @@ Usage examples can be found in the [examples](examples) directory. To compile th
To compile the Schnorr signature and ECDH examples, you also need to configure with `--enable-module-schnorrsig` and `--enable-module-ecdh`.
-Test coverage
------------
-
-This library aims to have full coverage of the reachable lines and branches.
-
-To create a test coverage report, configure with `--enable-coverage` (use of GCC is necessary):
-
- $ ./configure --enable-coverage
-
-Run the tests:
-
- $ make check
-
-To create a report, `gcovr` is recommended, as it includes branch coverage reporting:
-
- $ gcovr --exclude 'src/bench*' --print-summary
-
-To create a HTML report with coloured and annotated source code:
-
- $ mkdir -p coverage
- $ gcovr --exclude 'src/bench*' --html --html-details -o coverage/coverage.html
-
Benchmark
------------
If configured with `--enable-benchmark` (which is the default), binaries for benchmarking the libsecp256k1 functions will be present in the root directory after the build.
@@ -155,3 +132,8 @@ Reporting a vulnerability
------------
See [SECURITY.md](SECURITY.md)
+
+Contributing to libsecp256k1
+------------
+
+See [CONTRIBUTING.md](CONTRIBUTING.md)
diff --git a/src/secp256k1/ci/ci.sh b/src/secp256k1/ci/ci.sh
index 719e7851ef..9cc715955e 100755
--- a/src/secp256k1/ci/ci.sh
+++ b/src/secp256k1/ci/ci.sh
@@ -83,7 +83,21 @@ esac
--host="$HOST" $EXTRAFLAGS
# We have set "-j<n>" in MAKEFLAGS.
-make
+build_exit_code=0
+make > make.log 2>&1 || build_exit_code=$?
+cat make.log
+if [ $build_exit_code -ne 0 ]; then
+ case "${CC:-undefined}" in
+ *snapshot*)
+ # Ignore internal compiler errors in gcc-snapshot and clang-snapshot
+ grep -e "internal compiler error:" -e "PLEASE submit a bug report" make.log
+ return $?;
+ ;;
+ *)
+ return 1;
+ ;;
+ esac
+fi
# Print information about binaries so that we can see that the architecture is correct
file *tests* || true
diff --git a/src/secp256k1/ci/linux-debian.Dockerfile b/src/secp256k1/ci/linux-debian.Dockerfile
index e719907e89..5ce715b41b 100644
--- a/src/secp256k1/ci/linux-debian.Dockerfile
+++ b/src/secp256k1/ci/linux-debian.Dockerfile
@@ -29,11 +29,15 @@ RUN apt-get update && apt-get install --no-install-recommends -y \
gcc-i686-linux-gnu libc6-dev-i386-cross libc6-dbg:i386 libubsan1:i386 libasan8:i386 \
gcc-s390x-linux-gnu libc6-dev-s390x-cross libc6-dbg:s390x \
gcc-arm-linux-gnueabihf libc6-dev-armhf-cross libc6-dbg:armhf \
- gcc-aarch64-linux-gnu libc6-dev-arm64-cross libc6-dbg:arm64 \
gcc-powerpc64le-linux-gnu libc6-dev-ppc64el-cross libc6-dbg:ppc64el \
gcc-mingw-w64-x86-64-win32 wine64 wine \
gcc-mingw-w64-i686-win32 wine32 \
- python3
+ python3 && \
+ if ! ( dpkg --print-architecture | grep --quiet "arm64" ) ; then \
+ apt-get install --no-install-recommends -y \
+ gcc-aarch64-linux-gnu libc6-dev-arm64-cross libc6-dbg:arm64 ;\
+ fi && \
+ apt-get clean && rm -rf /var/lib/apt/lists/*
# Build and install gcc snapshot
ARG GCC_SNAPSHOT_MAJOR=14
@@ -44,7 +48,7 @@ RUN apt-get update && apt-get install --no-install-recommends -y wget libgmp-dev
sha512sum --check --ignore-missing sha512.sum && \
# We should have downloaded exactly one tar.xz file
ls && \
- [[ $(ls *.tar.xz | wc -l) -eq "1" ]] && \
+ [ $(ls *.tar.xz | wc -l) -eq "1" ] && \
tar xf *.tar.xz && \
mkdir gcc-build && cd gcc-build && \
../*/configure --prefix=/opt/gcc-snapshot --enable-languages=c --disable-bootstrap --disable-multilib --without-isl && \
diff --git a/src/secp256k1/cmake/GeneratePkgConfigFile.cmake b/src/secp256k1/cmake/GeneratePkgConfigFile.cmake
new file mode 100644
index 0000000000..9c1d7f1ddd
--- /dev/null
+++ b/src/secp256k1/cmake/GeneratePkgConfigFile.cmake
@@ -0,0 +1,8 @@
+function(generate_pkg_config_file in_file)
+ set(prefix ${CMAKE_INSTALL_PREFIX})
+ set(exec_prefix \${prefix})
+ set(libdir \${exec_prefix}/${CMAKE_INSTALL_LIBDIR})
+ set(includedir \${prefix}/${CMAKE_INSTALL_INCLUDEDIR})
+ set(PACKAGE_VERSION ${PROJECT_VERSION})
+ configure_file(${in_file} ${PROJECT_NAME}.pc @ONLY)
+endfunction()
diff --git a/src/secp256k1/configure.ac b/src/secp256k1/configure.ac
index e3877850d3..2c1596775e 100644
--- a/src/secp256k1/configure.ac
+++ b/src/secp256k1/configure.ac
@@ -5,8 +5,8 @@ AC_PREREQ([2.60])
# backwards-compatible and therefore at most increase the minor version.
define(_PKG_VERSION_MAJOR, 0)
define(_PKG_VERSION_MINOR, 4)
-define(_PKG_VERSION_PATCH, 0)
-define(_PKG_VERSION_IS_RELEASE, true)
+define(_PKG_VERSION_PATCH, 2)
+define(_PKG_VERSION_IS_RELEASE, false)
# The library version is based on libtool versioning of the ABI. The set of
# rules for updating the version can be found here:
@@ -14,7 +14,7 @@ define(_PKG_VERSION_IS_RELEASE, true)
# All changes in experimental modules are treated as if they don't affect the
# interface and therefore only increase the revision.
define(_LIB_VERSION_CURRENT, 3)
-define(_LIB_VERSION_REVISION, 0)
+define(_LIB_VERSION_REVISION, 2)
define(_LIB_VERSION_AGE, 1)
AC_INIT([libsecp256k1],m4_join([.], _PKG_VERSION_MAJOR, _PKG_VERSION_MINOR, _PKG_VERSION_PATCH)m4_if(_PKG_VERSION_IS_RELEASE, [true], [], [-dev]),[https://github.com/bitcoin-core/secp256k1/issues],[libsecp256k1],[https://github.com/bitcoin-core/secp256k1])
@@ -201,7 +201,7 @@ AC_ARG_ENABLE(external_default_callbacks,
AC_ARG_WITH([test-override-wide-multiply], [] ,[set_widemul=$withval], [set_widemul=auto])
AC_ARG_WITH([asm], [AS_HELP_STRING([--with-asm=x86_64|arm32|no|auto],
-[assembly optimizations to use (experimental: arm32) [default=auto]])],[req_asm=$withval], [req_asm=auto])
+[assembly to use (experimental: arm32) [default=auto]])],[req_asm=$withval], [req_asm=auto])
AC_ARG_WITH([ecmult-window], [AS_HELP_STRING([--with-ecmult-window=SIZE|auto],
[window size for ecmult precomputation for verification, specified as integer in range [2..24].]
@@ -279,24 +279,24 @@ else
x86_64)
SECP_X86_64_ASM_CHECK
if test x"$has_x86_64_asm" != x"yes"; then
- AC_MSG_ERROR([x86_64 assembly optimization requested but not available])
+ AC_MSG_ERROR([x86_64 assembly requested but not available])
fi
;;
arm32)
SECP_ARM32_ASM_CHECK
if test x"$has_arm32_asm" != x"yes"; then
- AC_MSG_ERROR([ARM32 assembly optimization requested but not available])
+ AC_MSG_ERROR([ARM32 assembly requested but not available])
fi
;;
no)
;;
*)
- AC_MSG_ERROR([invalid assembly optimization selection])
+ AC_MSG_ERROR([invalid assembly selection])
;;
esac
fi
-# Select assembly optimization
+# Select assembly
enable_external_asm=no
case $set_asm in
@@ -309,7 +309,7 @@ arm32)
no)
;;
*)
- AC_MSG_ERROR([invalid assembly optimizations])
+ AC_MSG_ERROR([invalid assembly selection])
;;
esac
@@ -425,7 +425,7 @@ if test x"$enable_experimental" = x"yes"; then
AC_MSG_NOTICE([******])
else
if test x"$set_asm" = x"arm32"; then
- AC_MSG_ERROR([ARM32 assembly optimization is experimental. Use --enable-experimental to allow.])
+ AC_MSG_ERROR([ARM32 assembly is experimental. Use --enable-experimental to allow.])
fi
fi
diff --git a/src/secp256k1/doc/release-process.md b/src/secp256k1/doc/release-process.md
index ea6087c9ff..51e337a5ab 100644
--- a/src/secp256k1/doc/release-process.md
+++ b/src/secp256k1/doc/release-process.md
@@ -24,16 +24,21 @@ Perform these checks before creating a release:
2. Check installation with autotools:
```shell
dir=$(mktemp -d)
-./autogen.sh && ./configure --prefix=$dir && make clean && make install && ls -l $dir/include $dir/lib
+./autogen.sh && ./configure --prefix=$dir && make clean && make install && ls -RlAh $dir
gcc -o ecdsa examples/ecdsa.c $(PKG_CONFIG_PATH=$dir/lib/pkgconfig pkg-config --cflags --libs libsecp256k1) -Wl,-rpath,"$dir/lib" && ./ecdsa
```
3. Check installation with CMake:
```shell
dir=$(mktemp -d)
build=$(mktemp -d)
-cmake -B $build -DCMAKE_INSTALL_PREFIX=$dir && cmake --build $build --target install && ls -l $dir/include $dir/lib*
+cmake -B $build -DCMAKE_INSTALL_PREFIX=$dir && cmake --build $build --target install && ls -RlAh $dir
gcc -o ecdsa examples/ecdsa.c -I $dir/include -L $dir/lib*/ -l secp256k1 -Wl,-rpath,"$dir/lib",-rpath,"$dir/lib64" && ./ecdsa
```
+4. Use the [`check-abi.sh`](/tools/check-abi.sh) tool to ensure there are no unexpected ABI incompatibilities and that the version number and release notes accurately reflect all potential ABI changes. To run this tool, the `abi-dumper` and `abi-compliance-checker` packages are required.
+
+```shell
+tools/check-abi.sh
+```
## Regular release
@@ -41,7 +46,7 @@ gcc -o ecdsa examples/ecdsa.c -I $dir/include -L $dir/lib*/ -l secp256k1 -Wl,-rp
* finalizes the release notes in [CHANGELOG.md](../CHANGELOG.md) by
* adding a section for the release (make sure that the version number is a link to a diff between the previous and new version),
* removing the `[Unreleased]` section header, and
- * including an entry for `### ABI Compatibility` if it doesn't exist that mentions the library soname of the release,
+ * including an entry for `### ABI Compatibility` if it doesn't exist,
* sets `_PKG_VERSION_IS_RELEASE` to `true` in `configure.ac`, and
* if this is not a patch release
* updates `_PKG_VERSION_*` and `_LIB_VERSION_*` in `configure.ac` and
diff --git a/src/secp256k1/src/CMakeLists.txt b/src/secp256k1/src/CMakeLists.txt
index b305751b08..4cbaeb914d 100644
--- a/src/secp256k1/src/CMakeLists.txt
+++ b/src/secp256k1/src/CMakeLists.txt
@@ -161,5 +161,13 @@ if(SECP256K1_INSTALL)
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config.cmake
${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake
DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}
-)
+ )
+
+ include(GeneratePkgConfigFile)
+ generate_pkg_config_file(${PROJECT_SOURCE_DIR}/libsecp256k1.pc.in)
+ install(
+ FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.pc
+ DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
+ )
endif()
diff --git a/src/secp256k1/src/asm/field_10x26_arm.s b/src/secp256k1/src/asm/field_10x26_arm.s
index 42cbf879ef..664b921400 100644
--- a/src/secp256k1/src/asm/field_10x26_arm.s
+++ b/src/secp256k1/src/asm/field_10x26_arm.s
@@ -913,3 +913,4 @@ secp256k1_fe_sqr_inner:
ldmfd sp!, {r4, r5, r6, r7, r8, r9, r10, r11, pc}
.size secp256k1_fe_sqr_inner, .-secp256k1_fe_sqr_inner
+ .section .note.GNU-stack,"",%progbits
diff --git a/src/secp256k1/src/bench_internal.c b/src/secp256k1/src/bench_internal.c
index f3686dd289..a700684922 100644
--- a/src/secp256k1/src/bench_internal.c
+++ b/src/secp256k1/src/bench_internal.c
@@ -14,10 +14,28 @@
#include "field_impl.h"
#include "group_impl.h"
#include "scalar_impl.h"
-#include "ecmult_const_impl.h"
#include "ecmult_impl.h"
#include "bench.h"
+static void help(int default_iters) {
+ printf("Benchmarks various internal routines.\n");
+ printf("\n");
+ printf("The default number of iterations for each benchmark is %d. This can be\n", default_iters);
+ printf("customized using the SECP256K1_BENCH_ITERS environment variable.\n");
+ printf("\n");
+ printf("Usage: ./bench_internal [args]\n");
+ printf("By default, all benchmarks will be run.\n");
+ printf("args:\n");
+ printf(" help : display this help and exit\n");
+ printf(" scalar : all scalar operations (add, half, inverse, mul, negate, split)\n");
+ printf(" field : all field operations (half, inverse, issquare, mul, normalize, sqr, sqrt)\n");
+ printf(" group : all group operations (add, double, to_affine)\n");
+ printf(" ecmult : all point multiplication operations (ecmult_wnaf) \n");
+ printf(" hash : all hash algorithms (hmac, rng6979, sha256)\n");
+ printf(" context : all context object operations (context_create)\n");
+ printf("\n");
+}
+
typedef struct {
secp256k1_scalar scalar[2];
secp256k1_fe fe[4];
@@ -98,6 +116,18 @@ static void bench_scalar_negate(void* arg, int iters) {
}
}
+static void bench_scalar_half(void* arg, int iters) {
+ int i;
+ bench_inv *data = (bench_inv*)arg;
+ secp256k1_scalar s = data->scalar[0];
+
+ for (i = 0; i < iters; i++) {
+ secp256k1_scalar_half(&s, &s);
+ }
+
+ data->scalar[0] = s;
+}
+
static void bench_scalar_mul(void* arg, int iters) {
int i;
bench_inv *data = (bench_inv*)arg;
@@ -309,18 +339,6 @@ static void bench_ecmult_wnaf(void* arg, int iters) {
CHECK(bits <= 256*iters);
}
-static void bench_wnaf_const(void* arg, int iters) {
- int i, bits = 0, overflow = 0;
- bench_inv *data = (bench_inv*)arg;
-
- for (i = 0; i < iters; i++) {
- bits += secp256k1_wnaf_const(data->wnaf, &data->scalar[0], WINDOW_A, 256);
- overflow += secp256k1_scalar_add(&data->scalar[0], &data->scalar[0], &data->scalar[1]);
- }
- CHECK(overflow >= 0);
- CHECK(bits <= 256*iters);
-}
-
static void bench_sha256(void* arg, int iters) {
int i;
bench_inv *data = (bench_inv*)arg;
@@ -366,10 +384,22 @@ static void bench_context(void* arg, int iters) {
int main(int argc, char **argv) {
bench_inv data;
- int iters = get_iters(20000);
+ int default_iters = 20000;
+ int iters = get_iters(default_iters);
int d = argc == 1; /* default */
+
+ if (argc > 1) {
+ if (have_flag(argc, argv, "-h")
+ || have_flag(argc, argv, "--help")
+ || have_flag(argc, argv, "help")) {
+ help(default_iters);
+ return 0;
+ }
+ }
+
print_output_table_header_row();
+ if (d || have_flag(argc, argv, "scalar") || have_flag(argc, argv, "half")) run_benchmark("scalar_half", bench_scalar_half, bench_setup, NULL, &data, 10, iters*100);
if (d || have_flag(argc, argv, "scalar") || have_flag(argc, argv, "add")) run_benchmark("scalar_add", bench_scalar_add, bench_setup, NULL, &data, 10, iters*100);
if (d || have_flag(argc, argv, "scalar") || have_flag(argc, argv, "negate")) run_benchmark("scalar_negate", bench_scalar_negate, bench_setup, NULL, &data, 10, iters*100);
if (d || have_flag(argc, argv, "scalar") || have_flag(argc, argv, "mul")) run_benchmark("scalar_mul", bench_scalar_mul, bench_setup, NULL, &data, 10, iters*10);
@@ -394,7 +424,6 @@ int main(int argc, char **argv) {
if (d || have_flag(argc, argv, "group") || have_flag(argc, argv, "add")) run_benchmark("group_add_zinv_var", bench_group_add_zinv_var, bench_setup, NULL, &data, 10, iters*10);
if (d || have_flag(argc, argv, "group") || have_flag(argc, argv, "to_affine")) run_benchmark("group_to_affine_var", bench_group_to_affine_var, bench_setup, NULL, &data, 10, iters);
- if (d || have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("wnaf_const", bench_wnaf_const, bench_setup, NULL, &data, 10, iters);
if (d || have_flag(argc, argv, "ecmult") || have_flag(argc, argv, "wnaf")) run_benchmark("ecmult_wnaf", bench_ecmult_wnaf, bench_setup, NULL, &data, 10, iters);
if (d || have_flag(argc, argv, "hash") || have_flag(argc, argv, "sha256")) run_benchmark("hash_sha256", bench_sha256, bench_setup, NULL, &data, 10, iters);
diff --git a/src/secp256k1/src/ecdsa_impl.h b/src/secp256k1/src/ecdsa_impl.h
index e71254d9f9..ce36e85e6a 100644
--- a/src/secp256k1/src/ecdsa_impl.h
+++ b/src/secp256k1/src/ecdsa_impl.h
@@ -66,8 +66,7 @@ static int secp256k1_der_read_len(size_t *len, const unsigned char **sigp, const
}
if (lenleft > sizeof(size_t)) {
/* The resulting length would exceed the range of a size_t, so
- * certainly longer than the passed array size.
- */
+ * it is certainly longer than the passed array size. */
return 0;
}
while (lenleft > 0) {
@@ -76,7 +75,9 @@ static int secp256k1_der_read_len(size_t *len, const unsigned char **sigp, const
lenleft--;
}
if (*len > (size_t)(sigend - *sigp)) {
- /* Result exceeds the length of the passed array. */
+ /* Result exceeds the length of the passed array.
+ (Checking this is the responsibility of the caller but it
+ can't hurt do it here, too.) */
return 0;
}
if (*len < 128) {
diff --git a/src/secp256k1/src/ecmult_const_impl.h b/src/secp256k1/src/ecmult_const_impl.h
index 06f9e53ffd..7dc4aac25d 100644
--- a/src/secp256k1/src/ecmult_const_impl.h
+++ b/src/secp256k1/src/ecmult_const_impl.h
@@ -1,5 +1,5 @@
/***********************************************************************
- * Copyright (c) 2015 Pieter Wuille, Andrew Poelstra *
+ * Copyright (c) 2015, 2022 Pieter Wuille, Andrew Poelstra *
* Distributed under the MIT software license, see the accompanying *
* file COPYING or https://www.opensource.org/licenses/mit-license.php.*
***********************************************************************/
@@ -12,208 +12,259 @@
#include "ecmult_const.h"
#include "ecmult_impl.h"
+#if defined(EXHAUSTIVE_TEST_ORDER)
+/* We need 2^ECMULT_CONST_GROUP_SIZE - 1 to be less than EXHAUSTIVE_TEST_ORDER, because
+ * the tables cannot have infinities in them (this breaks the effective-affine technique's
+ * z-ratio tracking) */
+# if EXHAUSTIVE_TEST_ORDER == 199
+# define ECMULT_CONST_GROUP_SIZE 4
+# elif EXHAUSTIVE_TEST_ORDER == 13
+# define ECMULT_CONST_GROUP_SIZE 3
+# elif EXHAUSTIVE_TEST_ORDER == 7
+# define ECMULT_CONST_GROUP_SIZE 2
+# else
+# error "Unknown EXHAUSTIVE_TEST_ORDER"
+# endif
+#else
+/* Group size 4 or 5 appears optimal. */
+# define ECMULT_CONST_GROUP_SIZE 5
+#endif
+
+#define ECMULT_CONST_TABLE_SIZE (1L << (ECMULT_CONST_GROUP_SIZE - 1))
+#define ECMULT_CONST_GROUPS ((129 + ECMULT_CONST_GROUP_SIZE - 1) / ECMULT_CONST_GROUP_SIZE)
+#define ECMULT_CONST_BITS (ECMULT_CONST_GROUPS * ECMULT_CONST_GROUP_SIZE)
+
/** Fill a table 'pre' with precomputed odd multiples of a.
*
* The resulting point set is brought to a single constant Z denominator, stores the X and Y
- * coordinates as ge_storage points in pre, and stores the global Z in globalz.
- * It only operates on tables sized for WINDOW_A wnaf multiples.
+ * coordinates as ge points in pre, and stores the global Z in globalz.
+ *
+ * 'pre' must be an array of size ECMULT_CONST_TABLE_SIZE.
*/
-static void secp256k1_ecmult_odd_multiples_table_globalz_windowa(secp256k1_ge *pre, secp256k1_fe *globalz, const secp256k1_gej *a) {
- secp256k1_fe zr[ECMULT_TABLE_SIZE(WINDOW_A)];
+static void secp256k1_ecmult_const_odd_multiples_table_globalz(secp256k1_ge *pre, secp256k1_fe *globalz, const secp256k1_gej *a) {
+ secp256k1_fe zr[ECMULT_CONST_TABLE_SIZE];
- secp256k1_ecmult_odd_multiples_table(ECMULT_TABLE_SIZE(WINDOW_A), pre, zr, globalz, a);
- secp256k1_ge_table_set_globalz(ECMULT_TABLE_SIZE(WINDOW_A), pre, zr);
+ secp256k1_ecmult_odd_multiples_table(ECMULT_CONST_TABLE_SIZE, pre, zr, globalz, a);
+ secp256k1_ge_table_set_globalz(ECMULT_CONST_TABLE_SIZE, pre, zr);
}
-/* This is like `ECMULT_TABLE_GET_GE` but is constant time */
-#define ECMULT_CONST_TABLE_GET_GE(r,pre,n,w) do { \
- int m = 0; \
- /* Extract the sign-bit for a constant time absolute-value. */ \
- int volatile mask = (n) >> (sizeof(n) * CHAR_BIT - 1); \
- int abs_n = ((n) + mask) ^ mask; \
- int idx_n = abs_n >> 1; \
+/* Given a table 'pre' with odd multiples of a point, put in r the signed-bit multiplication of n with that point.
+ *
+ * For example, if ECMULT_CONST_GROUP_SIZE is 4, then pre is expected to contain 8 entries:
+ * [1*P, 3*P, 5*P, 7*P, 9*P, 11*P, 13*P, 15*P]. n is then expected to be a 4-bit integer (range 0-15), and its
+ * bits are interpreted as signs of powers of two to look up.
+ *
+ * For example, if n=4, which is 0100 in binary, which is interpreted as [- + - -], so the looked up value is
+ * [ -(2^3) + (2^2) - (2^1) - (2^0) ]*P = -7*P. Every valid n translates to an odd number in range [-15,15],
+ * which means we just need to look up one of the precomputed values, and optionally negate it.
+ */
+#define ECMULT_CONST_TABLE_GET_GE(r,pre,n) do { \
+ unsigned int m = 0; \
+ /* If the top bit of n is 0, we want the negation. */ \
+ volatile unsigned int negative = ((n) >> (ECMULT_CONST_GROUP_SIZE - 1)) ^ 1; \
+ /* Let n[i] be the i-th bit of n, then the index is
+ * sum(cnot(n[i]) * 2^i, i=0..l-2)
+ * where cnot(b) = b if n[l-1] = 1 and 1 - b otherwise.
+ * For example, if n = 4, in binary 0100, the index is 3, in binary 011.
+ *
+ * Proof:
+ * Let
+ * x = sum((2*n[i] - 1)*2^i, i=0..l-1)
+ * = 2*sum(n[i] * 2^i, i=0..l-1) - 2^l + 1
+ * be the value represented by n.
+ * The index is (x - 1)/2 if x > 0 and -(x + 1)/2 otherwise.
+ * Case x > 0:
+ * n[l-1] = 1
+ * index = sum(n[i] * 2^i, i=0..l-1) - 2^(l-1)
+ * = sum(n[i] * 2^i, i=0..l-2)
+ * Case x <= 0:
+ * n[l-1] = 0
+ * index = -(2*sum(n[i] * 2^i, i=0..l-1) - 2^l + 2)/2
+ * = 2^(l-1) - 1 - sum(n[i] * 2^i, i=0..l-1)
+ * = sum((1 - n[i]) * 2^i, i=0..l-2)
+ */ \
+ unsigned int index = ((unsigned int)(-negative) ^ n) & ((1U << (ECMULT_CONST_GROUP_SIZE - 1)) - 1U); \
secp256k1_fe neg_y; \
- VERIFY_CHECK(((n) & 1) == 1); \
- VERIFY_CHECK((n) >= -((1 << ((w)-1)) - 1)); \
- VERIFY_CHECK((n) <= ((1 << ((w)-1)) - 1)); \
- VERIFY_SETUP(secp256k1_fe_clear(&(r)->x)); \
- VERIFY_SETUP(secp256k1_fe_clear(&(r)->y)); \
- /* Unconditionally set r->x = (pre)[m].x. r->y = (pre)[m].y. because it's either the correct one \
+ VERIFY_CHECK((n) < (1U << ECMULT_CONST_GROUP_SIZE)); \
+ VERIFY_CHECK(index < (1U << (ECMULT_CONST_GROUP_SIZE - 1))); \
+ /* Unconditionally set r->x = (pre)[m].x. r->y = (pre)[m].y. because it's either the correct one
* or will get replaced in the later iterations, this is needed to make sure `r` is initialized. */ \
(r)->x = (pre)[m].x; \
(r)->y = (pre)[m].y; \
- for (m = 1; m < ECMULT_TABLE_SIZE(w); m++) { \
+ for (m = 1; m < ECMULT_CONST_TABLE_SIZE; m++) { \
/* This loop is used to avoid secret data in array indices. See
* the comment in ecmult_gen_impl.h for rationale. */ \
- secp256k1_fe_cmov(&(r)->x, &(pre)[m].x, m == idx_n); \
- secp256k1_fe_cmov(&(r)->y, &(pre)[m].y, m == idx_n); \
+ secp256k1_fe_cmov(&(r)->x, &(pre)[m].x, m == index); \
+ secp256k1_fe_cmov(&(r)->y, &(pre)[m].y, m == index); \
} \
(r)->infinity = 0; \
secp256k1_fe_negate(&neg_y, &(r)->y, 1); \
- secp256k1_fe_cmov(&(r)->y, &neg_y, (n) != abs_n); \
+ secp256k1_fe_cmov(&(r)->y, &neg_y, negative); \
} while(0)
-/** Convert a number to WNAF notation.
- * The number becomes represented by sum(2^{wi} * wnaf[i], i=0..WNAF_SIZE(w)+1) - return_val.
- * It has the following guarantees:
- * - each wnaf[i] an odd integer between -(1 << w) and (1 << w)
- * - each wnaf[i] is nonzero
- * - the number of words set is always WNAF_SIZE(w) + 1
- *
- * Adapted from `The Width-w NAF Method Provides Small Memory and Fast Elliptic Scalar
- * Multiplications Secure against Side Channel Attacks`, Okeya and Tagaki. M. Joye (Ed.)
- * CT-RSA 2003, LNCS 2612, pp. 328-443, 2003. Springer-Verlag Berlin Heidelberg 2003
- *
- * Numbers reference steps of `Algorithm SPA-resistant Width-w NAF with Odd Scalar` on pp. 335
- */
-static int secp256k1_wnaf_const(int *wnaf, const secp256k1_scalar *scalar, int w, int size) {
- int global_sign;
- int skew;
- int word = 0;
-
- /* 1 2 3 */
- int u_last;
- int u;
-
- int flip;
- secp256k1_scalar s = *scalar;
-
- VERIFY_CHECK(w > 0);
- VERIFY_CHECK(size > 0);
+/* For K as defined in the comment of secp256k1_ecmult_const, we have several precomputed
+ * formulas/constants.
+ * - in exhaustive test mode, we give an explicit expression to compute it at compile time: */
+#ifdef EXHAUSTIVE_TEST_ORDER
+static const secp256k1_scalar secp256k1_ecmult_const_K = ((SECP256K1_SCALAR_CONST(0, 0, 0, (1U << (ECMULT_CONST_BITS - 128)) - 2U, 0, 0, 0, 0) + EXHAUSTIVE_TEST_ORDER - 1U) * (1U + EXHAUSTIVE_TEST_LAMBDA)) % EXHAUSTIVE_TEST_ORDER;
+/* - for the real secp256k1 group we have constants for various ECMULT_CONST_BITS values. */
+#elif ECMULT_CONST_BITS == 129
+/* For GROUP_SIZE = 1,3. */
+static const secp256k1_scalar secp256k1_ecmult_const_K = SECP256K1_SCALAR_CONST(0xac9c52b3ul, 0x3fa3cf1ful, 0x5ad9e3fdul, 0x77ed9ba4ul, 0xa880b9fcul, 0x8ec739c2ul, 0xe0cfc810ul, 0xb51283ceul);
+#elif ECMULT_CONST_BITS == 130
+/* For GROUP_SIZE = 2,5. */
+static const secp256k1_scalar secp256k1_ecmult_const_K = SECP256K1_SCALAR_CONST(0xa4e88a7dul, 0xcb13034eul, 0xc2bdd6bful, 0x7c118d6bul, 0x589ae848ul, 0x26ba29e4ul, 0xb5c2c1dcul, 0xde9798d9ul);
+#elif ECMULT_CONST_BITS == 132
+/* For GROUP_SIZE = 4,6 */
+static const secp256k1_scalar secp256k1_ecmult_const_K = SECP256K1_SCALAR_CONST(0x76b1d93dul, 0x0fae3c6bul, 0x3215874bul, 0x94e93813ul, 0x7937fe0dul, 0xb66bcaaful, 0xb3749ca5ul, 0xd7b6171bul);
+#else
+# error "Unknown ECMULT_CONST_BITS"
+#endif
- /* Note that we cannot handle even numbers by negating them to be odd, as is
- * done in other implementations, since if our scalars were specified to have
- * width < 256 for performance reasons, their negations would have width 256
- * and we'd lose any performance benefit. Instead, we use a variation of a
- * technique from Section 4.2 of the Okeya/Tagaki paper, which is to add 1 to the
- * number we are encoding when it is even, returning a skew value indicating
- * this, and having the caller compensate after doing the multiplication.
+static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *q) {
+ /* The approach below combines the signed-digit logic from Mike Hamburg's
+ * "Fast and compact elliptic-curve cryptography" (https://eprint.iacr.org/2012/309)
+ * Section 3.3, with the GLV endomorphism.
*
- * In fact, we _do_ want to negate numbers to minimize their bit-lengths (and in
- * particular, to ensure that the outputs from the endomorphism-split fit into
- * 128 bits). If we negate, the parity of our number flips, affecting whether
- * we want to add to the scalar to ensure that it's odd. */
- flip = secp256k1_scalar_is_high(&s);
- skew = flip ^ secp256k1_scalar_is_even(&s);
- secp256k1_scalar_cadd_bit(&s, 0, skew);
- global_sign = secp256k1_scalar_cond_negate(&s, flip);
-
- /* 4 */
- u_last = secp256k1_scalar_shr_int(&s, w);
- do {
- int even;
-
- /* 4.1 4.4 */
- u = secp256k1_scalar_shr_int(&s, w);
- /* 4.2 */
- even = ((u & 1) == 0);
- /* In contrast to the original algorithm, u_last is always > 0 and
- * therefore we do not need to check its sign. In particular, it's easy
- * to see that u_last is never < 0 because u is never < 0. Moreover,
- * u_last is never = 0 because u is never even after a loop
- * iteration. The same holds analogously for the initial value of
- * u_last (in the first loop iteration). */
- VERIFY_CHECK(u_last > 0);
- VERIFY_CHECK((u_last & 1) == 1);
- u += even;
- u_last -= even * (1 << w);
-
- /* 4.3, adapted for global sign change */
- wnaf[word++] = u_last * global_sign;
-
- u_last = u;
- } while (word * w < size);
- wnaf[word] = u * global_sign;
-
- VERIFY_CHECK(secp256k1_scalar_is_zero(&s));
- VERIFY_CHECK(word == WNAF_SIZE_BITS(size, w));
- return skew;
-}
-
-static void secp256k1_ecmult_const(secp256k1_gej *r, const secp256k1_ge *a, const secp256k1_scalar *scalar) {
- secp256k1_ge pre_a[ECMULT_TABLE_SIZE(WINDOW_A)];
- secp256k1_ge tmpa;
- secp256k1_fe Z;
-
- int skew_1;
- secp256k1_ge pre_a_lam[ECMULT_TABLE_SIZE(WINDOW_A)];
- int wnaf_lam[1 + WNAF_SIZE(WINDOW_A - 1)];
- int skew_lam;
- secp256k1_scalar q_1, q_lam;
- int wnaf_1[1 + WNAF_SIZE(WINDOW_A - 1)];
-
- int i;
+ * The idea there is to interpret the bits of a scalar as signs (1 = +, 0 = -), and compute a
+ * point multiplication in that fashion. Let v be an n-bit non-negative integer (0 <= v < 2^n),
+ * and v[i] its i'th bit (so v = sum(v[i] * 2^i, i=0..n-1)). Then define:
+ *
+ * C_l(v, A) = sum((2*v[i] - 1) * 2^i*A, i=0..l-1)
+ *
+ * Then it holds that C_l(v, A) = sum((2*v[i] - 1) * 2^i*A, i=0..l-1)
+ * = (2*sum(v[i] * 2^i, i=0..l-1) + 1 - 2^l) * A
+ * = (2*v + 1 - 2^l) * A
+ *
+ * Thus, one can compute q*A as C_256((q + 2^256 - 1) / 2, A). This is the basis for the
+ * paper's signed-digit multi-comb algorithm for multiplication using a precomputed table.
+ *
+ * It is appealing to try to combine this with the GLV optimization: the idea that a scalar
+ * s can be written as s1 + lambda*s2, where lambda is a curve-specific constant such that
+ * lambda*A is easy to compute, and where s1 and s2 are small. In particular we have the
+ * secp256k1_scalar_split_lambda function which performs such a split with the resulting s1
+ * and s2 in range (-2^128, 2^128) mod n. This does work, but is uninteresting:
+ *
+ * To compute q*A:
+ * - Let s1, s2 = split_lambda(q)
+ * - Let R1 = C_256((s1 + 2^256 - 1) / 2, A)
+ * - Let R2 = C_256((s2 + 2^256 - 1) / 2, lambda*A)
+ * - Return R1 + R2
+ *
+ * The issue is that while s1 and s2 are small-range numbers, (s1 + 2^256 - 1) / 2 (mod n)
+ * and (s2 + 2^256 - 1) / 2 (mod n) are not, undoing the benefit of the splitting.
+ *
+ * To make it work, we want to modify the input scalar q first, before splitting, and then only
+ * add a 2^128 offset of the split results (so that they end up in the single 129-bit range
+ * [0,2^129]). A slightly smaller offset would work due to the bounds on the split, but we pick
+ * 2^128 for simplicity. Let s be the scalar fed to split_lambda, and f(q) the function to
+ * compute it from q:
+ *
+ * To compute q*A:
+ * - Compute s = f(q)
+ * - Let s1, s2 = split_lambda(s)
+ * - Let v1 = s1 + 2^128 (mod n)
+ * - Let v2 = s2 + 2^128 (mod n)
+ * - Let R1 = C_l(v1, A)
+ * - Let R2 = C_l(v2, lambda*A)
+ * - Return R1 + R2
+ *
+ * l will thus need to be at least 129, but we may overshoot by a few bits (see
+ * further), so keep it as a variable.
+ *
+ * To solve for s, we reason:
+ * q*A = R1 + R2
+ * <=> q*A = C_l(s1 + 2^128, A) + C_l(s2 + 2^128, lambda*A)
+ * <=> q*A = (2*(s1 + 2^128) + 1 - 2^l) * A + (2*(s2 + 2^128) + 1 - 2^l) * lambda*A
+ * <=> q*A = (2*(s1 + s2*lambda) + (2^129 + 1 - 2^l) * (1 + lambda)) * A
+ * <=> q = 2*(s1 + s2*lambda) + (2^129 + 1 - 2^l) * (1 + lambda) (mod n)
+ * <=> q = 2*s + (2^129 + 1 - 2^l) * (1 + lambda) (mod n)
+ * <=> s = (q + (2^l - 2^129 - 1) * (1 + lambda)) / 2 (mod n)
+ * <=> f(q) = (q + K) / 2 (mod n)
+ * where K = (2^l - 2^129 - 1)*(1 + lambda) (mod n)
+ *
+ * We will process the computation of C_l(v1, A) and C_l(v2, lambda*A) in groups of
+ * ECMULT_CONST_GROUP_SIZE, so we set l to the smallest multiple of ECMULT_CONST_GROUP_SIZE
+ * that is not less than 129; this equals ECMULT_CONST_BITS.
+ */
+ /* The offset to add to s1 and s2 to make them non-negative. Equal to 2^128. */
+ static const secp256k1_scalar S_OFFSET = SECP256K1_SCALAR_CONST(0, 0, 0, 1, 0, 0, 0, 0);
+ secp256k1_scalar s, v1, v2;
+ secp256k1_ge pre_a[ECMULT_CONST_TABLE_SIZE];
+ secp256k1_ge pre_a_lam[ECMULT_CONST_TABLE_SIZE];
+ secp256k1_fe global_z;
+ int group, i;
+
+ /* We're allowed to be non-constant time in the point, and the code below (in particular,
+ * secp256k1_ecmult_const_odd_multiples_table_globalz) cannot deal with infinity in a
+ * constant-time manner anyway. */
if (secp256k1_ge_is_infinity(a)) {
secp256k1_gej_set_infinity(r);
return;
}
- /* build wnaf representation for q. */
- /* split q into q_1 and q_lam (where q = q_1 + q_lam*lambda, and q_1 and q_lam are ~128 bit) */
- secp256k1_scalar_split_lambda(&q_1, &q_lam, scalar);
- skew_1 = secp256k1_wnaf_const(wnaf_1, &q_1, WINDOW_A - 1, 128);
- skew_lam = secp256k1_wnaf_const(wnaf_lam, &q_lam, WINDOW_A - 1, 128);
+ /* Compute v1 and v2. */
+ secp256k1_scalar_add(&s, q, &secp256k1_ecmult_const_K);
+ secp256k1_scalar_half(&s, &s);
+ secp256k1_scalar_split_lambda(&v1, &v2, &s);
+ secp256k1_scalar_add(&v1, &v1, &S_OFFSET);
+ secp256k1_scalar_add(&v2, &v2, &S_OFFSET);
- /* Calculate odd multiples of a.
+#ifdef VERIFY
+ /* Verify that v1 and v2 are in range [0, 2^129-1]. */
+ for (i = 129; i < 256; ++i) {
+ VERIFY_CHECK(secp256k1_scalar_get_bits(&v1, i, 1) == 0);
+ VERIFY_CHECK(secp256k1_scalar_get_bits(&v2, i, 1) == 0);
+ }
+#endif
+
+ /* Calculate odd multiples of A and A*lambda.
* All multiples are brought to the same Z 'denominator', which is stored
- * in Z. Due to secp256k1' isomorphism we can do all operations pretending
+ * in global_z. Due to secp256k1' isomorphism we can do all operations pretending
* that the Z coordinate was 1, use affine addition formulae, and correct
* the Z coordinate of the result once at the end.
*/
- VERIFY_CHECK(!a->infinity);
secp256k1_gej_set_ge(r, a);
- secp256k1_ecmult_odd_multiples_table_globalz_windowa(pre_a, &Z, r);
- for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) {
- secp256k1_fe_normalize_weak(&pre_a[i].y);
- }
- for (i = 0; i < ECMULT_TABLE_SIZE(WINDOW_A); i++) {
+ secp256k1_ecmult_const_odd_multiples_table_globalz(pre_a, &global_z, r);
+ for (i = 0; i < ECMULT_CONST_TABLE_SIZE; i++) {
secp256k1_ge_mul_lambda(&pre_a_lam[i], &pre_a[i]);
}
- /* first loop iteration (separated out so we can directly set r, rather
- * than having it start at infinity, get doubled several times, then have
- * its new value added to it) */
- i = wnaf_1[WNAF_SIZE_BITS(128, WINDOW_A - 1)];
- VERIFY_CHECK(i != 0);
- ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, i, WINDOW_A);
- secp256k1_gej_set_ge(r, &tmpa);
- i = wnaf_lam[WNAF_SIZE_BITS(128, WINDOW_A - 1)];
- VERIFY_CHECK(i != 0);
- ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, i, WINDOW_A);
- secp256k1_gej_add_ge(r, r, &tmpa);
- /* remaining loop iterations */
- for (i = WNAF_SIZE_BITS(128, WINDOW_A - 1) - 1; i >= 0; i--) {
- int n;
+ /* Next, we compute r = C_l(v1, A) + C_l(v2, lambda*A).
+ *
+ * We proceed in groups of ECMULT_CONST_GROUP_SIZE bits, operating on that many bits
+ * at a time, from high in v1, v2 to low. Call these bits1 (from v1) and bits2 (from v2).
+ *
+ * Now note that ECMULT_CONST_TABLE_GET_GE(&t, pre_a, bits1) loads into t a point equal
+ * to C_{ECMULT_CONST_GROUP_SIZE}(bits1, A), and analogously for pre_lam_a / bits2.
+ * This means that all we need to do is add these looked up values together, multiplied
+ * by 2^(ECMULT_GROUP_SIZE * group).
+ */
+ for (group = ECMULT_CONST_GROUPS - 1; group >= 0; --group) {
+ /* Using the _var get_bits function is ok here, since it's only variable in offset and count, not in the scalar. */
+ unsigned int bits1 = secp256k1_scalar_get_bits_var(&v1, group * ECMULT_CONST_GROUP_SIZE, ECMULT_CONST_GROUP_SIZE);
+ unsigned int bits2 = secp256k1_scalar_get_bits_var(&v2, group * ECMULT_CONST_GROUP_SIZE, ECMULT_CONST_GROUP_SIZE);
+ secp256k1_ge t;
int j;
- for (j = 0; j < WINDOW_A - 1; ++j) {
- secp256k1_gej_double(r, r);
- }
-
- n = wnaf_1[i];
- ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a, n, WINDOW_A);
- VERIFY_CHECK(n != 0);
- secp256k1_gej_add_ge(r, r, &tmpa);
- n = wnaf_lam[i];
- ECMULT_CONST_TABLE_GET_GE(&tmpa, pre_a_lam, n, WINDOW_A);
- VERIFY_CHECK(n != 0);
- secp256k1_gej_add_ge(r, r, &tmpa);
- }
-
- {
- /* Correct for wNAF skew */
- secp256k1_gej tmpj;
-
- secp256k1_ge_neg(&tmpa, &pre_a[0]);
- secp256k1_gej_add_ge(&tmpj, r, &tmpa);
- secp256k1_gej_cmov(r, &tmpj, skew_1);
- secp256k1_ge_neg(&tmpa, &pre_a_lam[0]);
- secp256k1_gej_add_ge(&tmpj, r, &tmpa);
- secp256k1_gej_cmov(r, &tmpj, skew_lam);
+ ECMULT_CONST_TABLE_GET_GE(&t, pre_a, bits1);
+ if (group == ECMULT_CONST_GROUPS - 1) {
+ /* Directly set r in the first iteration. */
+ secp256k1_gej_set_ge(r, &t);
+ } else {
+ /* Shift the result so far up. */
+ for (j = 0; j < ECMULT_CONST_GROUP_SIZE; ++j) {
+ secp256k1_gej_double(r, r);
+ }
+ secp256k1_gej_add_ge(r, r, &t);
+ }
+ ECMULT_CONST_TABLE_GET_GE(&t, pre_a_lam, bits2);
+ secp256k1_gej_add_ge(r, r, &t);
}
- secp256k1_fe_mul(&r->z, &r->z, &Z);
+ /* Map the result back to the secp256k1 curve from the isomorphic curve. */
+ secp256k1_fe_mul(&r->z, &r->z, &global_z);
}
static int secp256k1_ecmult_const_xonly(secp256k1_fe* r, const secp256k1_fe *n, const secp256k1_fe *d, const secp256k1_scalar *q, int known_on_curve) {
@@ -296,9 +347,7 @@ static int secp256k1_ecmult_const_xonly(secp256k1_fe* r, const secp256k1_fe *n,
secp256k1_fe_mul(&g, &g, n);
if (d) {
secp256k1_fe b;
-#ifdef VERIFY
VERIFY_CHECK(!secp256k1_fe_normalizes_to_zero(d));
-#endif
secp256k1_fe_sqr(&b, d);
VERIFY_CHECK(SECP256K1_B <= 8); /* magnitude of b will be <= 8 after the next call */
secp256k1_fe_mul_int(&b, SECP256K1_B);
@@ -331,13 +380,9 @@ static int secp256k1_ecmult_const_xonly(secp256k1_fe* r, const secp256k1_fe *n,
p.infinity = 0;
/* Perform x-only EC multiplication of P with q. */
-#ifdef VERIFY
VERIFY_CHECK(!secp256k1_scalar_is_zero(q));
-#endif
secp256k1_ecmult_const(&rj, &p, q);
-#ifdef VERIFY
VERIFY_CHECK(!secp256k1_gej_is_infinity(&rj));
-#endif
/* The resulting (X, Y, Z) point on the effective-affine isomorphic curve corresponds to
* (X, Y, Z*v) on the secp256k1 curve. The affine version of that has X coordinate
diff --git a/src/secp256k1/src/field.h b/src/secp256k1/src/field.h
index ccd228e1ae..bd589bf8a8 100644
--- a/src/secp256k1/src/field.h
+++ b/src/secp256k1/src/field.h
@@ -184,7 +184,8 @@ static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b);
*/
static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b);
-/** Set a field element equal to a provided 32-byte big endian value, reducing it.
+/** Set a field element equal to the element represented by a provided 32-byte big endian value
+ * interpreted modulo p.
*
* On input, r does not need to be initialized. a must be a pointer to an initialized 32-byte array.
* On output, r = a (mod p). It will have magnitude 1, and not be normalized.
@@ -345,8 +346,10 @@ static int secp256k1_fe_is_square_var(const secp256k1_fe *a);
/** Check invariants on a field element (no-op unless VERIFY is enabled). */
static void secp256k1_fe_verify(const secp256k1_fe *a);
+#define SECP256K1_FE_VERIFY(a) secp256k1_fe_verify(a)
/** Check that magnitude of a is at most m (no-op unless VERIFY is enabled). */
static void secp256k1_fe_verify_magnitude(const secp256k1_fe *a, int m);
+#define SECP256K1_FE_VERIFY_MAGNITUDE(a, m) secp256k1_fe_verify_magnitude(a, m)
#endif /* SECP256K1_FIELD_H */
diff --git a/src/secp256k1/src/field_10x26_impl.h b/src/secp256k1/src/field_10x26_impl.h
index 8445db1639..666068c712 100644
--- a/src/secp256k1/src/field_10x26_impl.h
+++ b/src/secp256k1/src/field_10x26_impl.h
@@ -403,11 +403,7 @@ void secp256k1_fe_sqr_inner(uint32_t *r, const uint32_t *a);
#else
-#ifdef VERIFY
#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0)
-#else
-#define VERIFY_BITS(x, n) do { } while(0)
-#endif
SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint32_t *r, const uint32_t *a, const uint32_t * SECP256K1_RESTRICT b) {
uint64_t c, d;
diff --git a/src/secp256k1/src/field_5x52_asm_impl.h b/src/secp256k1/src/field_5x52_asm_impl.h
deleted file mode 100644
index 04a9af2105..0000000000
--- a/src/secp256k1/src/field_5x52_asm_impl.h
+++ /dev/null
@@ -1,504 +0,0 @@
-/***********************************************************************
- * Copyright (c) 2013-2014 Diederik Huys, Pieter Wuille *
- * Distributed under the MIT software license, see the accompanying *
- * file COPYING or https://www.opensource.org/licenses/mit-license.php.*
- ***********************************************************************/
-
-/**
- * Changelog:
- * - March 2013, Diederik Huys: original version
- * - November 2014, Pieter Wuille: updated to use Peter Dettman's parallel multiplication algorithm
- * - December 2014, Pieter Wuille: converted from YASM to GCC inline assembly
- */
-
-#ifndef SECP256K1_FIELD_INNER5X52_IMPL_H
-#define SECP256K1_FIELD_INNER5X52_IMPL_H
-
-#include "util.h"
-
-SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) {
-/**
- * Registers: rdx:rax = multiplication accumulator
- * r9:r8 = c
- * r15:rcx = d
- * r10-r14 = a0-a4
- * rbx = b
- * rdi = r
- * rsi = a / t?
- */
- uint64_t tmp1, tmp2, tmp3;
-__asm__ __volatile__(
- "movq 0(%%rsi),%%r10\n"
- "movq 8(%%rsi),%%r11\n"
- "movq 16(%%rsi),%%r12\n"
- "movq 24(%%rsi),%%r13\n"
- "movq 32(%%rsi),%%r14\n"
-
- /* d += a3 * b0 */
- "movq 0(%%rbx),%%rax\n"
- "mulq %%r13\n"
- "movq %%rax,%%rcx\n"
- "movq %%rdx,%%r15\n"
- /* d += a2 * b1 */
- "movq 8(%%rbx),%%rax\n"
- "mulq %%r12\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += a1 * b2 */
- "movq 16(%%rbx),%%rax\n"
- "mulq %%r11\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d = a0 * b3 */
- "movq 24(%%rbx),%%rax\n"
- "mulq %%r10\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* c = a4 * b4 */
- "movq 32(%%rbx),%%rax\n"
- "mulq %%r14\n"
- "movq %%rax,%%r8\n"
- "movq %%rdx,%%r9\n"
- /* d += (c & M) * R */
- "movq $0xfffffffffffff,%%rdx\n"
- "andq %%rdx,%%rax\n"
- "movq $0x1000003d10,%%rdx\n"
- "mulq %%rdx\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* c >>= 52 (%%r8 only) */
- "shrdq $52,%%r9,%%r8\n"
- /* t3 (tmp1) = d & M */
- "movq %%rcx,%%rsi\n"
- "movq $0xfffffffffffff,%%rdx\n"
- "andq %%rdx,%%rsi\n"
- "movq %%rsi,%q1\n"
- /* d >>= 52 */
- "shrdq $52,%%r15,%%rcx\n"
- "xorq %%r15,%%r15\n"
- /* d += a4 * b0 */
- "movq 0(%%rbx),%%rax\n"
- "mulq %%r14\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += a3 * b1 */
- "movq 8(%%rbx),%%rax\n"
- "mulq %%r13\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += a2 * b2 */
- "movq 16(%%rbx),%%rax\n"
- "mulq %%r12\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += a1 * b3 */
- "movq 24(%%rbx),%%rax\n"
- "mulq %%r11\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += a0 * b4 */
- "movq 32(%%rbx),%%rax\n"
- "mulq %%r10\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += c * R */
- "movq %%r8,%%rax\n"
- "movq $0x1000003d10,%%rdx\n"
- "mulq %%rdx\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* t4 = d & M (%%rsi) */
- "movq %%rcx,%%rsi\n"
- "movq $0xfffffffffffff,%%rdx\n"
- "andq %%rdx,%%rsi\n"
- /* d >>= 52 */
- "shrdq $52,%%r15,%%rcx\n"
- "xorq %%r15,%%r15\n"
- /* tx = t4 >> 48 (tmp3) */
- "movq %%rsi,%%rax\n"
- "shrq $48,%%rax\n"
- "movq %%rax,%q3\n"
- /* t4 &= (M >> 4) (tmp2) */
- "movq $0xffffffffffff,%%rax\n"
- "andq %%rax,%%rsi\n"
- "movq %%rsi,%q2\n"
- /* c = a0 * b0 */
- "movq 0(%%rbx),%%rax\n"
- "mulq %%r10\n"
- "movq %%rax,%%r8\n"
- "movq %%rdx,%%r9\n"
- /* d += a4 * b1 */
- "movq 8(%%rbx),%%rax\n"
- "mulq %%r14\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += a3 * b2 */
- "movq 16(%%rbx),%%rax\n"
- "mulq %%r13\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += a2 * b3 */
- "movq 24(%%rbx),%%rax\n"
- "mulq %%r12\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += a1 * b4 */
- "movq 32(%%rbx),%%rax\n"
- "mulq %%r11\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* u0 = d & M (%%rsi) */
- "movq %%rcx,%%rsi\n"
- "movq $0xfffffffffffff,%%rdx\n"
- "andq %%rdx,%%rsi\n"
- /* d >>= 52 */
- "shrdq $52,%%r15,%%rcx\n"
- "xorq %%r15,%%r15\n"
- /* u0 = (u0 << 4) | tx (%%rsi) */
- "shlq $4,%%rsi\n"
- "movq %q3,%%rax\n"
- "orq %%rax,%%rsi\n"
- /* c += u0 * (R >> 4) */
- "movq $0x1000003d1,%%rax\n"
- "mulq %%rsi\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* r[0] = c & M */
- "movq %%r8,%%rax\n"
- "movq $0xfffffffffffff,%%rdx\n"
- "andq %%rdx,%%rax\n"
- "movq %%rax,0(%%rdi)\n"
- /* c >>= 52 */
- "shrdq $52,%%r9,%%r8\n"
- "xorq %%r9,%%r9\n"
- /* c += a1 * b0 */
- "movq 0(%%rbx),%%rax\n"
- "mulq %%r11\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* c += a0 * b1 */
- "movq 8(%%rbx),%%rax\n"
- "mulq %%r10\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* d += a4 * b2 */
- "movq 16(%%rbx),%%rax\n"
- "mulq %%r14\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += a3 * b3 */
- "movq 24(%%rbx),%%rax\n"
- "mulq %%r13\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += a2 * b4 */
- "movq 32(%%rbx),%%rax\n"
- "mulq %%r12\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* c += (d & M) * R */
- "movq %%rcx,%%rax\n"
- "movq $0xfffffffffffff,%%rdx\n"
- "andq %%rdx,%%rax\n"
- "movq $0x1000003d10,%%rdx\n"
- "mulq %%rdx\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* d >>= 52 */
- "shrdq $52,%%r15,%%rcx\n"
- "xorq %%r15,%%r15\n"
- /* r[1] = c & M */
- "movq %%r8,%%rax\n"
- "movq $0xfffffffffffff,%%rdx\n"
- "andq %%rdx,%%rax\n"
- "movq %%rax,8(%%rdi)\n"
- /* c >>= 52 */
- "shrdq $52,%%r9,%%r8\n"
- "xorq %%r9,%%r9\n"
- /* c += a2 * b0 */
- "movq 0(%%rbx),%%rax\n"
- "mulq %%r12\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* c += a1 * b1 */
- "movq 8(%%rbx),%%rax\n"
- "mulq %%r11\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* c += a0 * b2 (last use of %%r10 = a0) */
- "movq 16(%%rbx),%%rax\n"
- "mulq %%r10\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* fetch t3 (%%r10, overwrites a0), t4 (%%rsi) */
- "movq %q2,%%rsi\n"
- "movq %q1,%%r10\n"
- /* d += a4 * b3 */
- "movq 24(%%rbx),%%rax\n"
- "mulq %%r14\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* d += a3 * b4 */
- "movq 32(%%rbx),%%rax\n"
- "mulq %%r13\n"
- "addq %%rax,%%rcx\n"
- "adcq %%rdx,%%r15\n"
- /* c += (d & M) * R */
- "movq %%rcx,%%rax\n"
- "movq $0xfffffffffffff,%%rdx\n"
- "andq %%rdx,%%rax\n"
- "movq $0x1000003d10,%%rdx\n"
- "mulq %%rdx\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* d >>= 52 (%%rcx only) */
- "shrdq $52,%%r15,%%rcx\n"
- /* r[2] = c & M */
- "movq %%r8,%%rax\n"
- "movq $0xfffffffffffff,%%rdx\n"
- "andq %%rdx,%%rax\n"
- "movq %%rax,16(%%rdi)\n"
- /* c >>= 52 */
- "shrdq $52,%%r9,%%r8\n"
- "xorq %%r9,%%r9\n"
- /* c += t3 */
- "addq %%r10,%%r8\n"
- /* c += d * R */
- "movq %%rcx,%%rax\n"
- "movq $0x1000003d10,%%rdx\n"
- "mulq %%rdx\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* r[3] = c & M */
- "movq %%r8,%%rax\n"
- "movq $0xfffffffffffff,%%rdx\n"
- "andq %%rdx,%%rax\n"
- "movq %%rax,24(%%rdi)\n"
- /* c >>= 52 (%%r8 only) */
- "shrdq $52,%%r9,%%r8\n"
- /* c += t4 (%%r8 only) */
- "addq %%rsi,%%r8\n"
- /* r[4] = c */
- "movq %%r8,32(%%rdi)\n"
-: "+S"(a), "=&m"(tmp1), "=&m"(tmp2), "=&m"(tmp3)
-: "b"(b), "D"(r)
-: "%rax", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory"
-);
-}
-
-SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) {
-/**
- * Registers: rdx:rax = multiplication accumulator
- * r9:r8 = c
- * rcx:rbx = d
- * r10-r14 = a0-a4
- * r15 = M (0xfffffffffffff)
- * rdi = r
- * rsi = a / t?
- */
- uint64_t tmp1, tmp2, tmp3;
-__asm__ __volatile__(
- "movq 0(%%rsi),%%r10\n"
- "movq 8(%%rsi),%%r11\n"
- "movq 16(%%rsi),%%r12\n"
- "movq 24(%%rsi),%%r13\n"
- "movq 32(%%rsi),%%r14\n"
- "movq $0xfffffffffffff,%%r15\n"
-
- /* d = (a0*2) * a3 */
- "leaq (%%r10,%%r10,1),%%rax\n"
- "mulq %%r13\n"
- "movq %%rax,%%rbx\n"
- "movq %%rdx,%%rcx\n"
- /* d += (a1*2) * a2 */
- "leaq (%%r11,%%r11,1),%%rax\n"
- "mulq %%r12\n"
- "addq %%rax,%%rbx\n"
- "adcq %%rdx,%%rcx\n"
- /* c = a4 * a4 */
- "movq %%r14,%%rax\n"
- "mulq %%r14\n"
- "movq %%rax,%%r8\n"
- "movq %%rdx,%%r9\n"
- /* d += (c & M) * R */
- "andq %%r15,%%rax\n"
- "movq $0x1000003d10,%%rdx\n"
- "mulq %%rdx\n"
- "addq %%rax,%%rbx\n"
- "adcq %%rdx,%%rcx\n"
- /* c >>= 52 (%%r8 only) */
- "shrdq $52,%%r9,%%r8\n"
- /* t3 (tmp1) = d & M */
- "movq %%rbx,%%rsi\n"
- "andq %%r15,%%rsi\n"
- "movq %%rsi,%q1\n"
- /* d >>= 52 */
- "shrdq $52,%%rcx,%%rbx\n"
- "xorq %%rcx,%%rcx\n"
- /* a4 *= 2 */
- "addq %%r14,%%r14\n"
- /* d += a0 * a4 */
- "movq %%r10,%%rax\n"
- "mulq %%r14\n"
- "addq %%rax,%%rbx\n"
- "adcq %%rdx,%%rcx\n"
- /* d+= (a1*2) * a3 */
- "leaq (%%r11,%%r11,1),%%rax\n"
- "mulq %%r13\n"
- "addq %%rax,%%rbx\n"
- "adcq %%rdx,%%rcx\n"
- /* d += a2 * a2 */
- "movq %%r12,%%rax\n"
- "mulq %%r12\n"
- "addq %%rax,%%rbx\n"
- "adcq %%rdx,%%rcx\n"
- /* d += c * R */
- "movq %%r8,%%rax\n"
- "movq $0x1000003d10,%%rdx\n"
- "mulq %%rdx\n"
- "addq %%rax,%%rbx\n"
- "adcq %%rdx,%%rcx\n"
- /* t4 = d & M (%%rsi) */
- "movq %%rbx,%%rsi\n"
- "andq %%r15,%%rsi\n"
- /* d >>= 52 */
- "shrdq $52,%%rcx,%%rbx\n"
- "xorq %%rcx,%%rcx\n"
- /* tx = t4 >> 48 (tmp3) */
- "movq %%rsi,%%rax\n"
- "shrq $48,%%rax\n"
- "movq %%rax,%q3\n"
- /* t4 &= (M >> 4) (tmp2) */
- "movq $0xffffffffffff,%%rax\n"
- "andq %%rax,%%rsi\n"
- "movq %%rsi,%q2\n"
- /* c = a0 * a0 */
- "movq %%r10,%%rax\n"
- "mulq %%r10\n"
- "movq %%rax,%%r8\n"
- "movq %%rdx,%%r9\n"
- /* d += a1 * a4 */
- "movq %%r11,%%rax\n"
- "mulq %%r14\n"
- "addq %%rax,%%rbx\n"
- "adcq %%rdx,%%rcx\n"
- /* d += (a2*2) * a3 */
- "leaq (%%r12,%%r12,1),%%rax\n"
- "mulq %%r13\n"
- "addq %%rax,%%rbx\n"
- "adcq %%rdx,%%rcx\n"
- /* u0 = d & M (%%rsi) */
- "movq %%rbx,%%rsi\n"
- "andq %%r15,%%rsi\n"
- /* d >>= 52 */
- "shrdq $52,%%rcx,%%rbx\n"
- "xorq %%rcx,%%rcx\n"
- /* u0 = (u0 << 4) | tx (%%rsi) */
- "shlq $4,%%rsi\n"
- "movq %q3,%%rax\n"
- "orq %%rax,%%rsi\n"
- /* c += u0 * (R >> 4) */
- "movq $0x1000003d1,%%rax\n"
- "mulq %%rsi\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* r[0] = c & M */
- "movq %%r8,%%rax\n"
- "andq %%r15,%%rax\n"
- "movq %%rax,0(%%rdi)\n"
- /* c >>= 52 */
- "shrdq $52,%%r9,%%r8\n"
- "xorq %%r9,%%r9\n"
- /* a0 *= 2 */
- "addq %%r10,%%r10\n"
- /* c += a0 * a1 */
- "movq %%r10,%%rax\n"
- "mulq %%r11\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* d += a2 * a4 */
- "movq %%r12,%%rax\n"
- "mulq %%r14\n"
- "addq %%rax,%%rbx\n"
- "adcq %%rdx,%%rcx\n"
- /* d += a3 * a3 */
- "movq %%r13,%%rax\n"
- "mulq %%r13\n"
- "addq %%rax,%%rbx\n"
- "adcq %%rdx,%%rcx\n"
- /* c += (d & M) * R */
- "movq %%rbx,%%rax\n"
- "andq %%r15,%%rax\n"
- "movq $0x1000003d10,%%rdx\n"
- "mulq %%rdx\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* d >>= 52 */
- "shrdq $52,%%rcx,%%rbx\n"
- "xorq %%rcx,%%rcx\n"
- /* r[1] = c & M */
- "movq %%r8,%%rax\n"
- "andq %%r15,%%rax\n"
- "movq %%rax,8(%%rdi)\n"
- /* c >>= 52 */
- "shrdq $52,%%r9,%%r8\n"
- "xorq %%r9,%%r9\n"
- /* c += a0 * a2 (last use of %%r10) */
- "movq %%r10,%%rax\n"
- "mulq %%r12\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* fetch t3 (%%r10, overwrites a0),t4 (%%rsi) */
- "movq %q2,%%rsi\n"
- "movq %q1,%%r10\n"
- /* c += a1 * a1 */
- "movq %%r11,%%rax\n"
- "mulq %%r11\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* d += a3 * a4 */
- "movq %%r13,%%rax\n"
- "mulq %%r14\n"
- "addq %%rax,%%rbx\n"
- "adcq %%rdx,%%rcx\n"
- /* c += (d & M) * R */
- "movq %%rbx,%%rax\n"
- "andq %%r15,%%rax\n"
- "movq $0x1000003d10,%%rdx\n"
- "mulq %%rdx\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* d >>= 52 (%%rbx only) */
- "shrdq $52,%%rcx,%%rbx\n"
- /* r[2] = c & M */
- "movq %%r8,%%rax\n"
- "andq %%r15,%%rax\n"
- "movq %%rax,16(%%rdi)\n"
- /* c >>= 52 */
- "shrdq $52,%%r9,%%r8\n"
- "xorq %%r9,%%r9\n"
- /* c += t3 */
- "addq %%r10,%%r8\n"
- /* c += d * R */
- "movq %%rbx,%%rax\n"
- "movq $0x1000003d10,%%rdx\n"
- "mulq %%rdx\n"
- "addq %%rax,%%r8\n"
- "adcq %%rdx,%%r9\n"
- /* r[3] = c & M */
- "movq %%r8,%%rax\n"
- "andq %%r15,%%rax\n"
- "movq %%rax,24(%%rdi)\n"
- /* c >>= 52 (%%r8 only) */
- "shrdq $52,%%r9,%%r8\n"
- /* c += t4 (%%r8 only) */
- "addq %%rsi,%%r8\n"
- /* r[4] = c */
- "movq %%r8,32(%%rdi)\n"
-: "+S"(a), "=&m"(tmp1), "=&m"(tmp2), "=&m"(tmp3)
-: "D"(r)
-: "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "cc", "memory"
-);
-}
-
-#endif /* SECP256K1_FIELD_INNER5X52_IMPL_H */
diff --git a/src/secp256k1/src/field_5x52_impl.h b/src/secp256k1/src/field_5x52_impl.h
index ecb70502c2..76031f755e 100644
--- a/src/secp256k1/src/field_5x52_impl.h
+++ b/src/secp256k1/src/field_5x52_impl.h
@@ -12,11 +12,7 @@
#include "field.h"
#include "modinv64_impl.h"
-#if defined(USE_ASM_X86_64)
-#include "field_5x52_asm_impl.h"
-#else
#include "field_5x52_int128_impl.h"
-#endif
#ifdef VERIFY
static void secp256k1_fe_impl_verify(const secp256k1_fe *a) {
diff --git a/src/secp256k1/src/field_5x52_int128_impl.h b/src/secp256k1/src/field_5x52_int128_impl.h
index b2a391dec9..f23f8ee1c4 100644
--- a/src/secp256k1/src/field_5x52_int128_impl.h
+++ b/src/secp256k1/src/field_5x52_int128_impl.h
@@ -12,13 +12,8 @@
#include "int128.h"
#include "util.h"
-#ifdef VERIFY
#define VERIFY_BITS(x, n) VERIFY_CHECK(((x) >> (n)) == 0)
#define VERIFY_BITS_128(x, n) VERIFY_CHECK(secp256k1_u128_check_bits((x), (n)))
-#else
-#define VERIFY_BITS(x, n) do { } while(0)
-#define VERIFY_BITS_128(x, n) do { } while(0)
-#endif
SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t *a, const uint64_t * SECP256K1_RESTRICT b) {
secp256k1_uint128 c, d;
@@ -89,18 +84,18 @@ SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t
secp256k1_u128_accum_mul(&d, a2, b[3]);
secp256k1_u128_accum_mul(&d, a3, b[2]);
secp256k1_u128_accum_mul(&d, a4, b[1]);
- VERIFY_BITS_128(&d, 115);
+ VERIFY_BITS_128(&d, 114);
/* [d t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */
u0 = secp256k1_u128_to_u64(&d) & M; secp256k1_u128_rshift(&d, 52);
VERIFY_BITS(u0, 52);
- VERIFY_BITS_128(&d, 63);
+ VERIFY_BITS_128(&d, 62);
/* [d u0 t4+(tx<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */
/* [d 0 t4+(tx<<48)+(u0<<52) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */
u0 = (u0 << 4) | tx;
VERIFY_BITS(u0, 56);
/* [d 0 t4+(u0<<48) t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */
secp256k1_u128_accum_mul(&c, u0, R >> 4);
- VERIFY_BITS_128(&c, 115);
+ VERIFY_BITS_128(&c, 113);
/* [d 0 t4 t3 0 0 c] = [p8 0 0 p5 p4 p3 0 0 p0] */
r[0] = secp256k1_u128_to_u64(&c) & M; secp256k1_u128_rshift(&c, 52);
VERIFY_BITS(r[0], 52);
@@ -159,7 +154,7 @@ SECP256K1_INLINE static void secp256k1_fe_mul_inner(uint64_t *r, const uint64_t
SECP256K1_INLINE static void secp256k1_fe_sqr_inner(uint64_t *r, const uint64_t *a) {
secp256k1_uint128 c, d;
uint64_t a0 = a[0], a1 = a[1], a2 = a[2], a3 = a[3], a4 = a[4];
- int64_t t3, t4, tx, u0;
+ uint64_t t3, t4, tx, u0;
const uint64_t M = 0xFFFFFFFFFFFFFULL, R = 0x1000003D10ULL;
VERIFY_BITS(a[0], 56);
diff --git a/src/secp256k1/src/field_impl.h b/src/secp256k1/src/field_impl.h
index 80d34b9ef2..989e9cdb2f 100644
--- a/src/secp256k1/src/field_impl.h
+++ b/src/secp256k1/src/field_impl.h
@@ -20,12 +20,11 @@
SECP256K1_INLINE static int secp256k1_fe_equal(const secp256k1_fe *a, const secp256k1_fe *b) {
secp256k1_fe na;
-#ifdef VERIFY
- secp256k1_fe_verify(a);
- secp256k1_fe_verify(b);
- secp256k1_fe_verify_magnitude(a, 1);
- secp256k1_fe_verify_magnitude(b, 31);
-#endif
+ SECP256K1_FE_VERIFY(a);
+ SECP256K1_FE_VERIFY(b);
+ SECP256K1_FE_VERIFY_MAGNITUDE(a, 1);
+ SECP256K1_FE_VERIFY_MAGNITUDE(b, 31);
+
secp256k1_fe_negate(&na, a, 1);
secp256k1_fe_add(&na, b);
return secp256k1_fe_normalizes_to_zero(&na);
@@ -44,11 +43,9 @@ static int secp256k1_fe_sqrt(secp256k1_fe * SECP256K1_RESTRICT r, const secp256k
secp256k1_fe x2, x3, x6, x9, x11, x22, x44, x88, x176, x220, x223, t1;
int j, ret;
-#ifdef VERIFY
VERIFY_CHECK(r != a);
- secp256k1_fe_verify(a);
- secp256k1_fe_verify_magnitude(a, 8);
-#endif
+ SECP256K1_FE_VERIFY(a);
+ SECP256K1_FE_VERIFY_MAGNITUDE(a, 8);
/** The binary representation of (p + 1)/4 has 3 blocks of 1s, with lengths in
* { 2, 22, 223 }. Use an addition chain to calculate 2^n - 1 for each block:
@@ -151,11 +148,11 @@ static void secp256k1_fe_verify_magnitude(const secp256k1_fe *a, int m) { (void)
static void secp256k1_fe_impl_verify(const secp256k1_fe *a);
static void secp256k1_fe_verify(const secp256k1_fe *a) {
/* Magnitude between 0 and 32. */
- secp256k1_fe_verify_magnitude(a, 32);
+ SECP256K1_FE_VERIFY_MAGNITUDE(a, 32);
/* Normalized is 0 or 1. */
VERIFY_CHECK((a->normalized == 0) || (a->normalized == 1));
/* If normalized, magnitude must be 0 or 1. */
- if (a->normalized) secp256k1_fe_verify_magnitude(a, 1);
+ if (a->normalized) SECP256K1_FE_VERIFY_MAGNITUDE(a, 1);
/* Invoke implementation-specific checks. */
secp256k1_fe_impl_verify(a);
}
@@ -168,59 +165,71 @@ static void secp256k1_fe_verify_magnitude(const secp256k1_fe *a, int m) {
static void secp256k1_fe_impl_normalize(secp256k1_fe *r);
SECP256K1_INLINE static void secp256k1_fe_normalize(secp256k1_fe *r) {
- secp256k1_fe_verify(r);
+ SECP256K1_FE_VERIFY(r);
+
secp256k1_fe_impl_normalize(r);
r->magnitude = 1;
r->normalized = 1;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_normalize_weak(secp256k1_fe *r);
SECP256K1_INLINE static void secp256k1_fe_normalize_weak(secp256k1_fe *r) {
- secp256k1_fe_verify(r);
+ SECP256K1_FE_VERIFY(r);
+
secp256k1_fe_impl_normalize_weak(r);
r->magnitude = 1;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_normalize_var(secp256k1_fe *r);
SECP256K1_INLINE static void secp256k1_fe_normalize_var(secp256k1_fe *r) {
- secp256k1_fe_verify(r);
+ SECP256K1_FE_VERIFY(r);
+
secp256k1_fe_impl_normalize_var(r);
r->magnitude = 1;
r->normalized = 1;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static int secp256k1_fe_impl_normalizes_to_zero(const secp256k1_fe *r);
SECP256K1_INLINE static int secp256k1_fe_normalizes_to_zero(const secp256k1_fe *r) {
- secp256k1_fe_verify(r);
+ SECP256K1_FE_VERIFY(r);
+
return secp256k1_fe_impl_normalizes_to_zero(r);
}
static int secp256k1_fe_impl_normalizes_to_zero_var(const secp256k1_fe *r);
SECP256K1_INLINE static int secp256k1_fe_normalizes_to_zero_var(const secp256k1_fe *r) {
- secp256k1_fe_verify(r);
+ SECP256K1_FE_VERIFY(r);
+
return secp256k1_fe_impl_normalizes_to_zero_var(r);
}
static void secp256k1_fe_impl_set_int(secp256k1_fe *r, int a);
SECP256K1_INLINE static void secp256k1_fe_set_int(secp256k1_fe *r, int a) {
VERIFY_CHECK(0 <= a && a <= 0x7FFF);
+
secp256k1_fe_impl_set_int(r, a);
r->magnitude = (a != 0);
r->normalized = 1;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_add_int(secp256k1_fe *r, int a);
SECP256K1_INLINE static void secp256k1_fe_add_int(secp256k1_fe *r, int a) {
VERIFY_CHECK(0 <= a && a <= 0x7FFF);
- secp256k1_fe_verify(r);
+ SECP256K1_FE_VERIFY(r);
+
secp256k1_fe_impl_add_int(r, a);
r->magnitude += 1;
r->normalized = 0;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_clear(secp256k1_fe *a);
@@ -228,29 +237,33 @@ SECP256K1_INLINE static void secp256k1_fe_clear(secp256k1_fe *a) {
a->magnitude = 0;
a->normalized = 1;
secp256k1_fe_impl_clear(a);
- secp256k1_fe_verify(a);
+
+ SECP256K1_FE_VERIFY(a);
}
static int secp256k1_fe_impl_is_zero(const secp256k1_fe *a);
SECP256K1_INLINE static int secp256k1_fe_is_zero(const secp256k1_fe *a) {
- secp256k1_fe_verify(a);
+ SECP256K1_FE_VERIFY(a);
VERIFY_CHECK(a->normalized);
+
return secp256k1_fe_impl_is_zero(a);
}
static int secp256k1_fe_impl_is_odd(const secp256k1_fe *a);
SECP256K1_INLINE static int secp256k1_fe_is_odd(const secp256k1_fe *a) {
- secp256k1_fe_verify(a);
+ SECP256K1_FE_VERIFY(a);
VERIFY_CHECK(a->normalized);
+
return secp256k1_fe_impl_is_odd(a);
}
static int secp256k1_fe_impl_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b);
SECP256K1_INLINE static int secp256k1_fe_cmp_var(const secp256k1_fe *a, const secp256k1_fe *b) {
- secp256k1_fe_verify(a);
- secp256k1_fe_verify(b);
+ SECP256K1_FE_VERIFY(a);
+ SECP256K1_FE_VERIFY(b);
VERIFY_CHECK(a->normalized);
VERIFY_CHECK(b->normalized);
+
return secp256k1_fe_impl_cmp_var(a, b);
}
@@ -259,7 +272,8 @@ SECP256K1_INLINE static void secp256k1_fe_set_b32_mod(secp256k1_fe *r, const uns
secp256k1_fe_impl_set_b32_mod(r, a);
r->magnitude = 1;
r->normalized = 0;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static int secp256k1_fe_impl_set_b32_limit(secp256k1_fe *r, const unsigned char *a);
@@ -267,7 +281,7 @@ SECP256K1_INLINE static int secp256k1_fe_set_b32_limit(secp256k1_fe *r, const un
if (secp256k1_fe_impl_set_b32_limit(r, a)) {
r->magnitude = 1;
r->normalized = 1;
- secp256k1_fe_verify(r);
+ SECP256K1_FE_VERIFY(r);
return 1;
} else {
/* Mark the output field element as invalid. */
@@ -278,83 +292,97 @@ SECP256K1_INLINE static int secp256k1_fe_set_b32_limit(secp256k1_fe *r, const un
static void secp256k1_fe_impl_get_b32(unsigned char *r, const secp256k1_fe *a);
SECP256K1_INLINE static void secp256k1_fe_get_b32(unsigned char *r, const secp256k1_fe *a) {
- secp256k1_fe_verify(a);
+ SECP256K1_FE_VERIFY(a);
VERIFY_CHECK(a->normalized);
+
secp256k1_fe_impl_get_b32(r, a);
}
static void secp256k1_fe_impl_negate_unchecked(secp256k1_fe *r, const secp256k1_fe *a, int m);
SECP256K1_INLINE static void secp256k1_fe_negate_unchecked(secp256k1_fe *r, const secp256k1_fe *a, int m) {
- secp256k1_fe_verify(a);
+ SECP256K1_FE_VERIFY(a);
VERIFY_CHECK(m >= 0 && m <= 31);
- secp256k1_fe_verify_magnitude(a, m);
+ SECP256K1_FE_VERIFY_MAGNITUDE(a, m);
+
secp256k1_fe_impl_negate_unchecked(r, a, m);
r->magnitude = m + 1;
r->normalized = 0;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_mul_int_unchecked(secp256k1_fe *r, int a);
SECP256K1_INLINE static void secp256k1_fe_mul_int_unchecked(secp256k1_fe *r, int a) {
- secp256k1_fe_verify(r);
+ SECP256K1_FE_VERIFY(r);
+
VERIFY_CHECK(a >= 0 && a <= 32);
VERIFY_CHECK(a*r->magnitude <= 32);
secp256k1_fe_impl_mul_int_unchecked(r, a);
r->magnitude *= a;
r->normalized = 0;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_add(secp256k1_fe *r, const secp256k1_fe *a);
SECP256K1_INLINE static void secp256k1_fe_add(secp256k1_fe *r, const secp256k1_fe *a) {
- secp256k1_fe_verify(r);
- secp256k1_fe_verify(a);
+ SECP256K1_FE_VERIFY(r);
+ SECP256K1_FE_VERIFY(a);
VERIFY_CHECK(r->magnitude + a->magnitude <= 32);
+
secp256k1_fe_impl_add(r, a);
r->magnitude += a->magnitude;
r->normalized = 0;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b);
SECP256K1_INLINE static void secp256k1_fe_mul(secp256k1_fe *r, const secp256k1_fe *a, const secp256k1_fe * SECP256K1_RESTRICT b) {
- secp256k1_fe_verify(a);
- secp256k1_fe_verify(b);
- secp256k1_fe_verify_magnitude(a, 8);
- secp256k1_fe_verify_magnitude(b, 8);
+ SECP256K1_FE_VERIFY(a);
+ SECP256K1_FE_VERIFY(b);
+ SECP256K1_FE_VERIFY_MAGNITUDE(a, 8);
+ SECP256K1_FE_VERIFY_MAGNITUDE(b, 8);
VERIFY_CHECK(r != b);
VERIFY_CHECK(a != b);
+
secp256k1_fe_impl_mul(r, a, b);
r->magnitude = 1;
r->normalized = 0;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_sqr(secp256k1_fe *r, const secp256k1_fe *a);
SECP256K1_INLINE static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) {
- secp256k1_fe_verify(a);
- secp256k1_fe_verify_magnitude(a, 8);
+ SECP256K1_FE_VERIFY(a);
+ SECP256K1_FE_VERIFY_MAGNITUDE(a, 8);
+
secp256k1_fe_impl_sqr(r, a);
r->magnitude = 1;
r->normalized = 0;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag);
SECP256K1_INLINE static void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_fe *a, int flag) {
VERIFY_CHECK(flag == 0 || flag == 1);
- secp256k1_fe_verify(a);
- secp256k1_fe_verify(r);
+ SECP256K1_FE_VERIFY(a);
+ SECP256K1_FE_VERIFY(r);
+
secp256k1_fe_impl_cmov(r, a, flag);
if (a->magnitude > r->magnitude) r->magnitude = a->magnitude;
if (!a->normalized) r->normalized = 0;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a);
SECP256K1_INLINE static void secp256k1_fe_to_storage(secp256k1_fe_storage *r, const secp256k1_fe *a) {
- secp256k1_fe_verify(a);
+ SECP256K1_FE_VERIFY(a);
VERIFY_CHECK(a->normalized);
+
secp256k1_fe_impl_to_storage(r, a);
}
@@ -363,36 +391,42 @@ SECP256K1_INLINE static void secp256k1_fe_from_storage(secp256k1_fe *r, const se
secp256k1_fe_impl_from_storage(r, a);
r->magnitude = 1;
r->normalized = 1;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_inv(secp256k1_fe *r, const secp256k1_fe *x);
SECP256K1_INLINE static void secp256k1_fe_inv(secp256k1_fe *r, const secp256k1_fe *x) {
int input_is_zero = secp256k1_fe_normalizes_to_zero(x);
- secp256k1_fe_verify(x);
+ SECP256K1_FE_VERIFY(x);
+
secp256k1_fe_impl_inv(r, x);
r->magnitude = x->magnitude > 0;
r->normalized = 1;
+
VERIFY_CHECK(secp256k1_fe_normalizes_to_zero(r) == input_is_zero);
- secp256k1_fe_verify(r);
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_inv_var(secp256k1_fe *r, const secp256k1_fe *x);
SECP256K1_INLINE static void secp256k1_fe_inv_var(secp256k1_fe *r, const secp256k1_fe *x) {
int input_is_zero = secp256k1_fe_normalizes_to_zero(x);
- secp256k1_fe_verify(x);
+ SECP256K1_FE_VERIFY(x);
+
secp256k1_fe_impl_inv_var(r, x);
r->magnitude = x->magnitude > 0;
r->normalized = 1;
+
VERIFY_CHECK(secp256k1_fe_normalizes_to_zero(r) == input_is_zero);
- secp256k1_fe_verify(r);
+ SECP256K1_FE_VERIFY(r);
}
static int secp256k1_fe_impl_is_square_var(const secp256k1_fe *x);
SECP256K1_INLINE static int secp256k1_fe_is_square_var(const secp256k1_fe *x) {
int ret;
secp256k1_fe tmp = *x, sqrt;
- secp256k1_fe_verify(x);
+ SECP256K1_FE_VERIFY(x);
+
ret = secp256k1_fe_impl_is_square_var(x);
secp256k1_fe_normalize_weak(&tmp);
VERIFY_CHECK(ret == secp256k1_fe_sqrt(&sqrt, &tmp));
@@ -403,20 +437,24 @@ static void secp256k1_fe_impl_get_bounds(secp256k1_fe* r, int m);
SECP256K1_INLINE static void secp256k1_fe_get_bounds(secp256k1_fe* r, int m) {
VERIFY_CHECK(m >= 0);
VERIFY_CHECK(m <= 32);
+
secp256k1_fe_impl_get_bounds(r, m);
r->magnitude = m;
r->normalized = (m == 0);
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
static void secp256k1_fe_impl_half(secp256k1_fe *r);
SECP256K1_INLINE static void secp256k1_fe_half(secp256k1_fe *r) {
- secp256k1_fe_verify(r);
- secp256k1_fe_verify_magnitude(r, 31);
+ SECP256K1_FE_VERIFY(r);
+ SECP256K1_FE_VERIFY_MAGNITUDE(r, 31);
+
secp256k1_fe_impl_half(r);
r->magnitude = (r->magnitude >> 1) + 1;
r->normalized = 0;
- secp256k1_fe_verify(r);
+
+ SECP256K1_FE_VERIFY(r);
}
#endif /* defined(VERIFY) */
diff --git a/src/secp256k1/src/group.h b/src/secp256k1/src/group.h
index 86eb9e1f82..d81deb4264 100644
--- a/src/secp256k1/src/group.h
+++ b/src/secp256k1/src/group.h
@@ -102,6 +102,9 @@ static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a
*/
static void secp256k1_ge_table_set_globalz(size_t len, secp256k1_ge *a, const secp256k1_fe *zr);
+/** Check two group elements (affine) for equality in variable time. */
+static int secp256k1_ge_eq_var(const secp256k1_ge *a, const secp256k1_ge *b);
+
/** Set a group element (affine) equal to the point at infinity. */
static void secp256k1_ge_set_infinity(secp256k1_ge *r);
@@ -114,6 +117,9 @@ static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a);
/** Check two group elements (jacobian) for equality in variable time. */
static int secp256k1_gej_eq_var(const secp256k1_gej *a, const secp256k1_gej *b);
+/** Check two group elements (jacobian and affine) for equality in variable time. */
+static int secp256k1_gej_eq_ge_var(const secp256k1_gej *a, const secp256k1_ge *b);
+
/** Compare the X coordinate of a group element (jacobian).
* The magnitude of the group element's X coordinate must not exceed 31. */
static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a);
@@ -181,8 +187,10 @@ static int secp256k1_ge_is_in_correct_subgroup(const secp256k1_ge* ge);
/** Check invariants on an affine group element (no-op unless VERIFY is enabled). */
static void secp256k1_ge_verify(const secp256k1_ge *a);
+#define SECP256K1_GE_VERIFY(a) secp256k1_ge_verify(a)
/** Check invariants on a Jacobian group element (no-op unless VERIFY is enabled). */
static void secp256k1_gej_verify(const secp256k1_gej *a);
+#define SECP256K1_GEJ_VERIFY(a) secp256k1_gej_verify(a)
#endif /* SECP256K1_GROUP_H */
diff --git a/src/secp256k1/src/group_impl.h b/src/secp256k1/src/group_impl.h
index b9542ce8ae..537be32ff6 100644
--- a/src/secp256k1/src/group_impl.h
+++ b/src/secp256k1/src/group_impl.h
@@ -74,26 +74,22 @@ static const secp256k1_ge secp256k1_ge_const_g = SECP256K1_G;
/* End of section generated by sage/gen_exhaustive_groups.sage. */
static void secp256k1_ge_verify(const secp256k1_ge *a) {
-#ifdef VERIFY
- secp256k1_fe_verify(&a->x);
- secp256k1_fe_verify(&a->y);
- secp256k1_fe_verify_magnitude(&a->x, SECP256K1_GE_X_MAGNITUDE_MAX);
- secp256k1_fe_verify_magnitude(&a->y, SECP256K1_GE_Y_MAGNITUDE_MAX);
+ SECP256K1_FE_VERIFY(&a->x);
+ SECP256K1_FE_VERIFY(&a->y);
+ SECP256K1_FE_VERIFY_MAGNITUDE(&a->x, SECP256K1_GE_X_MAGNITUDE_MAX);
+ SECP256K1_FE_VERIFY_MAGNITUDE(&a->y, SECP256K1_GE_Y_MAGNITUDE_MAX);
VERIFY_CHECK(a->infinity == 0 || a->infinity == 1);
-#endif
(void)a;
}
static void secp256k1_gej_verify(const secp256k1_gej *a) {
-#ifdef VERIFY
- secp256k1_fe_verify(&a->x);
- secp256k1_fe_verify(&a->y);
- secp256k1_fe_verify(&a->z);
- secp256k1_fe_verify_magnitude(&a->x, SECP256K1_GEJ_X_MAGNITUDE_MAX);
- secp256k1_fe_verify_magnitude(&a->y, SECP256K1_GEJ_Y_MAGNITUDE_MAX);
- secp256k1_fe_verify_magnitude(&a->z, SECP256K1_GEJ_Z_MAGNITUDE_MAX);
+ SECP256K1_FE_VERIFY(&a->x);
+ SECP256K1_FE_VERIFY(&a->y);
+ SECP256K1_FE_VERIFY(&a->z);
+ SECP256K1_FE_VERIFY_MAGNITUDE(&a->x, SECP256K1_GEJ_X_MAGNITUDE_MAX);
+ SECP256K1_FE_VERIFY_MAGNITUDE(&a->y, SECP256K1_GEJ_Y_MAGNITUDE_MAX);
+ SECP256K1_FE_VERIFY_MAGNITUDE(&a->z, SECP256K1_GEJ_Z_MAGNITUDE_MAX);
VERIFY_CHECK(a->infinity == 0 || a->infinity == 1);
-#endif
(void)a;
}
@@ -101,8 +97,8 @@ static void secp256k1_gej_verify(const secp256k1_gej *a) {
static void secp256k1_ge_set_gej_zinv(secp256k1_ge *r, const secp256k1_gej *a, const secp256k1_fe *zi) {
secp256k1_fe zi2;
secp256k1_fe zi3;
- secp256k1_gej_verify(a);
- secp256k1_fe_verify(zi);
+ SECP256K1_GEJ_VERIFY(a);
+ SECP256K1_FE_VERIFY(zi);
VERIFY_CHECK(!a->infinity);
secp256k1_fe_sqr(&zi2, zi);
@@ -111,15 +107,15 @@ static void secp256k1_ge_set_gej_zinv(secp256k1_ge *r, const secp256k1_gej *a, c
secp256k1_fe_mul(&r->y, &a->y, &zi3);
r->infinity = a->infinity;
- secp256k1_ge_verify(r);
+ SECP256K1_GE_VERIFY(r);
}
/* Set r to the affine coordinates of Jacobian point (a.x, a.y, 1/zi). */
static void secp256k1_ge_set_ge_zinv(secp256k1_ge *r, const secp256k1_ge *a, const secp256k1_fe *zi) {
secp256k1_fe zi2;
secp256k1_fe zi3;
- secp256k1_ge_verify(a);
- secp256k1_fe_verify(zi);
+ SECP256K1_GE_VERIFY(a);
+ SECP256K1_FE_VERIFY(zi);
VERIFY_CHECK(!a->infinity);
secp256k1_fe_sqr(&zi2, zi);
@@ -128,39 +124,39 @@ static void secp256k1_ge_set_ge_zinv(secp256k1_ge *r, const secp256k1_ge *a, con
secp256k1_fe_mul(&r->y, &a->y, &zi3);
r->infinity = a->infinity;
- secp256k1_ge_verify(r);
+ SECP256K1_GE_VERIFY(r);
}
static void secp256k1_ge_set_xy(secp256k1_ge *r, const secp256k1_fe *x, const secp256k1_fe *y) {
- secp256k1_fe_verify(x);
- secp256k1_fe_verify(y);
+ SECP256K1_FE_VERIFY(x);
+ SECP256K1_FE_VERIFY(y);
r->infinity = 0;
r->x = *x;
r->y = *y;
- secp256k1_ge_verify(r);
+ SECP256K1_GE_VERIFY(r);
}
static int secp256k1_ge_is_infinity(const secp256k1_ge *a) {
- secp256k1_ge_verify(a);
+ SECP256K1_GE_VERIFY(a);
return a->infinity;
}
static void secp256k1_ge_neg(secp256k1_ge *r, const secp256k1_ge *a) {
- secp256k1_ge_verify(a);
+ SECP256K1_GE_VERIFY(a);
*r = *a;
secp256k1_fe_normalize_weak(&r->y);
secp256k1_fe_negate(&r->y, &r->y, 1);
- secp256k1_ge_verify(r);
+ SECP256K1_GE_VERIFY(r);
}
static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a) {
secp256k1_fe z2, z3;
- secp256k1_gej_verify(a);
+ SECP256K1_GEJ_VERIFY(a);
r->infinity = a->infinity;
secp256k1_fe_inv(&a->z, &a->z);
@@ -172,13 +168,13 @@ static void secp256k1_ge_set_gej(secp256k1_ge *r, secp256k1_gej *a) {
r->x = a->x;
r->y = a->y;
- secp256k1_gej_verify(a);
- secp256k1_ge_verify(r);
+ SECP256K1_GEJ_VERIFY(a);
+ SECP256K1_GE_VERIFY(r);
}
static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) {
secp256k1_fe z2, z3;
- secp256k1_gej_verify(a);
+ SECP256K1_GEJ_VERIFY(a);
if (secp256k1_gej_is_infinity(a)) {
secp256k1_ge_set_infinity(r);
@@ -193,8 +189,8 @@ static void secp256k1_ge_set_gej_var(secp256k1_ge *r, secp256k1_gej *a) {
secp256k1_fe_set_int(&a->z, 1);
secp256k1_ge_set_xy(r, &a->x, &a->y);
- secp256k1_gej_verify(a);
- secp256k1_ge_verify(r);
+ SECP256K1_GEJ_VERIFY(a);
+ SECP256K1_GE_VERIFY(r);
}
static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a, size_t len) {
@@ -203,7 +199,7 @@ static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a
size_t last_i = SIZE_MAX;
#ifdef VERIFY
for (i = 0; i < len; i++) {
- secp256k1_gej_verify(&a[i]);
+ SECP256K1_GEJ_VERIFY(&a[i]);
}
#endif
@@ -245,7 +241,7 @@ static void secp256k1_ge_set_all_gej_var(secp256k1_ge *r, const secp256k1_gej *a
#ifdef VERIFY
for (i = 0; i < len; i++) {
- secp256k1_ge_verify(&r[i]);
+ SECP256K1_GE_VERIFY(&r[i]);
}
#endif
}
@@ -255,8 +251,8 @@ static void secp256k1_ge_table_set_globalz(size_t len, secp256k1_ge *a, const se
secp256k1_fe zs;
#ifdef VERIFY
for (i = 0; i < len; i++) {
- secp256k1_ge_verify(&a[i]);
- secp256k1_fe_verify(&zr[i]);
+ SECP256K1_GE_VERIFY(&a[i]);
+ SECP256K1_FE_VERIFY(&zr[i]);
}
#endif
@@ -278,7 +274,7 @@ static void secp256k1_ge_table_set_globalz(size_t len, secp256k1_ge *a, const se
#ifdef VERIFY
for (i = 0; i < len; i++) {
- secp256k1_ge_verify(&a[i]);
+ SECP256K1_GE_VERIFY(&a[i]);
}
#endif
}
@@ -289,7 +285,7 @@ static void secp256k1_gej_set_infinity(secp256k1_gej *r) {
secp256k1_fe_clear(&r->y);
secp256k1_fe_clear(&r->z);
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
}
static void secp256k1_ge_set_infinity(secp256k1_ge *r) {
@@ -297,7 +293,7 @@ static void secp256k1_ge_set_infinity(secp256k1_ge *r) {
secp256k1_fe_clear(&r->x);
secp256k1_fe_clear(&r->y);
- secp256k1_ge_verify(r);
+ SECP256K1_GE_VERIFY(r);
}
static void secp256k1_gej_clear(secp256k1_gej *r) {
@@ -306,7 +302,7 @@ static void secp256k1_gej_clear(secp256k1_gej *r) {
secp256k1_fe_clear(&r->y);
secp256k1_fe_clear(&r->z);
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
}
static void secp256k1_ge_clear(secp256k1_ge *r) {
@@ -314,13 +310,13 @@ static void secp256k1_ge_clear(secp256k1_ge *r) {
secp256k1_fe_clear(&r->x);
secp256k1_fe_clear(&r->y);
- secp256k1_ge_verify(r);
+ SECP256K1_GE_VERIFY(r);
}
static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int odd) {
secp256k1_fe x2, x3;
int ret;
- secp256k1_fe_verify(x);
+ SECP256K1_FE_VERIFY(x);
r->x = *x;
secp256k1_fe_sqr(&x2, x);
@@ -333,45 +329,72 @@ static int secp256k1_ge_set_xo_var(secp256k1_ge *r, const secp256k1_fe *x, int o
secp256k1_fe_negate(&r->y, &r->y, 1);
}
- secp256k1_ge_verify(r);
+ SECP256K1_GE_VERIFY(r);
return ret;
}
static void secp256k1_gej_set_ge(secp256k1_gej *r, const secp256k1_ge *a) {
- secp256k1_ge_verify(a);
+ SECP256K1_GE_VERIFY(a);
r->infinity = a->infinity;
r->x = a->x;
r->y = a->y;
secp256k1_fe_set_int(&r->z, 1);
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
}
static int secp256k1_gej_eq_var(const secp256k1_gej *a, const secp256k1_gej *b) {
secp256k1_gej tmp;
- secp256k1_gej_verify(b);
- secp256k1_gej_verify(a);
+ SECP256K1_GEJ_VERIFY(b);
+ SECP256K1_GEJ_VERIFY(a);
secp256k1_gej_neg(&tmp, a);
secp256k1_gej_add_var(&tmp, &tmp, b, NULL);
return secp256k1_gej_is_infinity(&tmp);
}
+static int secp256k1_gej_eq_ge_var(const secp256k1_gej *a, const secp256k1_ge *b) {
+ secp256k1_gej tmp;
+ SECP256K1_GEJ_VERIFY(a);
+ SECP256K1_GE_VERIFY(b);
+
+ secp256k1_gej_neg(&tmp, a);
+ secp256k1_gej_add_ge_var(&tmp, &tmp, b, NULL);
+ return secp256k1_gej_is_infinity(&tmp);
+}
+
+static int secp256k1_ge_eq_var(const secp256k1_ge *a, const secp256k1_ge *b) {
+ secp256k1_fe tmp;
+ SECP256K1_GE_VERIFY(a);
+ SECP256K1_GE_VERIFY(b);
+
+ if (a->infinity != b->infinity) return 0;
+ if (a->infinity) return 1;
+
+ tmp = a->x;
+ secp256k1_fe_normalize_weak(&tmp);
+ if (!secp256k1_fe_equal(&tmp, &b->x)) return 0;
+
+ tmp = a->y;
+ secp256k1_fe_normalize_weak(&tmp);
+ if (!secp256k1_fe_equal(&tmp, &b->y)) return 0;
+
+ return 1;
+}
+
static int secp256k1_gej_eq_x_var(const secp256k1_fe *x, const secp256k1_gej *a) {
secp256k1_fe r;
- secp256k1_fe_verify(x);
- secp256k1_gej_verify(a);
-#ifdef VERIFY
+ SECP256K1_FE_VERIFY(x);
+ SECP256K1_GEJ_VERIFY(a);
VERIFY_CHECK(!a->infinity);
-#endif
secp256k1_fe_sqr(&r, &a->z); secp256k1_fe_mul(&r, &r, x);
return secp256k1_fe_equal(&r, &a->x);
}
static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a) {
- secp256k1_gej_verify(a);
+ SECP256K1_GEJ_VERIFY(a);
r->infinity = a->infinity;
r->x = a->x;
@@ -380,18 +403,18 @@ static void secp256k1_gej_neg(secp256k1_gej *r, const secp256k1_gej *a) {
secp256k1_fe_normalize_weak(&r->y);
secp256k1_fe_negate(&r->y, &r->y, 1);
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
}
static int secp256k1_gej_is_infinity(const secp256k1_gej *a) {
- secp256k1_gej_verify(a);
+ SECP256K1_GEJ_VERIFY(a);
return a->infinity;
}
static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) {
secp256k1_fe y2, x3;
- secp256k1_ge_verify(a);
+ SECP256K1_GE_VERIFY(a);
if (a->infinity) {
return 0;
@@ -406,7 +429,7 @@ static int secp256k1_ge_is_valid_var(const secp256k1_ge *a) {
static SECP256K1_INLINE void secp256k1_gej_double(secp256k1_gej *r, const secp256k1_gej *a) {
/* Operations: 3 mul, 4 sqr, 8 add/half/mul_int/negate */
secp256k1_fe l, s, t;
- secp256k1_gej_verify(a);
+ SECP256K1_GEJ_VERIFY(a);
r->infinity = a->infinity;
@@ -435,11 +458,11 @@ static SECP256K1_INLINE void secp256k1_gej_double(secp256k1_gej *r, const secp25
secp256k1_fe_add(&r->y, &s); /* Y3 = L*(X3 + T) + S^2 (2) */
secp256k1_fe_negate(&r->y, &r->y, 2); /* Y3 = -(L*(X3 + T) + S^2) (3) */
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
}
static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, secp256k1_fe *rzr) {
- secp256k1_gej_verify(a);
+ SECP256K1_GEJ_VERIFY(a);
/** For secp256k1, 2Q is infinity if and only if Q is infinity. This is because if 2Q = infinity,
* Q must equal -Q, or that Q.y == -(Q.y), or Q.y is 0. For a point on y^2 = x^3 + 7 to have
@@ -466,14 +489,14 @@ static void secp256k1_gej_double_var(secp256k1_gej *r, const secp256k1_gej *a, s
secp256k1_gej_double(r, a);
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
}
static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_gej *b, secp256k1_fe *rzr) {
/* 12 mul, 4 sqr, 11 add/negate/normalizes_to_zero (ignoring special cases) */
secp256k1_fe z22, z12, u1, u2, s1, s2, h, i, h2, h3, t;
- secp256k1_gej_verify(a);
- secp256k1_gej_verify(b);
+ SECP256K1_GEJ_VERIFY(a);
+ SECP256K1_GEJ_VERIFY(b);
if (a->infinity) {
VERIFY_CHECK(rzr == NULL);
@@ -530,14 +553,14 @@ static void secp256k1_gej_add_var(secp256k1_gej *r, const secp256k1_gej *a, cons
secp256k1_fe_mul(&h3, &h3, &s1);
secp256k1_fe_add(&r->y, &h3);
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
}
static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, secp256k1_fe *rzr) {
/* Operations: 8 mul, 3 sqr, 11 add/negate/normalizes_to_zero (ignoring special cases) */
secp256k1_fe z12, u1, u2, s1, s2, h, i, h2, h3, t;
- secp256k1_gej_verify(a);
- secp256k1_ge_verify(b);
+ SECP256K1_GEJ_VERIFY(a);
+ SECP256K1_GE_VERIFY(b);
if (a->infinity) {
VERIFY_CHECK(rzr == NULL);
@@ -592,16 +615,16 @@ static void secp256k1_gej_add_ge_var(secp256k1_gej *r, const secp256k1_gej *a, c
secp256k1_fe_mul(&h3, &h3, &s1);
secp256k1_fe_add(&r->y, &h3);
- secp256k1_gej_verify(r);
- if (rzr != NULL) secp256k1_fe_verify(rzr);
+ SECP256K1_GEJ_VERIFY(r);
+ if (rzr != NULL) SECP256K1_FE_VERIFY(rzr);
}
static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a, const secp256k1_ge *b, const secp256k1_fe *bzinv) {
/* Operations: 9 mul, 3 sqr, 11 add/negate/normalizes_to_zero (ignoring special cases) */
secp256k1_fe az, z12, u1, u2, s1, s2, h, i, h2, h3, t;
- secp256k1_gej_verify(a);
- secp256k1_ge_verify(b);
- secp256k1_fe_verify(bzinv);
+ SECP256K1_GEJ_VERIFY(a);
+ SECP256K1_GE_VERIFY(b);
+ SECP256K1_FE_VERIFY(bzinv);
if (a->infinity) {
secp256k1_fe bzinv2, bzinv3;
@@ -611,7 +634,7 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a,
secp256k1_fe_mul(&r->x, &b->x, &bzinv2);
secp256k1_fe_mul(&r->y, &b->y, &bzinv3);
secp256k1_fe_set_int(&r->z, 1);
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
return;
}
if (b->infinity) {
@@ -663,7 +686,7 @@ static void secp256k1_gej_add_zinv_var(secp256k1_gej *r, const secp256k1_gej *a,
secp256k1_fe_mul(&h3, &h3, &s1);
secp256k1_fe_add(&r->y, &h3);
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
}
@@ -672,8 +695,8 @@ static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const
secp256k1_fe zz, u1, u2, s1, s2, t, tt, m, n, q, rr;
secp256k1_fe m_alt, rr_alt;
int degenerate;
- secp256k1_gej_verify(a);
- secp256k1_ge_verify(b);
+ SECP256K1_GEJ_VERIFY(a);
+ SECP256K1_GE_VERIFY(b);
VERIFY_CHECK(!b->infinity);
/* In:
@@ -801,17 +824,15 @@ static void secp256k1_gej_add_ge(secp256k1_gej *r, const secp256k1_gej *a, const
* Then r->infinity = ((y1 + y2)Z == 0) = (y1 == -y2) = false. */
r->infinity = secp256k1_fe_normalizes_to_zero(&r->z);
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
}
static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *s) {
/* Operations: 4 mul, 1 sqr */
secp256k1_fe zz;
- secp256k1_gej_verify(r);
- secp256k1_fe_verify(s);
-#ifdef VERIFY
+ SECP256K1_GEJ_VERIFY(r);
+ SECP256K1_FE_VERIFY(s);
VERIFY_CHECK(!secp256k1_fe_normalizes_to_zero_var(s));
-#endif
secp256k1_fe_sqr(&zz, s);
secp256k1_fe_mul(&r->x, &r->x, &zz); /* r->x *= s^2 */
@@ -819,12 +840,12 @@ static void secp256k1_gej_rescale(secp256k1_gej *r, const secp256k1_fe *s) {
secp256k1_fe_mul(&r->y, &r->y, s); /* r->y *= s^3 */
secp256k1_fe_mul(&r->z, &r->z, s); /* r->z *= s */
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
}
static void secp256k1_ge_to_storage(secp256k1_ge_storage *r, const secp256k1_ge *a) {
secp256k1_fe x, y;
- secp256k1_ge_verify(a);
+ SECP256K1_GE_VERIFY(a);
VERIFY_CHECK(!a->infinity);
x = a->x;
@@ -840,19 +861,19 @@ static void secp256k1_ge_from_storage(secp256k1_ge *r, const secp256k1_ge_storag
secp256k1_fe_from_storage(&r->y, &a->y);
r->infinity = 0;
- secp256k1_ge_verify(r);
+ SECP256K1_GE_VERIFY(r);
}
static SECP256K1_INLINE void secp256k1_gej_cmov(secp256k1_gej *r, const secp256k1_gej *a, int flag) {
- secp256k1_gej_verify(r);
- secp256k1_gej_verify(a);
+ SECP256K1_GEJ_VERIFY(r);
+ SECP256K1_GEJ_VERIFY(a);
secp256k1_fe_cmov(&r->x, &a->x, flag);
secp256k1_fe_cmov(&r->y, &a->y, flag);
secp256k1_fe_cmov(&r->z, &a->z, flag);
r->infinity ^= (r->infinity ^ a->infinity) & flag;
- secp256k1_gej_verify(r);
+ SECP256K1_GEJ_VERIFY(r);
}
static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r, const secp256k1_ge_storage *a, int flag) {
@@ -861,19 +882,19 @@ static SECP256K1_INLINE void secp256k1_ge_storage_cmov(secp256k1_ge_storage *r,
}
static void secp256k1_ge_mul_lambda(secp256k1_ge *r, const secp256k1_ge *a) {
- secp256k1_ge_verify(a);
+ SECP256K1_GE_VERIFY(a);
*r = *a;
secp256k1_fe_mul(&r->x, &r->x, &secp256k1_const_beta);
- secp256k1_ge_verify(r);
+ SECP256K1_GE_VERIFY(r);
}
static int secp256k1_ge_is_in_correct_subgroup(const secp256k1_ge* ge) {
#ifdef EXHAUSTIVE_TEST_ORDER
secp256k1_gej out;
int i;
- secp256k1_ge_verify(ge);
+ SECP256K1_GE_VERIFY(ge);
/* A very simple EC multiplication ladder that avoids a dependency on ecmult. */
secp256k1_gej_set_infinity(&out);
@@ -885,7 +906,7 @@ static int secp256k1_ge_is_in_correct_subgroup(const secp256k1_ge* ge) {
}
return secp256k1_gej_is_infinity(&out);
#else
- secp256k1_ge_verify(ge);
+ SECP256K1_GE_VERIFY(ge);
(void)ge;
/* The real secp256k1 group has cofactor 1, so the subgroup is the entire curve. */
@@ -907,9 +928,8 @@ static int secp256k1_ge_x_frac_on_curve_var(const secp256k1_fe *xn, const secp25
* (xn/xd)^3 + 7 is square <=> xd*xn^3 + 7*xd^4 is square (multiplying by xd^4, a square).
*/
secp256k1_fe r, t;
-#ifdef VERIFY
VERIFY_CHECK(!secp256k1_fe_normalizes_to_zero_var(xd));
-#endif
+
secp256k1_fe_mul(&r, xd, xn); /* r = xd*xn */
secp256k1_fe_sqr(&t, xn); /* t = xn^2 */
secp256k1_fe_mul(&r, &r, &t); /* r = xd*xn^3 */
diff --git a/src/secp256k1/src/modinv32_impl.h b/src/secp256k1/src/modinv32_impl.h
index 0ea2699863..75eb354ff0 100644
--- a/src/secp256k1/src/modinv32_impl.h
+++ b/src/secp256k1/src/modinv32_impl.h
@@ -144,7 +144,6 @@ static void secp256k1_modinv32_normalize_30(secp256k1_modinv32_signed30 *r, int3
r->v[7] = r7;
r->v[8] = r8;
-#ifdef VERIFY
VERIFY_CHECK(r0 >> 30 == 0);
VERIFY_CHECK(r1 >> 30 == 0);
VERIFY_CHECK(r2 >> 30 == 0);
@@ -156,7 +155,6 @@ static void secp256k1_modinv32_normalize_30(secp256k1_modinv32_signed30 *r, int3
VERIFY_CHECK(r8 >> 30 == 0);
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(r, 9, &modinfo->modulus, 0) >= 0); /* r >= 0 */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(r, 9, &modinfo->modulus, 1) < 0); /* r < modulus */
-#endif
}
/* Data type for transition matrices (see section 3 of explanation).
@@ -413,14 +411,13 @@ static void secp256k1_modinv32_update_de_30(secp256k1_modinv32_signed30 *d, secp
int32_t di, ei, md, me, sd, se;
int64_t cd, ce;
int i;
-#ifdef VERIFY
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(d, 9, &modinfo->modulus, -2) > 0); /* d > -2*modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(d, 9, &modinfo->modulus, 1) < 0); /* d < modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(e, 9, &modinfo->modulus, -2) > 0); /* e > -2*modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(e, 9, &modinfo->modulus, 1) < 0); /* e < modulus */
VERIFY_CHECK(labs(u) <= (M30 + 1 - labs(v))); /* |u|+|v| <= 2^30 */
VERIFY_CHECK(labs(q) <= (M30 + 1 - labs(r))); /* |q|+|r| <= 2^30 */
-#endif
+
/* [md,me] start as zero; plus [u,q] if d is negative; plus [v,r] if e is negative. */
sd = d->v[8] >> 31;
se = e->v[8] >> 31;
@@ -455,12 +452,11 @@ static void secp256k1_modinv32_update_de_30(secp256k1_modinv32_signed30 *d, secp
/* What remains is limb 9 of t*[d,e]+modulus*[md,me]; store it as output limb 8. */
d->v[8] = (int32_t)cd;
e->v[8] = (int32_t)ce;
-#ifdef VERIFY
+
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(d, 9, &modinfo->modulus, -2) > 0); /* d > -2*modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(d, 9, &modinfo->modulus, 1) < 0); /* d < modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(e, 9, &modinfo->modulus, -2) > 0); /* e > -2*modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(e, 9, &modinfo->modulus, 1) < 0); /* e < modulus */
-#endif
}
/* Compute (t/2^30) * [f, g], where t is a transition matrix for 30 divsteps.
@@ -550,25 +546,23 @@ static void secp256k1_modinv32(secp256k1_modinv32_signed30 *x, const secp256k1_m
/* Update d,e using that transition matrix. */
secp256k1_modinv32_update_de_30(&d, &e, &t, modinfo);
/* Update f,g using that transition matrix. */
-#ifdef VERIFY
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, 9, &modinfo->modulus, -1) > 0); /* f > -modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, 9, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, 9, &modinfo->modulus, -1) > 0); /* g > -modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, 9, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
+
secp256k1_modinv32_update_fg_30(&f, &g, &t);
-#ifdef VERIFY
+
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, 9, &modinfo->modulus, -1) > 0); /* f > -modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, 9, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, 9, &modinfo->modulus, -1) > 0); /* g > -modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, 9, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
}
/* At this point sufficient iterations have been performed that g must have reached 0
* and (if g was not originally 0) f must now equal +/- GCD of the initial f, g
* values i.e. +/- 1, and d now contains +/- the modular inverse. */
-#ifdef VERIFY
+
/* g == 0 */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, 9, &SECP256K1_SIGNED30_ONE, 0) == 0);
/* |f| == 1, or (x == 0 and d == 0 and |f|=modulus) */
@@ -578,7 +572,6 @@ static void secp256k1_modinv32(secp256k1_modinv32_signed30 *x, const secp256k1_m
secp256k1_modinv32_mul_cmp_30(&d, 9, &SECP256K1_SIGNED30_ONE, 0) == 0 &&
(secp256k1_modinv32_mul_cmp_30(&f, 9, &modinfo->modulus, 1) == 0 ||
secp256k1_modinv32_mul_cmp_30(&f, 9, &modinfo->modulus, -1) == 0)));
-#endif
/* Optionally negate d, normalize to [0,modulus), and return it. */
secp256k1_modinv32_normalize_30(&d, f.v[8], modinfo);
@@ -607,12 +600,12 @@ static void secp256k1_modinv32_var(secp256k1_modinv32_signed30 *x, const secp256
/* Update d,e using that transition matrix. */
secp256k1_modinv32_update_de_30(&d, &e, &t, modinfo);
/* Update f,g using that transition matrix. */
-#ifdef VERIFY
+
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, len, &modinfo->modulus, -1) > 0); /* f > -modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, len, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, len, &modinfo->modulus, -1) > 0); /* g > -modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, len, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
+
secp256k1_modinv32_update_fg_30_var(len, &f, &g, &t);
/* If the bottom limb of g is 0, there is a chance g=0. */
if (g.v[0] == 0) {
@@ -637,18 +630,17 @@ static void secp256k1_modinv32_var(secp256k1_modinv32_signed30 *x, const secp256
g.v[len - 2] |= (uint32_t)gn << 30;
--len;
}
-#ifdef VERIFY
+
VERIFY_CHECK(++i < 25); /* We should never need more than 25*30 = 750 divsteps */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, len, &modinfo->modulus, -1) > 0); /* f > -modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, len, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, len, &modinfo->modulus, -1) > 0); /* g > -modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, len, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
}
/* At this point g is 0 and (if g was not originally 0) f must now equal +/- GCD of
* the initial f, g values i.e. +/- 1, and d now contains +/- the modular inverse. */
-#ifdef VERIFY
+
/* g == 0 */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, len, &SECP256K1_SIGNED30_ONE, 0) == 0);
/* |f| == 1, or (x == 0 and d == 0 and |f|=modulus) */
@@ -658,7 +650,6 @@ static void secp256k1_modinv32_var(secp256k1_modinv32_signed30 *x, const secp256
secp256k1_modinv32_mul_cmp_30(&d, 9, &SECP256K1_SIGNED30_ONE, 0) == 0 &&
(secp256k1_modinv32_mul_cmp_30(&f, len, &modinfo->modulus, 1) == 0 ||
secp256k1_modinv32_mul_cmp_30(&f, len, &modinfo->modulus, -1) == 0)));
-#endif
/* Optionally negate d, normalize to [0,modulus), and return it. */
secp256k1_modinv32_normalize_30(&d, f.v[len - 1], modinfo);
@@ -697,12 +688,11 @@ static int secp256k1_jacobi32_maybe_var(const secp256k1_modinv32_signed30 *x, co
secp256k1_modinv32_trans2x2 t;
eta = secp256k1_modinv32_posdivsteps_30_var(eta, f.v[0] | ((uint32_t)f.v[1] << 30), g.v[0] | ((uint32_t)g.v[1] << 30), &t, &jac);
/* Update f,g using that transition matrix. */
-#ifdef VERIFY
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, len, &modinfo->modulus, 0) > 0); /* f > 0 */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, len, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, len, &modinfo->modulus, 0) > 0); /* g > 0 */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, len, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
+
secp256k1_modinv32_update_fg_30_var(len, &f, &g, &t);
/* If the bottom limb of f is 1, there is a chance that f=1. */
if (f.v[0] == 1) {
@@ -723,12 +713,11 @@ static int secp256k1_jacobi32_maybe_var(const secp256k1_modinv32_signed30 *x, co
cond |= gn;
/* If so, reduce length. */
if (cond == 0) --len;
-#ifdef VERIFY
+
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, len, &modinfo->modulus, 0) > 0); /* f > 0 */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&f, len, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, len, &modinfo->modulus, 0) > 0); /* g > 0 */
VERIFY_CHECK(secp256k1_modinv32_mul_cmp_30(&g, len, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
}
/* The loop failed to converge to f=g after 1500 iterations. Return 0, indicating unknown result. */
diff --git a/src/secp256k1/src/modinv64_impl.h b/src/secp256k1/src/modinv64_impl.h
index c7cef872a4..0dc1e80696 100644
--- a/src/secp256k1/src/modinv64_impl.h
+++ b/src/secp256k1/src/modinv64_impl.h
@@ -144,7 +144,6 @@ static void secp256k1_modinv64_normalize_62(secp256k1_modinv64_signed62 *r, int6
r->v[3] = r3;
r->v[4] = r4;
-#ifdef VERIFY
VERIFY_CHECK(r0 >> 62 == 0);
VERIFY_CHECK(r1 >> 62 == 0);
VERIFY_CHECK(r2 >> 62 == 0);
@@ -152,7 +151,6 @@ static void secp256k1_modinv64_normalize_62(secp256k1_modinv64_signed62 *r, int6
VERIFY_CHECK(r4 >> 62 == 0);
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(r, 5, &modinfo->modulus, 0) >= 0); /* r >= 0 */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(r, 5, &modinfo->modulus, 1) < 0); /* r < modulus */
-#endif
}
/* Compute the transition matrix and eta for 59 divsteps (where zeta=-(delta+1/2)).
@@ -216,7 +214,7 @@ static int64_t secp256k1_modinv64_divsteps_59(int64_t zeta, uint64_t f0, uint64_
t->v = (int64_t)v;
t->q = (int64_t)q;
t->r = (int64_t)r;
-#ifdef VERIFY
+
/* The determinant of t must be a power of two. This guarantees that multiplication with t
* does not change the gcd of f and g, apart from adding a power-of-2 factor to it (which
* will be divided out again). As each divstep's individual matrix has determinant 2, the
@@ -224,7 +222,7 @@ static int64_t secp256k1_modinv64_divsteps_59(int64_t zeta, uint64_t f0, uint64_
* 8*identity (which has determinant 2^6) means the overall outputs has determinant
* 2^65. */
VERIFY_CHECK(secp256k1_modinv64_det_check_pow2(t, 65, 0));
-#endif
+
return zeta;
}
@@ -301,13 +299,13 @@ static int64_t secp256k1_modinv64_divsteps_62_var(int64_t eta, uint64_t f0, uint
t->v = (int64_t)v;
t->q = (int64_t)q;
t->r = (int64_t)r;
-#ifdef VERIFY
+
/* The determinant of t must be a power of two. This guarantees that multiplication with t
* does not change the gcd of f and g, apart from adding a power-of-2 factor to it (which
* will be divided out again). As each divstep's individual matrix has determinant 2, the
* aggregate of 62 of them will have determinant 2^62. */
VERIFY_CHECK(secp256k1_modinv64_det_check_pow2(t, 62, 0));
-#endif
+
return eta;
}
@@ -392,13 +390,13 @@ static int64_t secp256k1_modinv64_posdivsteps_62_var(int64_t eta, uint64_t f0, u
t->v = (int64_t)v;
t->q = (int64_t)q;
t->r = (int64_t)r;
-#ifdef VERIFY
+
/* The determinant of t must be a power of two. This guarantees that multiplication with t
* does not change the gcd of f and g, apart from adding a power-of-2 factor to it (which
* will be divided out again). As each divstep's individual matrix has determinant 2 or -2,
* the aggregate of 62 of them will have determinant 2^62 or -2^62. */
VERIFY_CHECK(secp256k1_modinv64_det_check_pow2(t, 62, 1));
-#endif
+
*jacp = jac;
return eta;
}
@@ -417,14 +415,13 @@ static void secp256k1_modinv64_update_de_62(secp256k1_modinv64_signed62 *d, secp
const int64_t u = t->u, v = t->v, q = t->q, r = t->r;
int64_t md, me, sd, se;
secp256k1_int128 cd, ce;
-#ifdef VERIFY
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(d, 5, &modinfo->modulus, -2) > 0); /* d > -2*modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(d, 5, &modinfo->modulus, 1) < 0); /* d < modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(e, 5, &modinfo->modulus, -2) > 0); /* e > -2*modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(e, 5, &modinfo->modulus, 1) < 0); /* e < modulus */
VERIFY_CHECK(secp256k1_modinv64_abs(u) <= (((int64_t)1 << 62) - secp256k1_modinv64_abs(v))); /* |u|+|v| <= 2^62 */
VERIFY_CHECK(secp256k1_modinv64_abs(q) <= (((int64_t)1 << 62) - secp256k1_modinv64_abs(r))); /* |q|+|r| <= 2^62 */
-#endif
+
/* [md,me] start as zero; plus [u,q] if d is negative; plus [v,r] if e is negative. */
sd = d4 >> 63;
se = e4 >> 63;
@@ -489,12 +486,11 @@ static void secp256k1_modinv64_update_de_62(secp256k1_modinv64_signed62 *d, secp
/* What remains is limb 5 of t*[d,e]+modulus*[md,me]; store it as output limb 4. */
d->v[4] = secp256k1_i128_to_i64(&cd);
e->v[4] = secp256k1_i128_to_i64(&ce);
-#ifdef VERIFY
+
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(d, 5, &modinfo->modulus, -2) > 0); /* d > -2*modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(d, 5, &modinfo->modulus, 1) < 0); /* d < modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(e, 5, &modinfo->modulus, -2) > 0); /* e > -2*modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(e, 5, &modinfo->modulus, 1) < 0); /* e < modulus */
-#endif
}
/* Compute (t/2^62) * [f, g], where t is a transition matrix scaled by 2^62.
@@ -606,25 +602,23 @@ static void secp256k1_modinv64(secp256k1_modinv64_signed62 *x, const secp256k1_m
/* Update d,e using that transition matrix. */
secp256k1_modinv64_update_de_62(&d, &e, &t, modinfo);
/* Update f,g using that transition matrix. */
-#ifdef VERIFY
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, 5, &modinfo->modulus, -1) > 0); /* f > -modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, 5, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, 5, &modinfo->modulus, -1) > 0); /* g > -modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, 5, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
+
secp256k1_modinv64_update_fg_62(&f, &g, &t);
-#ifdef VERIFY
+
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, 5, &modinfo->modulus, -1) > 0); /* f > -modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, 5, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, 5, &modinfo->modulus, -1) > 0); /* g > -modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, 5, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
}
/* At this point sufficient iterations have been performed that g must have reached 0
* and (if g was not originally 0) f must now equal +/- GCD of the initial f, g
* values i.e. +/- 1, and d now contains +/- the modular inverse. */
-#ifdef VERIFY
+
/* g == 0 */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, 5, &SECP256K1_SIGNED62_ONE, 0) == 0);
/* |f| == 1, or (x == 0 and d == 0 and |f|=modulus) */
@@ -634,7 +628,6 @@ static void secp256k1_modinv64(secp256k1_modinv64_signed62 *x, const secp256k1_m
secp256k1_modinv64_mul_cmp_62(&d, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
(secp256k1_modinv64_mul_cmp_62(&f, 5, &modinfo->modulus, 1) == 0 ||
secp256k1_modinv64_mul_cmp_62(&f, 5, &modinfo->modulus, -1) == 0)));
-#endif
/* Optionally negate d, normalize to [0,modulus), and return it. */
secp256k1_modinv64_normalize_62(&d, f.v[4], modinfo);
@@ -663,12 +656,11 @@ static void secp256k1_modinv64_var(secp256k1_modinv64_signed62 *x, const secp256
/* Update d,e using that transition matrix. */
secp256k1_modinv64_update_de_62(&d, &e, &t, modinfo);
/* Update f,g using that transition matrix. */
-#ifdef VERIFY
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->modulus, -1) > 0); /* f > -modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, len, &modinfo->modulus, -1) > 0); /* g > -modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, len, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
+
secp256k1_modinv64_update_fg_62_var(len, &f, &g, &t);
/* If the bottom limb of g is zero, there is a chance that g=0. */
if (g.v[0] == 0) {
@@ -693,18 +685,17 @@ static void secp256k1_modinv64_var(secp256k1_modinv64_signed62 *x, const secp256
g.v[len - 2] |= (uint64_t)gn << 62;
--len;
}
-#ifdef VERIFY
+
VERIFY_CHECK(++i < 12); /* We should never need more than 12*62 = 744 divsteps */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->modulus, -1) > 0); /* f > -modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, len, &modinfo->modulus, -1) > 0); /* g > -modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, len, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
}
/* At this point g is 0 and (if g was not originally 0) f must now equal +/- GCD of
* the initial f, g values i.e. +/- 1, and d now contains +/- the modular inverse. */
-#ifdef VERIFY
+
/* g == 0 */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, len, &SECP256K1_SIGNED62_ONE, 0) == 0);
/* |f| == 1, or (x == 0 and d == 0 and |f|=modulus) */
@@ -714,7 +705,6 @@ static void secp256k1_modinv64_var(secp256k1_modinv64_signed62 *x, const secp256
secp256k1_modinv64_mul_cmp_62(&d, 5, &SECP256K1_SIGNED62_ONE, 0) == 0 &&
(secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->modulus, 1) == 0 ||
secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->modulus, -1) == 0)));
-#endif
/* Optionally negate d, normalize to [0,modulus), and return it. */
secp256k1_modinv64_normalize_62(&d, f.v[len - 1], modinfo);
@@ -753,12 +743,11 @@ static int secp256k1_jacobi64_maybe_var(const secp256k1_modinv64_signed62 *x, co
secp256k1_modinv64_trans2x2 t;
eta = secp256k1_modinv64_posdivsteps_62_var(eta, f.v[0] | ((uint64_t)f.v[1] << 62), g.v[0] | ((uint64_t)g.v[1] << 62), &t, &jac);
/* Update f,g using that transition matrix. */
-#ifdef VERIFY
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->modulus, 0) > 0); /* f > 0 */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, len, &modinfo->modulus, 0) > 0); /* g > 0 */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, len, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
+
secp256k1_modinv64_update_fg_62_var(len, &f, &g, &t);
/* If the bottom limb of f is 1, there is a chance that f=1. */
if (f.v[0] == 1) {
@@ -779,12 +768,11 @@ static int secp256k1_jacobi64_maybe_var(const secp256k1_modinv64_signed62 *x, co
cond |= gn;
/* If so, reduce length. */
if (cond == 0) --len;
-#ifdef VERIFY
+
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->modulus, 0) > 0); /* f > 0 */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&f, len, &modinfo->modulus, 1) <= 0); /* f <= modulus */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, len, &modinfo->modulus, 0) > 0); /* g > 0 */
VERIFY_CHECK(secp256k1_modinv64_mul_cmp_62(&g, len, &modinfo->modulus, 1) < 0); /* g < modulus */
-#endif
}
/* The loop failed to converge to f=g after 1550 iterations. Return 0, indicating unknown result. */
diff --git a/src/secp256k1/src/modules/ecdh/tests_impl.h b/src/secp256k1/src/modules/ecdh/tests_impl.h
index fa6f232227..6be96eacbe 100644
--- a/src/secp256k1/src/modules/ecdh/tests_impl.h
+++ b/src/secp256k1/src/modules/ecdh/tests_impl.h
@@ -25,32 +25,19 @@ static int ecdh_hash_function_custom(unsigned char *output, const unsigned char
}
static void test_ecdh_api(void) {
- /* Setup context that just counts errors */
- secp256k1_context *tctx = secp256k1_context_create(SECP256K1_CONTEXT_NONE);
secp256k1_pubkey point;
unsigned char res[32];
unsigned char s_one[32] = { 0 };
- int32_t ecount = 0;
s_one[31] = 1;
- secp256k1_context_set_error_callback(tctx, counting_illegal_callback_fn, &ecount);
- secp256k1_context_set_illegal_callback(tctx, counting_illegal_callback_fn, &ecount);
- CHECK(secp256k1_ec_pubkey_create(tctx, &point, s_one) == 1);
+ CHECK(secp256k1_ec_pubkey_create(CTX, &point, s_one) == 1);
/* Check all NULLs are detected */
- CHECK(secp256k1_ecdh(tctx, res, &point, s_one, NULL, NULL) == 1);
- CHECK(ecount == 0);
- CHECK(secp256k1_ecdh(tctx, NULL, &point, s_one, NULL, NULL) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ecdh(tctx, res, NULL, s_one, NULL, NULL) == 0);
- CHECK(ecount == 2);
- CHECK(secp256k1_ecdh(tctx, res, &point, NULL, NULL, NULL) == 0);
- CHECK(ecount == 3);
- CHECK(secp256k1_ecdh(tctx, res, &point, s_one, NULL, NULL) == 1);
- CHECK(ecount == 3);
-
- /* Cleanup */
- secp256k1_context_destroy(tctx);
+ CHECK(secp256k1_ecdh(CTX, res, &point, s_one, NULL, NULL) == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdh(CTX, NULL, &point, s_one, NULL, NULL));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdh(CTX, res, NULL, s_one, NULL, NULL));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdh(CTX, res, &point, NULL, NULL, NULL));
+ CHECK(secp256k1_ecdh(CTX, res, &point, s_one, NULL, NULL) == 1);
}
static void test_ecdh_generator_basepoint(void) {
diff --git a/src/secp256k1/src/modules/ellswift/main_impl.h b/src/secp256k1/src/modules/ellswift/main_impl.h
index 00bb8a3da5..b54ec08a22 100644
--- a/src/secp256k1/src/modules/ellswift/main_impl.h
+++ b/src/secp256k1/src/modules/ellswift/main_impl.h
@@ -126,9 +126,8 @@ static void secp256k1_ellswift_xswiftec_frac_var(secp256k1_fe *xn, secp256k1_fe
secp256k1_fe_mul(&l, &p, &u1); /* l = u*(g+s) */
secp256k1_fe_add(&n, &l); /* n = u*(c1*s+c2*g)+u*(g+s) */
secp256k1_fe_negate(xn, &n, 2); /* n = -u*(c1*s+c2*g)-u*(g+s) */
-#ifdef VERIFY
+
VERIFY_CHECK(secp256k1_ge_x_frac_on_curve_var(xn, &p));
-#endif
/* Return x3 = n/p = -(u*(c1*s+c2*g)/(g+s)+u) */
}
@@ -193,10 +192,8 @@ static int secp256k1_ellswift_xswiftec_inv_var(secp256k1_fe *t, const secp256k1_
secp256k1_fe_normalize_weak(&x);
secp256k1_fe_normalize_weak(&u);
-#ifdef VERIFY
VERIFY_CHECK(c >= 0 && c < 8);
VERIFY_CHECK(secp256k1_ge_x_on_curve_var(&x));
-#endif
if (!(c & 2)) {
/* c is in {0, 1, 4, 5}. In this case we look for an inverse under the x1 (if c=0 or
@@ -230,9 +227,7 @@ static int secp256k1_ellswift_xswiftec_inv_var(secp256k1_fe *t, const secp256k1_
* that (-u-x)^3 + B is not square (the secp256k1_ge_x_on_curve_var(&m)
* test above would have failed). This is a contradiction, and thus the
* assumption s=0 is false. */
-#ifdef VERIFY
VERIFY_CHECK(!secp256k1_fe_normalizes_to_zero_var(&s));
-#endif
/* If s is not square, fail. We have not fully computed s yet, but s is square iff
* -(u^3+7)*(u^2+u*x+x^2) is square (because a/b is square iff a*b is square and b is
@@ -272,7 +267,11 @@ static int secp256k1_ellswift_xswiftec_inv_var(secp256k1_fe *t, const secp256k1_
secp256k1_fe_negate(&q, &q, 1); /* q = -s*(4*(u^3+7)+3*u^2*s) */
if (!secp256k1_fe_is_square_var(&q)) return 0;
ret = secp256k1_fe_sqrt(&r, &q); /* r = sqrt(-s*(4*(u^3+7)+3*u^2*s)) */
+#ifdef VERIFY
VERIFY_CHECK(ret);
+#else
+ (void)ret;
+#endif
/* If (c & 1) = 1 and r = 0, fail. */
if (EXPECT((c & 1) && secp256k1_fe_normalizes_to_zero_var(&r), 0)) return 0;
@@ -320,10 +319,9 @@ static void secp256k1_ellswift_prng(unsigned char* out32, const secp256k1_sha256
buf4[3] = cnt >> 24;
secp256k1_sha256_write(&hash, buf4, 4);
secp256k1_sha256_finalize(&hash, out32);
-#ifdef VERIFY
+
/* Writing and finalizing together should trigger exactly one SHA256 compression. */
VERIFY_CHECK(((hash.bytes) >> 6) == (blocks + 1));
-#endif
}
/** Find an ElligatorSwift encoding (u, t) for X coordinate x, and random Y coordinate.
@@ -361,9 +359,8 @@ static void secp256k1_ellswift_xelligatorswift_var(unsigned char *u32, secp256k1
/* Since u is the output of a hash, it should practically never be 0. We could apply the
* u=0 to u=1 correction here too to deal with that case still, but it's such a low
* probability event that we do not bother. */
-#ifdef VERIFY
VERIFY_CHECK(!secp256k1_fe_normalizes_to_zero_var(&u));
-#endif
+
/* Find a remainder t, and return it if found. */
if (EXPECT(secp256k1_ellswift_xswiftec_inv_var(t, x, &u, branch), 0)) break;
}
@@ -417,7 +414,11 @@ int secp256k1_ellswift_encode(const secp256k1_context *ctx, unsigned char *ell64
* BIP340 tagged hash with tag "secp256k1_ellswift_encode". */
secp256k1_ellswift_sha256_init_encode(&hash);
ser_ret = secp256k1_eckey_pubkey_serialize(&p, p64, &ser_size, 1);
+#ifdef VERIFY
VERIFY_CHECK(ser_ret && ser_size == 33);
+#else
+ (void)ser_ret;
+#endif
secp256k1_sha256_write(&hash, p64, sizeof(p64));
secp256k1_sha256_write(&hash, rnd32, 32);
diff --git a/src/secp256k1/src/modules/ellswift/tests_exhaustive_impl.h b/src/secp256k1/src/modules/ellswift/tests_exhaustive_impl.h
index e002a8c008..839c24aee4 100644
--- a/src/secp256k1/src/modules/ellswift/tests_exhaustive_impl.h
+++ b/src/secp256k1/src/modules/ellswift/tests_exhaustive_impl.h
@@ -32,7 +32,7 @@ static void test_exhaustive_ellswift(const secp256k1_context *ctx, const secp256
/* Decode ellswift pubkey and check that it matches the precomputed group element. */
secp256k1_ellswift_decode(ctx, &pub_decoded, ell64);
secp256k1_pubkey_load(ctx, &ge_decoded, &pub_decoded);
- ge_equals_ge(&ge_decoded, &group[i]);
+ CHECK(secp256k1_ge_eq_var(&ge_decoded, &group[i]));
}
}
diff --git a/src/secp256k1/src/modules/ellswift/tests_impl.h b/src/secp256k1/src/modules/ellswift/tests_impl.h
index 47f443d980..7d1efbc492 100644
--- a/src/secp256k1/src/modules/ellswift/tests_impl.h
+++ b/src/secp256k1/src/modules/ellswift/tests_impl.h
@@ -237,7 +237,7 @@ void run_ellswift_tests(void) {
secp256k1_ellswift_decode(CTX, &pubkey2, ell64);
secp256k1_pubkey_load(CTX, &g2, &pubkey2);
/* Compare with original. */
- ge_equals_ge(&g, &g2);
+ CHECK(secp256k1_ge_eq_var(&g, &g2));
}
/* Verify the behavior of secp256k1_ellswift_create */
for (i = 0; i < 400 * COUNT; i++) {
@@ -259,7 +259,7 @@ void run_ellswift_tests(void) {
secp256k1_ellswift_decode(CTX, &pub, ell64);
secp256k1_pubkey_load(CTX, &dec, &pub);
secp256k1_ecmult(&res, NULL, &secp256k1_scalar_zero, &sec);
- ge_equals_gej(&dec, &res);
+ CHECK(secp256k1_gej_eq_ge_var(&res, &dec));
}
/* Verify that secp256k1_ellswift_xdh computes the right shared X coordinate. */
for (i = 0; i < 800 * COUNT; i++) {
@@ -285,7 +285,7 @@ void run_ellswift_tests(void) {
ret = secp256k1_ellswift_xdh(CTX, share32, ell64, ell64, sec32, i & 1, &ellswift_xdh_hash_x32, NULL);
CHECK(ret);
(void)secp256k1_fe_set_b32_limit(&share_x, share32); /* no overflow is possible */
- secp256k1_fe_verify(&share_x);
+ SECP256K1_FE_VERIFY(&share_x);
/* Compute seckey*pubkey directly. */
secp256k1_ecmult(&resj, &decj, &sec, NULL);
secp256k1_ge_set_gej(&res, &resj);
diff --git a/src/secp256k1/src/modules/extrakeys/tests_impl.h b/src/secp256k1/src/modules/extrakeys/tests_impl.h
index ae1655923b..45521d1742 100644
--- a/src/secp256k1/src/modules/extrakeys/tests_impl.h
+++ b/src/secp256k1/src/modules/extrakeys/tests_impl.h
@@ -9,11 +9,6 @@
#include "../../../include/secp256k1_extrakeys.h"
-static void set_counting_callbacks(secp256k1_context *ctx0, int *ecount) {
- secp256k1_context_set_error_callback(ctx0, counting_illegal_callback_fn, ecount);
- secp256k1_context_set_illegal_callback(ctx0, counting_illegal_callback_fn, ecount);
-}
-
static void test_xonly_pubkey(void) {
secp256k1_pubkey pk;
secp256k1_xonly_pubkey xonly_pk, xonly_pk_tmp;
@@ -28,10 +23,6 @@ static void test_xonly_pubkey(void) {
int pk_parity;
int i;
- int ecount;
-
- set_counting_callbacks(CTX, &ecount);
-
secp256k1_testrand256(sk);
memset(ones32, 0xFF, 32);
secp256k1_testrand256(xy_sk);
@@ -39,16 +30,12 @@ static void test_xonly_pubkey(void) {
CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, &xonly_pk, &pk_parity, &pk) == 1);
/* Test xonly_pubkey_from_pubkey */
- ecount = 0;
CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, &xonly_pk, &pk_parity, &pk) == 1);
- CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, NULL, &pk_parity, &pk) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_from_pubkey(CTX, NULL, &pk_parity, &pk));
CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, &xonly_pk, NULL, &pk) == 1);
- CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, &xonly_pk, &pk_parity, NULL) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_from_pubkey(CTX, &xonly_pk, &pk_parity, NULL));
memset(&pk, 0, sizeof(pk));
- CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, &xonly_pk, &pk_parity, &pk) == 0);
- CHECK(ecount == 3);
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_from_pubkey(CTX, &xonly_pk, &pk_parity, &pk));
/* Choose a secret key such that the resulting pubkey and xonly_pubkey match. */
memset(sk, 0, sizeof(sk));
@@ -72,28 +59,21 @@ static void test_xonly_pubkey(void) {
CHECK(secp256k1_fe_equal(&pk1.y, &y) == 1);
/* Test xonly_pubkey_serialize and xonly_pubkey_parse */
- ecount = 0;
- CHECK(secp256k1_xonly_pubkey_serialize(CTX, NULL, &xonly_pk) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_xonly_pubkey_serialize(CTX, buf32, NULL) == 0);
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_serialize(CTX, NULL, &xonly_pk));
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_serialize(CTX, buf32, NULL));
CHECK(secp256k1_memcmp_var(buf32, zeros64, 32) == 0);
- CHECK(ecount == 2);
{
/* A pubkey filled with 0s will fail to serialize due to pubkey_load
* special casing. */
secp256k1_xonly_pubkey pk_tmp;
memset(&pk_tmp, 0, sizeof(pk_tmp));
- CHECK(secp256k1_xonly_pubkey_serialize(CTX, buf32, &pk_tmp) == 0);
+ /* pubkey_load calls illegal callback */
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_serialize(CTX, buf32, &pk_tmp));
}
- /* pubkey_load called illegal callback */
- CHECK(ecount == 3);
CHECK(secp256k1_xonly_pubkey_serialize(CTX, buf32, &xonly_pk) == 1);
- ecount = 0;
- CHECK(secp256k1_xonly_pubkey_parse(CTX, NULL, buf32) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_xonly_pubkey_parse(CTX, &xonly_pk, NULL) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_parse(CTX, NULL, buf32));
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_parse(CTX, &xonly_pk, NULL));
/* Serialization and parse roundtrip */
CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, &xonly_pk, NULL, &pk) == 1);
@@ -125,7 +105,6 @@ static void test_xonly_pubkey(void) {
CHECK(secp256k1_xonly_pubkey_parse(CTX, &xonly_pk, &rand33[1]) == 1);
}
}
- CHECK(ecount == 2);
}
static void test_xonly_pubkey_comparison(void) {
@@ -139,29 +118,26 @@ static void test_xonly_pubkey_comparison(void) {
};
secp256k1_xonly_pubkey pk1;
secp256k1_xonly_pubkey pk2;
- int ecount = 0;
-
- set_counting_callbacks(CTX, &ecount);
CHECK(secp256k1_xonly_pubkey_parse(CTX, &pk1, pk1_ser) == 1);
CHECK(secp256k1_xonly_pubkey_parse(CTX, &pk2, pk2_ser) == 1);
- CHECK(secp256k1_xonly_pubkey_cmp(CTX, NULL, &pk2) < 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk1, NULL) > 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL_VOID(CTX, CHECK(secp256k1_xonly_pubkey_cmp(CTX, NULL, &pk2) < 0));
+ CHECK_ILLEGAL_VOID(CTX, CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk1, NULL) > 0));
CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk1, &pk2) < 0);
CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk2, &pk1) > 0);
CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk1, &pk1) == 0);
CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk2, &pk2) == 0);
- CHECK(ecount == 2);
memset(&pk1, 0, sizeof(pk1)); /* illegal pubkey */
- CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk1, &pk2) < 0);
- CHECK(ecount == 3);
- CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk1, &pk1) == 0);
- CHECK(ecount == 5);
- CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk2, &pk1) > 0);
- CHECK(ecount == 6);
+ CHECK_ILLEGAL_VOID(CTX, CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk1, &pk2) < 0));
+ {
+ int32_t ecount = 0;
+ secp256k1_context_set_illegal_callback(CTX, counting_callback_fn, &ecount);
+ CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk1, &pk1) == 0);
+ CHECK(ecount == 2);
+ secp256k1_context_set_illegal_callback(CTX, NULL, NULL);
+ }
+ CHECK_ILLEGAL_VOID(CTX, CHECK(secp256k1_xonly_pubkey_cmp(CTX, &pk2, &pk1) > 0));
}
static void test_xonly_pubkey_tweak(void) {
@@ -175,30 +151,20 @@ static void test_xonly_pubkey_tweak(void) {
unsigned char tweak[32];
int i;
- int ecount;
-
- set_counting_callbacks(CTX, &ecount);
-
memset(overflows, 0xff, sizeof(overflows));
secp256k1_testrand256(tweak);
secp256k1_testrand256(sk);
CHECK(secp256k1_ec_pubkey_create(CTX, &internal_pk, sk) == 1);
CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, &internal_xonly_pk, &pk_parity, &internal_pk) == 1);
- ecount = 0;
CHECK(secp256k1_xonly_pubkey_tweak_add(CTX, &output_pk, &internal_xonly_pk, tweak) == 1);
- CHECK(ecount == 0);
CHECK(secp256k1_xonly_pubkey_tweak_add(CTX, &output_pk, &internal_xonly_pk, tweak) == 1);
- CHECK(ecount == 0);
CHECK(secp256k1_xonly_pubkey_tweak_add(CTX, &output_pk, &internal_xonly_pk, tweak) == 1);
- CHECK(secp256k1_xonly_pubkey_tweak_add(CTX, NULL, &internal_xonly_pk, tweak) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_xonly_pubkey_tweak_add(CTX, &output_pk, NULL, tweak) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_tweak_add(CTX, NULL, &internal_xonly_pk, tweak));
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_tweak_add(CTX, &output_pk, NULL, tweak));
/* NULL internal_xonly_pk zeroes the output_pk */
CHECK(secp256k1_memcmp_var(&output_pk, zeros64, sizeof(output_pk)) == 0);
- CHECK(secp256k1_xonly_pubkey_tweak_add(CTX, &output_pk, &internal_xonly_pk, NULL) == 0);
- CHECK(ecount == 3);
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_tweak_add(CTX, &output_pk, &internal_xonly_pk, NULL));
/* NULL tweak zeroes the output_pk */
CHECK(secp256k1_memcmp_var(&output_pk, zeros64, sizeof(output_pk)) == 0);
@@ -225,9 +191,7 @@ static void test_xonly_pubkey_tweak(void) {
/* Invalid pk with a valid tweak */
memset(&internal_xonly_pk, 0, sizeof(internal_xonly_pk));
secp256k1_testrand256(tweak);
- ecount = 0;
- CHECK(secp256k1_xonly_pubkey_tweak_add(CTX, &output_pk, &internal_xonly_pk, tweak) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_tweak_add(CTX, &output_pk, &internal_xonly_pk, tweak));
CHECK(secp256k1_memcmp_var(&output_pk, zeros64, sizeof(output_pk)) == 0);
}
@@ -244,34 +208,23 @@ static void test_xonly_pubkey_tweak_check(void) {
int pk_parity;
unsigned char tweak[32];
- int ecount;
-
- set_counting_callbacks(CTX, &ecount);
-
memset(overflows, 0xff, sizeof(overflows));
secp256k1_testrand256(tweak);
secp256k1_testrand256(sk);
CHECK(secp256k1_ec_pubkey_create(CTX, &internal_pk, sk) == 1);
CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, &internal_xonly_pk, &pk_parity, &internal_pk) == 1);
- ecount = 0;
CHECK(secp256k1_xonly_pubkey_tweak_add(CTX, &output_pk, &internal_xonly_pk, tweak) == 1);
CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, &output_xonly_pk, &pk_parity, &output_pk) == 1);
CHECK(secp256k1_xonly_pubkey_serialize(CTX, buf32, &output_xonly_pk) == 1);
CHECK(secp256k1_xonly_pubkey_tweak_add_check(CTX, buf32, pk_parity, &internal_xonly_pk, tweak) == 1);
- CHECK(ecount == 0);
CHECK(secp256k1_xonly_pubkey_tweak_add_check(CTX, buf32, pk_parity, &internal_xonly_pk, tweak) == 1);
- CHECK(ecount == 0);
CHECK(secp256k1_xonly_pubkey_tweak_add_check(CTX, buf32, pk_parity, &internal_xonly_pk, tweak) == 1);
- CHECK(secp256k1_xonly_pubkey_tweak_add_check(CTX, NULL, pk_parity, &internal_xonly_pk, tweak) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_tweak_add_check(CTX, NULL, pk_parity, &internal_xonly_pk, tweak));
/* invalid pk_parity value */
CHECK(secp256k1_xonly_pubkey_tweak_add_check(CTX, buf32, 2, &internal_xonly_pk, tweak) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_xonly_pubkey_tweak_add_check(CTX, buf32, pk_parity, NULL, tweak) == 0);
- CHECK(ecount == 2);
- CHECK(secp256k1_xonly_pubkey_tweak_add_check(CTX, buf32, pk_parity, &internal_xonly_pk, NULL) == 0);
- CHECK(ecount == 3);
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_tweak_add_check(CTX, buf32, pk_parity, NULL, tweak));
+ CHECK_ILLEGAL(CTX, secp256k1_xonly_pubkey_tweak_add_check(CTX, buf32, pk_parity, &internal_xonly_pk, NULL));
memset(tweak, 1, sizeof(tweak));
CHECK(secp256k1_xonly_pubkey_from_pubkey(CTX, &internal_xonly_pk, NULL, &internal_pk) == 1);
@@ -290,7 +243,6 @@ static void test_xonly_pubkey_tweak_check(void) {
CHECK(secp256k1_xonly_pubkey_tweak_add_check(CTX, output_pk32, pk_parity, &internal_xonly_pk, overflows) == 0);
CHECK(secp256k1_xonly_pubkey_tweak_add(CTX, &output_pk, &internal_xonly_pk, overflows) == 0);
CHECK(secp256k1_memcmp_var(&output_pk, zeros64, sizeof(output_pk)) == 0);
- CHECK(ecount == 3);
}
/* Starts with an initial pubkey and recursively creates N_PUBKEYS - 1
@@ -335,33 +287,22 @@ static void test_keypair(void) {
secp256k1_pubkey pk, pk_tmp;
secp256k1_xonly_pubkey xonly_pk, xonly_pk_tmp;
int pk_parity, pk_parity_tmp;
- int ecount;
-
- set_counting_callbacks(CTX, &ecount);
- set_counting_callbacks(STATIC_CTX, &ecount);
CHECK(sizeof(zeros96) == sizeof(keypair));
memset(overflows, 0xFF, sizeof(overflows));
/* Test keypair_create */
- ecount = 0;
secp256k1_testrand256(sk);
CHECK(secp256k1_keypair_create(CTX, &keypair, sk) == 1);
CHECK(secp256k1_memcmp_var(zeros96, &keypair, sizeof(keypair)) != 0);
- CHECK(ecount == 0);
CHECK(secp256k1_keypair_create(CTX, &keypair, sk) == 1);
CHECK(secp256k1_memcmp_var(zeros96, &keypair, sizeof(keypair)) != 0);
- CHECK(ecount == 0);
- CHECK(secp256k1_keypair_create(CTX, NULL, sk) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_keypair_create(CTX, &keypair, NULL) == 0);
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_create(CTX, NULL, sk));
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_create(CTX, &keypair, NULL));
CHECK(secp256k1_memcmp_var(zeros96, &keypair, sizeof(keypair)) == 0);
- CHECK(ecount == 2);
CHECK(secp256k1_keypair_create(CTX, &keypair, sk) == 1);
- CHECK(ecount == 2);
- CHECK(secp256k1_keypair_create(STATIC_CTX, &keypair, sk) == 0);
+ CHECK_ILLEGAL(STATIC_CTX, secp256k1_keypair_create(STATIC_CTX, &keypair, sk));
CHECK(secp256k1_memcmp_var(zeros96, &keypair, sizeof(keypair)) == 0);
- CHECK(ecount == 3);
/* Invalid secret key */
CHECK(secp256k1_keypair_create(CTX, &keypair, zeros96) == 0);
@@ -370,14 +311,11 @@ static void test_keypair(void) {
CHECK(secp256k1_memcmp_var(zeros96, &keypair, sizeof(keypair)) == 0);
/* Test keypair_pub */
- ecount = 0;
secp256k1_testrand256(sk);
CHECK(secp256k1_keypair_create(CTX, &keypair, sk) == 1);
CHECK(secp256k1_keypair_pub(CTX, &pk, &keypair) == 1);
- CHECK(secp256k1_keypair_pub(CTX, NULL, &keypair) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_keypair_pub(CTX, &pk, NULL) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_pub(CTX, NULL, &keypair));
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_pub(CTX, &pk, NULL));
CHECK(secp256k1_memcmp_var(zeros96, &pk, sizeof(pk)) == 0);
/* Using an invalid keypair is fine for keypair_pub */
@@ -392,23 +330,19 @@ static void test_keypair(void) {
CHECK(secp256k1_memcmp_var(&pk, &pk_tmp, sizeof(pk)) == 0);
/** Test keypair_xonly_pub **/
- ecount = 0;
secp256k1_testrand256(sk);
CHECK(secp256k1_keypair_create(CTX, &keypair, sk) == 1);
CHECK(secp256k1_keypair_xonly_pub(CTX, &xonly_pk, &pk_parity, &keypair) == 1);
- CHECK(secp256k1_keypair_xonly_pub(CTX, NULL, &pk_parity, &keypair) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_xonly_pub(CTX, NULL, &pk_parity, &keypair));
CHECK(secp256k1_keypair_xonly_pub(CTX, &xonly_pk, NULL, &keypair) == 1);
- CHECK(secp256k1_keypair_xonly_pub(CTX, &xonly_pk, &pk_parity, NULL) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_xonly_pub(CTX, &xonly_pk, &pk_parity, NULL));
CHECK(secp256k1_memcmp_var(zeros96, &xonly_pk, sizeof(xonly_pk)) == 0);
/* Using an invalid keypair will set the xonly_pk to 0 (first reset
* xonly_pk). */
CHECK(secp256k1_keypair_xonly_pub(CTX, &xonly_pk, &pk_parity, &keypair) == 1);
memset(&keypair, 0, sizeof(keypair));
- CHECK(secp256k1_keypair_xonly_pub(CTX, &xonly_pk, &pk_parity, &keypair) == 0);
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_xonly_pub(CTX, &xonly_pk, &pk_parity, &keypair));
CHECK(secp256k1_memcmp_var(zeros96, &xonly_pk, sizeof(xonly_pk)) == 0);
- CHECK(ecount == 3);
/** keypair holds the same xonly pubkey as pubkey_create **/
CHECK(secp256k1_ec_pubkey_create(CTX, &pk, sk) == 1);
@@ -419,14 +353,11 @@ static void test_keypair(void) {
CHECK(pk_parity == pk_parity_tmp);
/* Test keypair_seckey */
- ecount = 0;
secp256k1_testrand256(sk);
CHECK(secp256k1_keypair_create(CTX, &keypair, sk) == 1);
CHECK(secp256k1_keypair_sec(CTX, sk_tmp, &keypair) == 1);
- CHECK(secp256k1_keypair_sec(CTX, NULL, &keypair) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_keypair_sec(CTX, sk_tmp, NULL) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_sec(CTX, NULL, &keypair));
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_sec(CTX, sk_tmp, NULL));
CHECK(secp256k1_memcmp_var(zeros96, sk_tmp, sizeof(sk_tmp)) == 0);
/* keypair returns the same seckey it got */
@@ -439,9 +370,6 @@ static void test_keypair(void) {
memset(&keypair, 0, sizeof(keypair));
CHECK(secp256k1_keypair_sec(CTX, sk_tmp, &keypair) == 1);
CHECK(secp256k1_memcmp_var(zeros96, sk_tmp, sizeof(sk_tmp)) == 0);
-
- secp256k1_context_set_error_callback(STATIC_CTX, NULL, NULL);
- secp256k1_context_set_illegal_callback(STATIC_CTX, NULL, NULL);
}
static void test_keypair_add(void) {
@@ -451,9 +379,6 @@ static void test_keypair_add(void) {
unsigned char zeros96[96] = { 0 };
unsigned char tweak[32];
int i;
- int ecount = 0;
-
- set_counting_callbacks(CTX, &ecount);
CHECK(sizeof(zeros96) == sizeof(keypair));
secp256k1_testrand256(sk);
@@ -462,14 +387,10 @@ static void test_keypair_add(void) {
CHECK(secp256k1_keypair_create(CTX, &keypair, sk) == 1);
CHECK(secp256k1_keypair_xonly_tweak_add(CTX, &keypair, tweak) == 1);
- CHECK(ecount == 0);
CHECK(secp256k1_keypair_xonly_tweak_add(CTX, &keypair, tweak) == 1);
- CHECK(ecount == 0);
CHECK(secp256k1_keypair_xonly_tweak_add(CTX, &keypair, tweak) == 1);
- CHECK(secp256k1_keypair_xonly_tweak_add(CTX, NULL, tweak) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_keypair_xonly_tweak_add(CTX, &keypair, NULL) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_xonly_tweak_add(CTX, NULL, tweak));
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_xonly_tweak_add(CTX, &keypair, NULL));
/* This does not set the keypair to zeroes */
CHECK(secp256k1_memcmp_var(&keypair, zeros96, sizeof(keypair)) != 0);
@@ -503,20 +424,16 @@ static void test_keypair_add(void) {
/* Invalid keypair with a valid tweak */
memset(&keypair, 0, sizeof(keypair));
secp256k1_testrand256(tweak);
- ecount = 0;
- CHECK(secp256k1_keypair_xonly_tweak_add(CTX, &keypair, tweak) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_xonly_tweak_add(CTX, &keypair, tweak));
CHECK(secp256k1_memcmp_var(&keypair, zeros96, sizeof(keypair)) == 0);
/* Only seckey part of keypair invalid */
CHECK(secp256k1_keypair_create(CTX, &keypair, sk) == 1);
memset(&keypair, 0, 32);
- CHECK(secp256k1_keypair_xonly_tweak_add(CTX, &keypair, tweak) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_xonly_tweak_add(CTX, &keypair, tweak));
/* Only pubkey part of keypair invalid */
CHECK(secp256k1_keypair_create(CTX, &keypair, sk) == 1);
memset(&keypair.data[32], 0, 64);
- CHECK(secp256k1_keypair_xonly_tweak_add(CTX, &keypair, tweak) == 0);
- CHECK(ecount == 3);
+ CHECK_ILLEGAL(CTX, secp256k1_keypair_xonly_tweak_add(CTX, &keypair, tweak));
/* Check that the keypair_tweak_add implementation is correct */
CHECK(secp256k1_keypair_create(CTX, &keypair, sk) == 1);
diff --git a/src/secp256k1/src/modules/recovery/tests_impl.h b/src/secp256k1/src/modules/recovery/tests_impl.h
index 3502c71ffe..728ccfed8d 100644
--- a/src/secp256k1/src/modules/recovery/tests_impl.h
+++ b/src/secp256k1/src/modules/recovery/tests_impl.h
@@ -36,7 +36,6 @@ static void test_ecdsa_recovery_api(void) {
secp256k1_ecdsa_recoverable_signature recsig;
unsigned char privkey[32] = { 1 };
unsigned char message[32] = { 2 };
- int32_t ecount = 0;
int recid = 0;
unsigned char sig[74];
unsigned char zero_privkey[32] = { 0 };
@@ -45,86 +44,52 @@ static void test_ecdsa_recovery_api(void) {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
- secp256k1_context_set_error_callback(CTX, counting_illegal_callback_fn, &ecount);
- secp256k1_context_set_illegal_callback(CTX, counting_illegal_callback_fn, &ecount);
- secp256k1_context_set_error_callback(STATIC_CTX, counting_illegal_callback_fn, &ecount);
- secp256k1_context_set_illegal_callback(STATIC_CTX, counting_illegal_callback_fn, &ecount);
-
/* Construct and verify corresponding public key. */
CHECK(secp256k1_ec_seckey_verify(CTX, privkey) == 1);
CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, privkey) == 1);
/* Check bad contexts and NULLs for signing */
- ecount = 0;
CHECK(secp256k1_ecdsa_sign_recoverable(CTX, &recsig, message, privkey, NULL, NULL) == 1);
- CHECK(ecount == 0);
- CHECK(secp256k1_ecdsa_sign_recoverable(CTX, NULL, message, privkey, NULL, NULL) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ecdsa_sign_recoverable(CTX, &recsig, NULL, privkey, NULL, NULL) == 0);
- CHECK(ecount == 2);
- CHECK(secp256k1_ecdsa_sign_recoverable(CTX, &recsig, message, NULL, NULL, NULL) == 0);
- CHECK(ecount == 3);
- CHECK(secp256k1_ecdsa_sign_recoverable(STATIC_CTX, &recsig, message, privkey, NULL, NULL) == 0);
- CHECK(ecount == 4);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_sign_recoverable(CTX, NULL, message, privkey, NULL, NULL));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_sign_recoverable(CTX, &recsig, NULL, privkey, NULL, NULL));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_sign_recoverable(CTX, &recsig, message, NULL, NULL, NULL));
+ CHECK_ILLEGAL(STATIC_CTX, secp256k1_ecdsa_sign_recoverable(STATIC_CTX, &recsig, message, privkey, NULL, NULL));
/* This will fail or succeed randomly, and in either case will not ARG_CHECK failure */
secp256k1_ecdsa_sign_recoverable(CTX, &recsig, message, privkey, recovery_test_nonce_function, NULL);
- CHECK(ecount == 4);
/* These will all fail, but not in ARG_CHECK way */
CHECK(secp256k1_ecdsa_sign_recoverable(CTX, &recsig, message, zero_privkey, NULL, NULL) == 0);
CHECK(secp256k1_ecdsa_sign_recoverable(CTX, &recsig, message, over_privkey, NULL, NULL) == 0);
/* This one will succeed. */
CHECK(secp256k1_ecdsa_sign_recoverable(CTX, &recsig, message, privkey, NULL, NULL) == 1);
- CHECK(ecount == 4);
/* Check signing with a goofy nonce function */
/* Check bad contexts and NULLs for recovery */
- ecount = 0;
CHECK(secp256k1_ecdsa_recover(CTX, &recpubkey, &recsig, message) == 1);
- CHECK(ecount == 0);
- CHECK(secp256k1_ecdsa_recover(CTX, NULL, &recsig, message) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ecdsa_recover(CTX, &recpubkey, NULL, message) == 0);
- CHECK(ecount == 2);
- CHECK(secp256k1_ecdsa_recover(CTX, &recpubkey, &recsig, NULL) == 0);
- CHECK(ecount == 3);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recover(CTX, NULL, &recsig, message));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recover(CTX, &recpubkey, NULL, message));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recover(CTX, &recpubkey, &recsig, NULL));
/* Check NULLs for conversion */
CHECK(secp256k1_ecdsa_sign(CTX, &normal_sig, message, privkey, NULL, NULL) == 1);
- ecount = 0;
- CHECK(secp256k1_ecdsa_recoverable_signature_convert(CTX, NULL, &recsig) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ecdsa_recoverable_signature_convert(CTX, &normal_sig, NULL) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recoverable_signature_convert(CTX, NULL, &recsig));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recoverable_signature_convert(CTX, &normal_sig, NULL));
CHECK(secp256k1_ecdsa_recoverable_signature_convert(CTX, &normal_sig, &recsig) == 1);
/* Check NULLs for de/serialization */
CHECK(secp256k1_ecdsa_sign_recoverable(CTX, &recsig, message, privkey, NULL, NULL) == 1);
- ecount = 0;
- CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(CTX, NULL, &recid, &recsig) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(CTX, sig, NULL, &recsig) == 0);
- CHECK(ecount == 2);
- CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(CTX, sig, &recid, NULL) == 0);
- CHECK(ecount == 3);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recoverable_signature_serialize_compact(CTX, NULL, &recid, &recsig));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recoverable_signature_serialize_compact(CTX, sig, NULL, &recsig));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recoverable_signature_serialize_compact(CTX, sig, &recid, NULL));
CHECK(secp256k1_ecdsa_recoverable_signature_serialize_compact(CTX, sig, &recid, &recsig) == 1);
- CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(CTX, NULL, sig, recid) == 0);
- CHECK(ecount == 4);
- CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(CTX, &recsig, NULL, recid) == 0);
- CHECK(ecount == 5);
- CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(CTX, &recsig, sig, -1) == 0);
- CHECK(ecount == 6);
- CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(CTX, &recsig, sig, 5) == 0);
- CHECK(ecount == 7);
- /* overflow in signature will fail but not affect ecount */
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recoverable_signature_parse_compact(CTX, NULL, sig, recid));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recoverable_signature_parse_compact(CTX, &recsig, NULL, recid));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recoverable_signature_parse_compact(CTX, &recsig, sig, -1));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_recoverable_signature_parse_compact(CTX, &recsig, sig, 5));
+ /* overflow in signature will not result in calling illegal_callback */
memcpy(sig, over_privkey, 32);
CHECK(secp256k1_ecdsa_recoverable_signature_parse_compact(CTX, &recsig, sig, recid) == 0);
- CHECK(ecount == 7);
-
- /* cleanup */
- secp256k1_context_set_error_callback(STATIC_CTX, NULL, NULL);
- secp256k1_context_set_illegal_callback(STATIC_CTX, NULL, NULL);
}
static void test_ecdsa_recovery_end_to_end(void) {
diff --git a/src/secp256k1/src/modules/schnorrsig/tests_impl.h b/src/secp256k1/src/modules/schnorrsig/tests_impl.h
index 90337ff03e..8ada90a87b 100644
--- a/src/secp256k1/src/modules/schnorrsig/tests_impl.h
+++ b/src/secp256k1/src/modules/schnorrsig/tests_impl.h
@@ -116,14 +116,6 @@ static void test_schnorrsig_api(void) {
secp256k1_schnorrsig_extraparams extraparams = SECP256K1_SCHNORRSIG_EXTRAPARAMS_INIT;
secp256k1_schnorrsig_extraparams invalid_extraparams = {{ 0 }, NULL, NULL};
- /** setup **/
- int ecount = 0;
-
- secp256k1_context_set_error_callback(CTX, counting_illegal_callback_fn, &ecount);
- secp256k1_context_set_illegal_callback(CTX, counting_illegal_callback_fn, &ecount);
- secp256k1_context_set_error_callback(STATIC_CTX, counting_illegal_callback_fn, &ecount);
- secp256k1_context_set_illegal_callback(STATIC_CTX, counting_illegal_callback_fn, &ecount);
-
secp256k1_testrand256(sk1);
secp256k1_testrand256(sk2);
secp256k1_testrand256(sk3);
@@ -137,57 +129,30 @@ static void test_schnorrsig_api(void) {
memset(&zero_pk, 0, sizeof(zero_pk));
/** main test body **/
- ecount = 0;
CHECK(secp256k1_schnorrsig_sign32(CTX, sig, msg, &keypairs[0], NULL) == 1);
- CHECK(ecount == 0);
- CHECK(secp256k1_schnorrsig_sign32(CTX, NULL, msg, &keypairs[0], NULL) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_schnorrsig_sign32(CTX, sig, NULL, &keypairs[0], NULL) == 0);
- CHECK(ecount == 2);
- CHECK(secp256k1_schnorrsig_sign32(CTX, sig, msg, NULL, NULL) == 0);
- CHECK(ecount == 3);
- CHECK(secp256k1_schnorrsig_sign32(CTX, sig, msg, &invalid_keypair, NULL) == 0);
- CHECK(ecount == 4);
- CHECK(secp256k1_schnorrsig_sign32(STATIC_CTX, sig, msg, &keypairs[0], NULL) == 0);
- CHECK(ecount == 5);
-
- ecount = 0;
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_sign32(CTX, NULL, msg, &keypairs[0], NULL));
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_sign32(CTX, sig, NULL, &keypairs[0], NULL));
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_sign32(CTX, sig, msg, NULL, NULL));
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_sign32(CTX, sig, msg, &invalid_keypair, NULL));
+ CHECK_ILLEGAL(STATIC_CTX, secp256k1_schnorrsig_sign32(STATIC_CTX, sig, msg, &keypairs[0], NULL));
+
CHECK(secp256k1_schnorrsig_sign_custom(CTX, sig, msg, sizeof(msg), &keypairs[0], &extraparams) == 1);
- CHECK(ecount == 0);
- CHECK(secp256k1_schnorrsig_sign_custom(CTX, NULL, msg, sizeof(msg), &keypairs[0], &extraparams) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_schnorrsig_sign_custom(CTX, sig, NULL, sizeof(msg), &keypairs[0], &extraparams) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_sign_custom(CTX, NULL, msg, sizeof(msg), &keypairs[0], &extraparams));
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_sign_custom(CTX, sig, NULL, sizeof(msg), &keypairs[0], &extraparams));
CHECK(secp256k1_schnorrsig_sign_custom(CTX, sig, NULL, 0, &keypairs[0], &extraparams) == 1);
- CHECK(ecount == 2);
- CHECK(secp256k1_schnorrsig_sign_custom(CTX, sig, msg, sizeof(msg), NULL, &extraparams) == 0);
- CHECK(ecount == 3);
- CHECK(secp256k1_schnorrsig_sign_custom(CTX, sig, msg, sizeof(msg), &invalid_keypair, &extraparams) == 0);
- CHECK(ecount == 4);
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_sign_custom(CTX, sig, msg, sizeof(msg), NULL, &extraparams));
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_sign_custom(CTX, sig, msg, sizeof(msg), &invalid_keypair, &extraparams));
CHECK(secp256k1_schnorrsig_sign_custom(CTX, sig, msg, sizeof(msg), &keypairs[0], NULL) == 1);
- CHECK(ecount == 4);
- CHECK(secp256k1_schnorrsig_sign_custom(CTX, sig, msg, sizeof(msg), &keypairs[0], &invalid_extraparams) == 0);
- CHECK(ecount == 5);
- CHECK(secp256k1_schnorrsig_sign_custom(STATIC_CTX, sig, msg, sizeof(msg), &keypairs[0], &extraparams) == 0);
- CHECK(ecount == 6);
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_sign_custom(CTX, sig, msg, sizeof(msg), &keypairs[0], &invalid_extraparams));
+ CHECK_ILLEGAL(STATIC_CTX, secp256k1_schnorrsig_sign_custom(STATIC_CTX, sig, msg, sizeof(msg), &keypairs[0], &extraparams));
- ecount = 0;
CHECK(secp256k1_schnorrsig_sign32(CTX, sig, msg, &keypairs[0], NULL) == 1);
CHECK(secp256k1_schnorrsig_verify(CTX, sig, msg, sizeof(msg), &pk[0]) == 1);
- CHECK(ecount == 0);
- CHECK(secp256k1_schnorrsig_verify(CTX, NULL, msg, sizeof(msg), &pk[0]) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_schnorrsig_verify(CTX, sig, NULL, sizeof(msg), &pk[0]) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_verify(CTX, NULL, msg, sizeof(msg), &pk[0]));
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_verify(CTX, sig, NULL, sizeof(msg), &pk[0]));
CHECK(secp256k1_schnorrsig_verify(CTX, sig, NULL, 0, &pk[0]) == 0);
- CHECK(ecount == 2);
- CHECK(secp256k1_schnorrsig_verify(CTX, sig, msg, sizeof(msg), NULL) == 0);
- CHECK(ecount == 3);
- CHECK(secp256k1_schnorrsig_verify(CTX, sig, msg, sizeof(msg), &zero_pk) == 0);
- CHECK(ecount == 4);
-
- secp256k1_context_set_error_callback(STATIC_CTX, NULL, NULL);
- secp256k1_context_set_illegal_callback(STATIC_CTX, NULL, NULL);
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_verify(CTX, sig, msg, sizeof(msg), NULL));
+ CHECK_ILLEGAL(CTX, secp256k1_schnorrsig_verify(CTX, sig, msg, sizeof(msg), &zero_pk));
}
/* Checks that hash initialized by secp256k1_schnorrsig_sha256_tagged has the
diff --git a/src/secp256k1/src/scalar.h b/src/secp256k1/src/scalar.h
index 4b3c2998bb..98b1287bb5 100644
--- a/src/secp256k1/src/scalar.h
+++ b/src/secp256k1/src/scalar.h
@@ -25,7 +25,7 @@ static void secp256k1_scalar_clear(secp256k1_scalar *r);
/** Access bits from a scalar. All requested bits must belong to the same 32-bit limb. */
static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count);
-/** Access bits from a scalar. Not constant time. */
+/** Access bits from a scalar. Not constant time in offset and count. */
static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count);
/** Set a scalar from a big endian byte array. The scalar will be reduced modulo group order `n`.
@@ -54,10 +54,6 @@ static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int
/** Multiply two scalars (modulo the group order). */
static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b);
-/** Shift a scalar right by some amount strictly between 0 and 16, returning
- * the low bits that were shifted off */
-static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n);
-
/** Compute the inverse of a scalar (modulo the group order). */
static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *a);
@@ -67,6 +63,9 @@ static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_sc
/** Compute the complement of a scalar (modulo the group order). */
static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a);
+/** Multiply a scalar with the multiplicative inverse of 2. */
+static void secp256k1_scalar_half(secp256k1_scalar *r, const secp256k1_scalar *a);
+
/** Check whether a scalar equals zero. */
static int secp256k1_scalar_is_zero(const secp256k1_scalar *a);
@@ -101,5 +100,6 @@ static void secp256k1_scalar_cmov(secp256k1_scalar *r, const secp256k1_scalar *a
/** Check invariants on a scalar (no-op unless VERIFY is enabled). */
static void secp256k1_scalar_verify(const secp256k1_scalar *r);
+#define SECP256K1_SCALAR_VERIFY(r) secp256k1_scalar_verify(r)
#endif /* SECP256K1_SCALAR_H */
diff --git a/src/secp256k1/src/scalar_4x64_impl.h b/src/secp256k1/src/scalar_4x64_impl.h
index 715cc12ee5..7b9c542f07 100644
--- a/src/secp256k1/src/scalar_4x64_impl.h
+++ b/src/secp256k1/src/scalar_4x64_impl.h
@@ -42,18 +42,18 @@ SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsig
r->d[2] = 0;
r->d[3] = 0;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
VERIFY_CHECK((offset + count - 1) >> 6 == offset >> 6);
return (a->d[offset >> 6] >> (offset & 0x3F)) & ((((uint64_t)1) << count) - 1);
}
SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
VERIFY_CHECK(count < 32);
VERIFY_CHECK(offset + count <= 256);
@@ -93,15 +93,15 @@ SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, unsigne
secp256k1_u128_accum_u64(&t, r->d[3]);
r->d[3] = secp256k1_u128_to_u64(&t);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
return overflow;
}
static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {
int overflow;
secp256k1_uint128 t;
- secp256k1_scalar_verify(a);
- secp256k1_scalar_verify(b);
+ SECP256K1_SCALAR_VERIFY(a);
+ SECP256K1_SCALAR_VERIFY(b);
secp256k1_u128_from_u64(&t, a->d[0]);
secp256k1_u128_accum_u64(&t, b->d[0]);
@@ -119,14 +119,14 @@ static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a,
VERIFY_CHECK(overflow == 0 || overflow == 1);
secp256k1_scalar_reduce(r, overflow);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
return overflow;
}
static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) {
secp256k1_uint128 t;
volatile int vflag = flag;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
VERIFY_CHECK(bit < 256);
bit += ((uint32_t) vflag - 1) & 0x100; /* forcing (bit >> 6) > 3 makes this a noop */
@@ -143,10 +143,8 @@ static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int
secp256k1_u128_accum_u64(&t, ((uint64_t)((bit >> 6) == 3)) << (bit & 0x3F));
r->d[3] = secp256k1_u128_to_u64(&t);
- secp256k1_scalar_verify(r);
-#ifdef VERIFY
+ SECP256K1_SCALAR_VERIFY(r);
VERIFY_CHECK(secp256k1_u128_hi_u64(&t) == 0);
-#endif
}
static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) {
@@ -160,11 +158,11 @@ static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b
*overflow = over;
}
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
secp256k1_write_be64(&bin[0], a->d[3]);
secp256k1_write_be64(&bin[8], a->d[2]);
@@ -173,7 +171,7 @@ static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar*
}
SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
return (a->d[0] | a->d[1] | a->d[2] | a->d[3]) == 0;
}
@@ -181,7 +179,7 @@ SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a)
static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) {
uint64_t nonzero = 0xFFFFFFFFFFFFFFFFULL * (secp256k1_scalar_is_zero(a) == 0);
secp256k1_uint128 t;
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
secp256k1_u128_from_u64(&t, ~a->d[0]);
secp256k1_u128_accum_u64(&t, SECP256K1_N_0 + 1);
@@ -196,11 +194,52 @@ static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar
secp256k1_u128_accum_u64(&t, SECP256K1_N_3);
r->d[3] = secp256k1_u128_to_u64(&t) & nonzero;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
+}
+
+static void secp256k1_scalar_half(secp256k1_scalar *r, const secp256k1_scalar *a) {
+ /* Writing `/` for field division and `//` for integer division, we compute
+ *
+ * a/2 = (a - (a&1))/2 + (a&1)/2
+ * = (a >> 1) + (a&1 ? 1/2 : 0)
+ * = (a >> 1) + (a&1 ? n//2+1 : 0),
+ *
+ * where n is the group order and in the last equality we have used 1/2 = n//2+1 (mod n).
+ * For n//2, we have the constants SECP256K1_N_H_0, ...
+ *
+ * This sum does not overflow. The most extreme case is a = -2, the largest odd scalar. Here:
+ * - the left summand is: a >> 1 = (a - a&1)/2 = (n-2-1)//2 = (n-3)//2
+ * - the right summand is: a&1 ? n//2+1 : 0 = n//2+1 = (n-1)//2 + 2//2 = (n+1)//2
+ * Together they sum to (n-3)//2 + (n+1)//2 = (2n-2)//2 = n - 1, which is less than n.
+ */
+ uint64_t mask = -(uint64_t)(a->d[0] & 1U);
+ secp256k1_uint128 t;
+ SECP256K1_SCALAR_VERIFY(a);
+
+ secp256k1_u128_from_u64(&t, (a->d[0] >> 1) | (a->d[1] << 63));
+ secp256k1_u128_accum_u64(&t, (SECP256K1_N_H_0 + 1U) & mask);
+ r->d[0] = secp256k1_u128_to_u64(&t); secp256k1_u128_rshift(&t, 64);
+ secp256k1_u128_accum_u64(&t, (a->d[1] >> 1) | (a->d[2] << 63));
+ secp256k1_u128_accum_u64(&t, SECP256K1_N_H_1 & mask);
+ r->d[1] = secp256k1_u128_to_u64(&t); secp256k1_u128_rshift(&t, 64);
+ secp256k1_u128_accum_u64(&t, (a->d[2] >> 1) | (a->d[3] << 63));
+ secp256k1_u128_accum_u64(&t, SECP256K1_N_H_2 & mask);
+ r->d[2] = secp256k1_u128_to_u64(&t); secp256k1_u128_rshift(&t, 64);
+ r->d[3] = secp256k1_u128_to_u64(&t) + (a->d[3] >> 1) + (SECP256K1_N_H_3 & mask);
+#ifdef VERIFY
+ /* The line above only computed the bottom 64 bits of r->d[3]; redo the computation
+ * in full 128 bits to make sure the top 64 bits are indeed zero. */
+ secp256k1_u128_accum_u64(&t, a->d[3] >> 1);
+ secp256k1_u128_accum_u64(&t, SECP256K1_N_H_3 & mask);
+ secp256k1_u128_rshift(&t, 64);
+ VERIFY_CHECK(secp256k1_u128_to_u64(&t) == 0);
+
+ SECP256K1_SCALAR_VERIFY(r);
+#endif
}
SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3]) == 0;
}
@@ -208,7 +247,7 @@ SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) {
static int secp256k1_scalar_is_high(const secp256k1_scalar *a) {
int yes = 0;
int no = 0;
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
no |= (a->d[3] < SECP256K1_N_H_3);
yes |= (a->d[3] > SECP256K1_N_H_3) & ~no;
@@ -226,7 +265,7 @@ static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {
uint64_t mask = -vflag;
uint64_t nonzero = (secp256k1_scalar_is_zero(r) != 0) - 1;
secp256k1_uint128 t;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
secp256k1_u128_from_u64(&t, r->d[0] ^ mask);
secp256k1_u128_accum_u64(&t, (SECP256K1_N_0 + 1) & mask);
@@ -241,7 +280,7 @@ static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {
secp256k1_u128_accum_u64(&t, SECP256K1_N_3 & mask);
r->d[3] = secp256k1_u128_to_u64(&t) & nonzero;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
return 2 * (mask == 0) - 1;
}
@@ -800,33 +839,17 @@ static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, c
static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {
uint64_t l[8];
- secp256k1_scalar_verify(a);
- secp256k1_scalar_verify(b);
+ SECP256K1_SCALAR_VERIFY(a);
+ SECP256K1_SCALAR_VERIFY(b);
secp256k1_scalar_mul_512(l, a, b);
secp256k1_scalar_reduce_512(r, l);
- secp256k1_scalar_verify(r);
-}
-
-static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) {
- int ret;
- secp256k1_scalar_verify(r);
- VERIFY_CHECK(n > 0);
- VERIFY_CHECK(n < 16);
-
- ret = r->d[0] & ((1 << n) - 1);
- r->d[0] = (r->d[0] >> n) + (r->d[1] << (64 - n));
- r->d[1] = (r->d[1] >> n) + (r->d[2] << (64 - n));
- r->d[2] = (r->d[2] >> n) + (r->d[3] << (64 - n));
- r->d[3] = (r->d[3] >> n);
-
- secp256k1_scalar_verify(r);
- return ret;
+ SECP256K1_SCALAR_VERIFY(r);
}
static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *k) {
- secp256k1_scalar_verify(k);
+ SECP256K1_SCALAR_VERIFY(k);
r1->d[0] = k->d[0];
r1->d[1] = k->d[1];
@@ -837,13 +860,13 @@ static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r
r2->d[2] = 0;
r2->d[3] = 0;
- secp256k1_scalar_verify(r1);
- secp256k1_scalar_verify(r2);
+ SECP256K1_SCALAR_VERIFY(r1);
+ SECP256K1_SCALAR_VERIFY(r2);
}
SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) {
- secp256k1_scalar_verify(a);
- secp256k1_scalar_verify(b);
+ SECP256K1_SCALAR_VERIFY(a);
+ SECP256K1_SCALAR_VERIFY(b);
return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3])) == 0;
}
@@ -853,8 +876,8 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r,
unsigned int shiftlimbs;
unsigned int shiftlow;
unsigned int shifthigh;
- secp256k1_scalar_verify(a);
- secp256k1_scalar_verify(b);
+ SECP256K1_SCALAR_VERIFY(a);
+ SECP256K1_SCALAR_VERIFY(b);
VERIFY_CHECK(shift >= 256);
secp256k1_scalar_mul_512(l, a, b);
@@ -867,13 +890,13 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r,
r->d[3] = shift < 320 ? (l[3 + shiftlimbs] >> shiftlow) : 0;
secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 6] >> ((shift - 1) & 0x3f)) & 1);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
static SECP256K1_INLINE void secp256k1_scalar_cmov(secp256k1_scalar *r, const secp256k1_scalar *a, int flag) {
uint64_t mask0, mask1;
volatile int vflag = flag;
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
SECP256K1_CHECKMEM_CHECK_VERIFY(r->d, sizeof(r->d));
mask0 = vflag + ~((uint64_t)0);
@@ -883,7 +906,7 @@ static SECP256K1_INLINE void secp256k1_scalar_cmov(secp256k1_scalar *r, const se
r->d[2] = (r->d[2] & mask0) | (a->d[2] & mask1);
r->d[3] = (r->d[3] & mask0) | (a->d[3] & mask1);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
static void secp256k1_scalar_from_signed62(secp256k1_scalar *r, const secp256k1_modinv64_signed62 *a) {
@@ -903,13 +926,13 @@ static void secp256k1_scalar_from_signed62(secp256k1_scalar *r, const secp256k1_
r->d[2] = a2 >> 4 | a3 << 58;
r->d[3] = a3 >> 6 | a4 << 56;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
static void secp256k1_scalar_to_signed62(secp256k1_modinv64_signed62 *r, const secp256k1_scalar *a) {
const uint64_t M62 = UINT64_MAX >> 2;
const uint64_t a0 = a->d[0], a1 = a->d[1], a2 = a->d[2], a3 = a->d[3];
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
r->v[0] = a0 & M62;
r->v[1] = (a0 >> 62 | a1 << 2) & M62;
@@ -928,16 +951,14 @@ static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar
#ifdef VERIFY
int zero_in = secp256k1_scalar_is_zero(x);
#endif
- secp256k1_scalar_verify(x);
+ SECP256K1_SCALAR_VERIFY(x);
secp256k1_scalar_to_signed62(&s, x);
secp256k1_modinv64(&s, &secp256k1_const_modinfo_scalar);
secp256k1_scalar_from_signed62(r, &s);
- secp256k1_scalar_verify(r);
-#ifdef VERIFY
+ SECP256K1_SCALAR_VERIFY(r);
VERIFY_CHECK(secp256k1_scalar_is_zero(r) == zero_in);
-#endif
}
static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *x) {
@@ -945,20 +966,18 @@ static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_sc
#ifdef VERIFY
int zero_in = secp256k1_scalar_is_zero(x);
#endif
- secp256k1_scalar_verify(x);
+ SECP256K1_SCALAR_VERIFY(x);
secp256k1_scalar_to_signed62(&s, x);
secp256k1_modinv64_var(&s, &secp256k1_const_modinfo_scalar);
secp256k1_scalar_from_signed62(r, &s);
- secp256k1_scalar_verify(r);
-#ifdef VERIFY
+ SECP256K1_SCALAR_VERIFY(r);
VERIFY_CHECK(secp256k1_scalar_is_zero(r) == zero_in);
-#endif
}
SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
return !(a->d[0] & 1);
}
diff --git a/src/secp256k1/src/scalar_8x32_impl.h b/src/secp256k1/src/scalar_8x32_impl.h
index 5ca1342273..58ae51bc02 100644
--- a/src/secp256k1/src/scalar_8x32_impl.h
+++ b/src/secp256k1/src/scalar_8x32_impl.h
@@ -59,18 +59,18 @@ SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsig
r->d[6] = 0;
r->d[7] = 0;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
VERIFY_CHECK((offset + count - 1) >> 5 == offset >> 5);
return (a->d[offset >> 5] >> (offset & 0x1F)) & ((1 << count) - 1);
}
SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
VERIFY_CHECK(count < 32);
VERIFY_CHECK(offset + count <= 256);
@@ -121,15 +121,15 @@ SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, uint32_
t += (uint64_t)r->d[7];
r->d[7] = t & 0xFFFFFFFFUL;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
return overflow;
}
static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {
int overflow;
uint64_t t = (uint64_t)a->d[0] + b->d[0];
- secp256k1_scalar_verify(a);
- secp256k1_scalar_verify(b);
+ SECP256K1_SCALAR_VERIFY(a);
+ SECP256K1_SCALAR_VERIFY(b);
r->d[0] = t & 0xFFFFFFFFULL; t >>= 32;
t += (uint64_t)a->d[1] + b->d[1];
@@ -150,14 +150,14 @@ static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a,
VERIFY_CHECK(overflow == 0 || overflow == 1);
secp256k1_scalar_reduce(r, overflow);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
return overflow;
}
static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) {
uint64_t t;
volatile int vflag = flag;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
VERIFY_CHECK(bit < 256);
bit += ((uint32_t) vflag - 1) & 0x100; /* forcing (bit >> 5) > 7 makes this a noop */
@@ -178,10 +178,8 @@ static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int
t += (uint64_t)r->d[7] + (((uint32_t)((bit >> 5) == 7)) << (bit & 0x1F));
r->d[7] = t & 0xFFFFFFFFULL;
- secp256k1_scalar_verify(r);
-#ifdef VERIFY
+ SECP256K1_SCALAR_VERIFY(r);
VERIFY_CHECK((t >> 32) == 0);
-#endif
}
static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) {
@@ -199,11 +197,11 @@ static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b
*overflow = over;
}
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
secp256k1_write_be32(&bin[0], a->d[7]);
secp256k1_write_be32(&bin[4], a->d[6]);
@@ -216,7 +214,7 @@ static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar*
}
SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
return (a->d[0] | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0;
}
@@ -224,7 +222,7 @@ SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a)
static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) {
uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(a) == 0);
uint64_t t = (uint64_t)(~a->d[0]) + SECP256K1_N_0 + 1;
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
r->d[0] = t & nonzero; t >>= 32;
t += (uint64_t)(~a->d[1]) + SECP256K1_N_1;
@@ -242,11 +240,59 @@ static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar
t += (uint64_t)(~a->d[7]) + SECP256K1_N_7;
r->d[7] = t & nonzero;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
+}
+
+static void secp256k1_scalar_half(secp256k1_scalar *r, const secp256k1_scalar *a) {
+ /* Writing `/` for field division and `//` for integer division, we compute
+ *
+ * a/2 = (a - (a&1))/2 + (a&1)/2
+ * = (a >> 1) + (a&1 ? 1/2 : 0)
+ * = (a >> 1) + (a&1 ? n//2+1 : 0),
+ *
+ * where n is the group order and in the last equality we have used 1/2 = n//2+1 (mod n).
+ * For n//2, we have the constants SECP256K1_N_H_0, ...
+ *
+ * This sum does not overflow. The most extreme case is a = -2, the largest odd scalar. Here:
+ * - the left summand is: a >> 1 = (a - a&1)/2 = (n-2-1)//2 = (n-3)//2
+ * - the right summand is: a&1 ? n//2+1 : 0 = n//2+1 = (n-1)//2 + 2//2 = (n+1)//2
+ * Together they sum to (n-3)//2 + (n+1)//2 = (2n-2)//2 = n - 1, which is less than n.
+ */
+ uint32_t mask = -(uint32_t)(a->d[0] & 1U);
+ uint64_t t = (uint32_t)((a->d[0] >> 1) | (a->d[1] << 31));
+ SECP256K1_SCALAR_VERIFY(a);
+
+ t += (SECP256K1_N_H_0 + 1U) & mask;
+ r->d[0] = t; t >>= 32;
+ t += (uint32_t)((a->d[1] >> 1) | (a->d[2] << 31));
+ t += SECP256K1_N_H_1 & mask;
+ r->d[1] = t; t >>= 32;
+ t += (uint32_t)((a->d[2] >> 1) | (a->d[3] << 31));
+ t += SECP256K1_N_H_2 & mask;
+ r->d[2] = t; t >>= 32;
+ t += (uint32_t)((a->d[3] >> 1) | (a->d[4] << 31));
+ t += SECP256K1_N_H_3 & mask;
+ r->d[3] = t; t >>= 32;
+ t += (uint32_t)((a->d[4] >> 1) | (a->d[5] << 31));
+ t += SECP256K1_N_H_4 & mask;
+ r->d[4] = t; t >>= 32;
+ t += (uint32_t)((a->d[5] >> 1) | (a->d[6] << 31));
+ t += SECP256K1_N_H_5 & mask;
+ r->d[5] = t; t >>= 32;
+ t += (uint32_t)((a->d[6] >> 1) | (a->d[7] << 31));
+ t += SECP256K1_N_H_6 & mask;
+ r->d[6] = t; t >>= 32;
+ r->d[7] = (uint32_t)t + (uint32_t)(a->d[7] >> 1) + (SECP256K1_N_H_7 & mask);
+
+ /* The line above only computed the bottom 32 bits of r->d[7]. Redo the computation
+ * in full 64 bits to make sure the top 32 bits are indeed zero. */
+ VERIFY_CHECK((t + (a->d[7] >> 1) + (SECP256K1_N_H_7 & mask)) >> 32 == 0);
+
+ SECP256K1_SCALAR_VERIFY(r);
}
SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
return ((a->d[0] ^ 1) | a->d[1] | a->d[2] | a->d[3] | a->d[4] | a->d[5] | a->d[6] | a->d[7]) == 0;
}
@@ -254,7 +300,7 @@ SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) {
static int secp256k1_scalar_is_high(const secp256k1_scalar *a) {
int yes = 0;
int no = 0;
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
no |= (a->d[7] < SECP256K1_N_H_7);
yes |= (a->d[7] > SECP256K1_N_H_7) & ~no;
@@ -278,7 +324,7 @@ static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {
uint32_t mask = -vflag;
uint32_t nonzero = 0xFFFFFFFFUL * (secp256k1_scalar_is_zero(r) == 0);
uint64_t t = (uint64_t)(r->d[0] ^ mask) + ((SECP256K1_N_0 + 1) & mask);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
r->d[0] = t & nonzero; t >>= 32;
t += (uint64_t)(r->d[1] ^ mask) + (SECP256K1_N_1 & mask);
@@ -296,7 +342,7 @@ static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {
t += (uint64_t)(r->d[7] ^ mask) + (SECP256K1_N_7 & mask);
r->d[7] = t & nonzero;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
return 2 * (mask == 0) - 1;
}
@@ -604,37 +650,17 @@ static void secp256k1_scalar_mul_512(uint32_t *l, const secp256k1_scalar *a, con
static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {
uint32_t l[16];
- secp256k1_scalar_verify(a);
- secp256k1_scalar_verify(b);
+ SECP256K1_SCALAR_VERIFY(a);
+ SECP256K1_SCALAR_VERIFY(b);
secp256k1_scalar_mul_512(l, a, b);
secp256k1_scalar_reduce_512(r, l);
- secp256k1_scalar_verify(r);
-}
-
-static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) {
- int ret;
- secp256k1_scalar_verify(r);
- VERIFY_CHECK(n > 0);
- VERIFY_CHECK(n < 16);
-
- ret = r->d[0] & ((1 << n) - 1);
- r->d[0] = (r->d[0] >> n) + (r->d[1] << (32 - n));
- r->d[1] = (r->d[1] >> n) + (r->d[2] << (32 - n));
- r->d[2] = (r->d[2] >> n) + (r->d[3] << (32 - n));
- r->d[3] = (r->d[3] >> n) + (r->d[4] << (32 - n));
- r->d[4] = (r->d[4] >> n) + (r->d[5] << (32 - n));
- r->d[5] = (r->d[5] >> n) + (r->d[6] << (32 - n));
- r->d[6] = (r->d[6] >> n) + (r->d[7] << (32 - n));
- r->d[7] = (r->d[7] >> n);
-
- secp256k1_scalar_verify(r);
- return ret;
+ SECP256K1_SCALAR_VERIFY(r);
}
static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *k) {
- secp256k1_scalar_verify(k);
+ SECP256K1_SCALAR_VERIFY(k);
r1->d[0] = k->d[0];
r1->d[1] = k->d[1];
@@ -653,13 +679,13 @@ static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r
r2->d[6] = 0;
r2->d[7] = 0;
- secp256k1_scalar_verify(r1);
- secp256k1_scalar_verify(r2);
+ SECP256K1_SCALAR_VERIFY(r1);
+ SECP256K1_SCALAR_VERIFY(r2);
}
SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) {
- secp256k1_scalar_verify(a);
- secp256k1_scalar_verify(b);
+ SECP256K1_SCALAR_VERIFY(a);
+ SECP256K1_SCALAR_VERIFY(b);
return ((a->d[0] ^ b->d[0]) | (a->d[1] ^ b->d[1]) | (a->d[2] ^ b->d[2]) | (a->d[3] ^ b->d[3]) | (a->d[4] ^ b->d[4]) | (a->d[5] ^ b->d[5]) | (a->d[6] ^ b->d[6]) | (a->d[7] ^ b->d[7])) == 0;
}
@@ -669,8 +695,8 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r,
unsigned int shiftlimbs;
unsigned int shiftlow;
unsigned int shifthigh;
- secp256k1_scalar_verify(a);
- secp256k1_scalar_verify(b);
+ SECP256K1_SCALAR_VERIFY(a);
+ SECP256K1_SCALAR_VERIFY(b);
VERIFY_CHECK(shift >= 256);
secp256k1_scalar_mul_512(l, a, b);
@@ -687,13 +713,13 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r,
r->d[7] = shift < 288 ? (l[7 + shiftlimbs] >> shiftlow) : 0;
secp256k1_scalar_cadd_bit(r, 0, (l[(shift - 1) >> 5] >> ((shift - 1) & 0x1f)) & 1);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
static SECP256K1_INLINE void secp256k1_scalar_cmov(secp256k1_scalar *r, const secp256k1_scalar *a, int flag) {
uint32_t mask0, mask1;
volatile int vflag = flag;
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
SECP256K1_CHECKMEM_CHECK_VERIFY(r->d, sizeof(r->d));
mask0 = vflag + ~((uint32_t)0);
@@ -707,7 +733,7 @@ static SECP256K1_INLINE void secp256k1_scalar_cmov(secp256k1_scalar *r, const se
r->d[6] = (r->d[6] & mask0) | (a->d[6] & mask1);
r->d[7] = (r->d[7] & mask0) | (a->d[7] & mask1);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
static void secp256k1_scalar_from_signed30(secp256k1_scalar *r, const secp256k1_modinv32_signed30 *a) {
@@ -736,14 +762,14 @@ static void secp256k1_scalar_from_signed30(secp256k1_scalar *r, const secp256k1_
r->d[6] = a6 >> 12 | a7 << 18;
r->d[7] = a7 >> 14 | a8 << 16;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
static void secp256k1_scalar_to_signed30(secp256k1_modinv32_signed30 *r, const secp256k1_scalar *a) {
const uint32_t M30 = UINT32_MAX >> 2;
const uint32_t a0 = a->d[0], a1 = a->d[1], a2 = a->d[2], a3 = a->d[3],
a4 = a->d[4], a5 = a->d[5], a6 = a->d[6], a7 = a->d[7];
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
r->v[0] = a0 & M30;
r->v[1] = (a0 >> 30 | a1 << 2) & M30;
@@ -766,16 +792,14 @@ static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar
#ifdef VERIFY
int zero_in = secp256k1_scalar_is_zero(x);
#endif
- secp256k1_scalar_verify(x);
+ SECP256K1_SCALAR_VERIFY(x);
secp256k1_scalar_to_signed30(&s, x);
secp256k1_modinv32(&s, &secp256k1_const_modinfo_scalar);
secp256k1_scalar_from_signed30(r, &s);
- secp256k1_scalar_verify(r);
-#ifdef VERIFY
+ SECP256K1_SCALAR_VERIFY(r);
VERIFY_CHECK(secp256k1_scalar_is_zero(r) == zero_in);
-#endif
}
static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *x) {
@@ -783,20 +807,18 @@ static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_sc
#ifdef VERIFY
int zero_in = secp256k1_scalar_is_zero(x);
#endif
- secp256k1_scalar_verify(x);
+ SECP256K1_SCALAR_VERIFY(x);
secp256k1_scalar_to_signed30(&s, x);
secp256k1_modinv32_var(&s, &secp256k1_const_modinfo_scalar);
secp256k1_scalar_from_signed30(r, &s);
- secp256k1_scalar_verify(r);
-#ifdef VERIFY
+ SECP256K1_SCALAR_VERIFY(r);
VERIFY_CHECK(secp256k1_scalar_is_zero(r) == zero_in);
-#endif
}
SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
return !(a->d[0] & 1);
}
diff --git a/src/secp256k1/src/scalar_impl.h b/src/secp256k1/src/scalar_impl.h
index 3eca23b4f9..bbba83e937 100644
--- a/src/secp256k1/src/scalar_impl.h
+++ b/src/secp256k1/src/scalar_impl.h
@@ -31,14 +31,12 @@ static int secp256k1_scalar_set_b32_seckey(secp256k1_scalar *r, const unsigned c
int overflow;
secp256k1_scalar_set_b32(r, bin, &overflow);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
return (!overflow) & (!secp256k1_scalar_is_zero(r));
}
static void secp256k1_scalar_verify(const secp256k1_scalar *r) {
-#ifdef VERIFY
VERIFY_CHECK(secp256k1_scalar_check_overflow(r) == 0);
-#endif
(void)r;
}
@@ -63,7 +61,7 @@ static void secp256k1_scalar_verify(const secp256k1_scalar *r) {
* (arbitrarily) set r2 = k + 5 (mod n) and r1 = k - r2 * lambda (mod n).
*/
static void secp256k1_scalar_split_lambda(secp256k1_scalar * SECP256K1_RESTRICT r1, secp256k1_scalar * SECP256K1_RESTRICT r2, const secp256k1_scalar * SECP256K1_RESTRICT k) {
- secp256k1_scalar_verify(k);
+ SECP256K1_SCALAR_VERIFY(k);
VERIFY_CHECK(r1 != k);
VERIFY_CHECK(r2 != k);
VERIFY_CHECK(r1 != r2);
@@ -71,8 +69,8 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar * SECP256K1_RESTRICT
*r2 = (*k + 5) % EXHAUSTIVE_TEST_ORDER;
*r1 = (*k + (EXHAUSTIVE_TEST_ORDER - *r2) * EXHAUSTIVE_TEST_LAMBDA) % EXHAUSTIVE_TEST_ORDER;
- secp256k1_scalar_verify(r1);
- secp256k1_scalar_verify(r2);
+ SECP256K1_SCALAR_VERIFY(r1);
+ SECP256K1_SCALAR_VERIFY(r2);
}
#else
/**
@@ -155,7 +153,7 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar * SECP256K1_RESTRICT
0xE4437ED6UL, 0x010E8828UL, 0x6F547FA9UL, 0x0ABFE4C4UL,
0x221208ACUL, 0x9DF506C6UL, 0x1571B4AEUL, 0x8AC47F71UL
);
- secp256k1_scalar_verify(k);
+ SECP256K1_SCALAR_VERIFY(k);
VERIFY_CHECK(r1 != k);
VERIFY_CHECK(r2 != k);
VERIFY_CHECK(r1 != r2);
@@ -170,8 +168,8 @@ static void secp256k1_scalar_split_lambda(secp256k1_scalar * SECP256K1_RESTRICT
secp256k1_scalar_negate(r1, r1);
secp256k1_scalar_add(r1, r1, k);
- secp256k1_scalar_verify(r1);
- secp256k1_scalar_verify(r2);
+ SECP256K1_SCALAR_VERIFY(r1);
+ SECP256K1_SCALAR_VERIFY(r2);
#ifdef VERIFY
secp256k1_scalar_split_lambda_verify(r1, r2, k);
#endif
diff --git a/src/secp256k1/src/scalar_low.h b/src/secp256k1/src/scalar_low.h
index 67051bd30b..2711eb932d 100644
--- a/src/secp256k1/src/scalar_low.h
+++ b/src/secp256k1/src/scalar_low.h
@@ -1,5 +1,5 @@
/***********************************************************************
- * Copyright (c) 2015 Andrew Poelstra *
+ * Copyright (c) 2015, 2022 Andrew Poelstra, Pieter Wuille *
* Distributed under the MIT software license, see the accompanying *
* file COPYING or https://www.opensource.org/licenses/mit-license.php.*
***********************************************************************/
@@ -12,6 +12,13 @@
/** A scalar modulo the group order of the secp256k1 curve. */
typedef uint32_t secp256k1_scalar;
-#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) (d0)
+/* A compile-time constant equal to 2^32 (modulo order). */
+#define SCALAR_2P32 ((0xffffffffUL % EXHAUSTIVE_TEST_ORDER) + 1U)
+
+/* Compute a*2^32 + b (modulo order). */
+#define SCALAR_HORNER(a, b) (((uint64_t)(a) * SCALAR_2P32 + (b)) % EXHAUSTIVE_TEST_ORDER)
+
+/* Evaluates to the provided 256-bit constant reduced modulo order. */
+#define SECP256K1_SCALAR_CONST(d7, d6, d5, d4, d3, d2, d1, d0) SCALAR_HORNER(SCALAR_HORNER(SCALAR_HORNER(SCALAR_HORNER(SCALAR_HORNER(SCALAR_HORNER(SCALAR_HORNER((d7), (d6)), (d5)), (d4)), (d3)), (d2)), (d1)), (d0))
#endif /* SECP256K1_SCALAR_REPR_H */
diff --git a/src/secp256k1/src/scalar_low_impl.h b/src/secp256k1/src/scalar_low_impl.h
index e2356a5be1..0895db6a17 100644
--- a/src/secp256k1/src/scalar_low_impl.h
+++ b/src/secp256k1/src/scalar_low_impl.h
@@ -14,7 +14,7 @@
#include <string.h>
SECP256K1_INLINE static int secp256k1_scalar_is_even(const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
return !(*a & 1);
}
@@ -24,11 +24,11 @@ SECP256K1_INLINE static void secp256k1_scalar_clear(secp256k1_scalar *r) { *r =
SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsigned int v) {
*r = v % EXHAUSTIVE_TEST_ORDER;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
if (offset < 32)
return ((*a >> offset) & ((((uint32_t)1) << count) - 1));
@@ -37,7 +37,7 @@ SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits(const secp256k1_s
}
SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256k1_scalar *a, unsigned int offset, unsigned int count) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
return secp256k1_scalar_get_bits(a, offset, count);
}
@@ -45,27 +45,25 @@ SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var(const secp256
SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scalar *a) { return *a >= EXHAUSTIVE_TEST_ORDER; }
static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {
- secp256k1_scalar_verify(a);
- secp256k1_scalar_verify(b);
+ SECP256K1_SCALAR_VERIFY(a);
+ SECP256K1_SCALAR_VERIFY(b);
*r = (*a + *b) % EXHAUSTIVE_TEST_ORDER;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
return *r < *b;
}
static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int flag) {
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
if (flag && bit < 32)
*r += ((uint32_t)1 << bit);
- secp256k1_scalar_verify(r);
-#ifdef VERIFY
+ SECP256K1_SCALAR_VERIFY(r);
VERIFY_CHECK(bit < 32);
/* Verify that adding (1 << bit) will not overflow any in-range scalar *r by overflowing the underlying uint32_t. */
VERIFY_CHECK(((uint32_t)1 << bit) - 1 <= UINT32_MAX - EXHAUSTIVE_TEST_ORDER);
-#endif
}
static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b32, int *overflow) {
@@ -81,24 +79,24 @@ static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b
}
if (overflow) *overflow = over;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
static void secp256k1_scalar_get_b32(unsigned char *bin, const secp256k1_scalar* a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
memset(bin, 0, 32);
bin[28] = *a >> 24; bin[29] = *a >> 16; bin[30] = *a >> 8; bin[31] = *a;
}
SECP256K1_INLINE static int secp256k1_scalar_is_zero(const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
return *a == 0;
}
static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
if (*a == 0) {
*r = 0;
@@ -106,65 +104,52 @@ static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar
*r = EXHAUSTIVE_TEST_ORDER - *a;
}
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
SECP256K1_INLINE static int secp256k1_scalar_is_one(const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
return *a == 1;
}
static int secp256k1_scalar_is_high(const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
return *a > EXHAUSTIVE_TEST_ORDER / 2;
}
static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
if (flag) secp256k1_scalar_negate(r, r);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
return flag ? -1 : 1;
}
static void secp256k1_scalar_mul(secp256k1_scalar *r, const secp256k1_scalar *a, const secp256k1_scalar *b) {
- secp256k1_scalar_verify(a);
- secp256k1_scalar_verify(b);
+ SECP256K1_SCALAR_VERIFY(a);
+ SECP256K1_SCALAR_VERIFY(b);
*r = (*a * *b) % EXHAUSTIVE_TEST_ORDER;
- secp256k1_scalar_verify(r);
-}
-
-static int secp256k1_scalar_shr_int(secp256k1_scalar *r, int n) {
- int ret;
- secp256k1_scalar_verify(r);
- VERIFY_CHECK(n > 0);
- VERIFY_CHECK(n < 16);
-
- ret = *r & ((1 << n) - 1);
- *r >>= n;
-
- secp256k1_scalar_verify(r);
- return ret;
+ SECP256K1_SCALAR_VERIFY(r);
}
static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r2, const secp256k1_scalar *a) {
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
*r1 = *a;
*r2 = 0;
- secp256k1_scalar_verify(r1);
- secp256k1_scalar_verify(r2);
+ SECP256K1_SCALAR_VERIFY(r1);
+ SECP256K1_SCALAR_VERIFY(r2);
}
SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const secp256k1_scalar *b) {
- secp256k1_scalar_verify(a);
- secp256k1_scalar_verify(b);
+ SECP256K1_SCALAR_VERIFY(a);
+ SECP256K1_SCALAR_VERIFY(b);
return *a == *b;
}
@@ -172,37 +157,45 @@ SECP256K1_INLINE static int secp256k1_scalar_eq(const secp256k1_scalar *a, const
static SECP256K1_INLINE void secp256k1_scalar_cmov(secp256k1_scalar *r, const secp256k1_scalar *a, int flag) {
uint32_t mask0, mask1;
volatile int vflag = flag;
- secp256k1_scalar_verify(a);
+ SECP256K1_SCALAR_VERIFY(a);
SECP256K1_CHECKMEM_CHECK_VERIFY(r, sizeof(*r));
mask0 = vflag + ~((uint32_t)0);
mask1 = ~mask0;
*r = (*r & mask0) | (*a & mask1);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
}
static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar *x) {
int i;
*r = 0;
- secp256k1_scalar_verify(x);
+ SECP256K1_SCALAR_VERIFY(x);
for (i = 0; i < EXHAUSTIVE_TEST_ORDER; i++)
if ((i * *x) % EXHAUSTIVE_TEST_ORDER == 1)
*r = i;
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
/* If this VERIFY_CHECK triggers we were given a noninvertible scalar (and thus
* have a composite group order; fix it in exhaustive_tests.c). */
VERIFY_CHECK(*r != 0);
}
static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_scalar *x) {
- secp256k1_scalar_verify(x);
+ SECP256K1_SCALAR_VERIFY(x);
secp256k1_scalar_inverse(r, x);
- secp256k1_scalar_verify(r);
+ SECP256K1_SCALAR_VERIFY(r);
+}
+
+static void secp256k1_scalar_half(secp256k1_scalar *r, const secp256k1_scalar *a) {
+ SECP256K1_SCALAR_VERIFY(a);
+
+ *r = (*a + ((-(uint32_t)(*a & 1)) & EXHAUSTIVE_TEST_ORDER)) >> 1;
+
+ SECP256K1_SCALAR_VERIFY(r);
}
#endif /* SECP256K1_SCALAR_REPR_IMPL_H */
diff --git a/src/secp256k1/src/tests.c b/src/secp256k1/src/tests.c
index d3959406c7..bec1c45585 100644
--- a/src/secp256k1/src/tests.c
+++ b/src/secp256k1/src/tests.c
@@ -23,6 +23,7 @@
#include "../include/secp256k1_preallocated.h"
#include "testrand_impl.h"
#include "checkmem.h"
+#include "testutil.h"
#include "util.h"
#include "../contrib/lax_der_parsing.c"
@@ -52,26 +53,32 @@ static int all_bytes_equal(const void* s, unsigned char value, size_t n) {
return 1;
}
-/* TODO Use CHECK_ILLEGAL(_VOID) everywhere and get rid of the uncounting callback */
-/* CHECK that expr_or_stmt calls the illegal callback of ctx exactly once
- *
- * For checking functions that use ARG_CHECK_VOID */
-#define CHECK_ILLEGAL_VOID(ctx, expr_or_stmt) do { \
- int32_t _calls_to_illegal_callback = 0; \
- secp256k1_callback _saved_illegal_cb = ctx->illegal_callback; \
- secp256k1_context_set_illegal_callback(ctx, \
- counting_illegal_callback_fn, &_calls_to_illegal_callback); \
+#define CHECK_COUNTING_CALLBACK_VOID(ctx, expr_or_stmt, callback, callback_setter) do { \
+ int32_t _calls_to_callback = 0; \
+ secp256k1_callback _saved_callback = ctx->callback; \
+ callback_setter(ctx, counting_callback_fn, &_calls_to_callback); \
{ expr_or_stmt; } \
- ctx->illegal_callback = _saved_illegal_cb; \
- CHECK(_calls_to_illegal_callback == 1); \
+ ctx->callback = _saved_callback; \
+ CHECK(_calls_to_callback == 1); \
} while(0);
-/* CHECK that expr calls the illegal callback of ctx exactly once and that expr == 0
+/* CHECK that expr_or_stmt calls the error or illegal callback of ctx exactly once
+ *
+ * Useful for checking functions that return void (e.g., API functions that use ARG_CHECK_VOID) */
+#define CHECK_ERROR_VOID(ctx, expr_or_stmt) \
+ CHECK_COUNTING_CALLBACK_VOID(ctx, expr_or_stmt, error_callback, secp256k1_context_set_error_callback)
+#define CHECK_ILLEGAL_VOID(ctx, expr_or_stmt) \
+ CHECK_COUNTING_CALLBACK_VOID(ctx, expr_or_stmt, illegal_callback, secp256k1_context_set_illegal_callback)
+
+/* CHECK that
+ * - expr calls the illegal callback of ctx exactly once and,
+ * - expr == 0 (or equivalently, expr == NULL)
*
- * For checking functions that use ARG_CHECK */
+ * Useful for checking functions that return an integer or a pointer. */
#define CHECK_ILLEGAL(ctx, expr) CHECK_ILLEGAL_VOID(ctx, CHECK((expr) == 0))
+#define CHECK_ERROR(ctx, expr) CHECK_ERROR_VOID(ctx, CHECK((expr) == 0))
-static void counting_illegal_callback_fn(const char* str, void* data) {
+static void counting_callback_fn(const char* str, void* data) {
/* Dummy callback function that just counts. */
int32_t *p;
(void)str;
@@ -273,55 +280,34 @@ static void run_deprecated_context_flags_test(void) {
}
static void run_ec_illegal_argument_tests(void) {
- int ecount = 0;
- int ecount2 = 10;
secp256k1_pubkey pubkey;
secp256k1_pubkey zero_pubkey;
secp256k1_ecdsa_signature sig;
unsigned char ctmp[32];
/* Setup */
- secp256k1_context_set_illegal_callback(STATIC_CTX, counting_illegal_callback_fn, &ecount);
- secp256k1_context_set_illegal_callback(CTX, counting_illegal_callback_fn, &ecount2);
memset(ctmp, 1, 32);
memset(&zero_pubkey, 0, sizeof(zero_pubkey));
/* Verify context-type checking illegal-argument errors. */
- CHECK(secp256k1_ec_pubkey_create(STATIC_CTX, &pubkey, ctmp) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(STATIC_CTX, secp256k1_ec_pubkey_create(STATIC_CTX, &pubkey, ctmp));
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, ctmp) == 1);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
- CHECK(secp256k1_ecdsa_sign(STATIC_CTX, &sig, ctmp, ctmp, NULL, NULL) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(STATIC_CTX, secp256k1_ecdsa_sign(STATIC_CTX, &sig, ctmp, ctmp, NULL, NULL));
SECP256K1_CHECKMEM_UNDEFINE(&sig, sizeof(sig));
CHECK(secp256k1_ecdsa_sign(CTX, &sig, ctmp, ctmp, NULL, NULL) == 1);
SECP256K1_CHECKMEM_CHECK(&sig, sizeof(sig));
- CHECK(ecount2 == 10);
CHECK(secp256k1_ecdsa_verify(CTX, &sig, ctmp, &pubkey) == 1);
- CHECK(ecount2 == 10);
CHECK(secp256k1_ecdsa_verify(STATIC_CTX, &sig, ctmp, &pubkey) == 1);
- CHECK(ecount == 2);
CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp) == 1);
- CHECK(ecount2 == 10);
CHECK(secp256k1_ec_pubkey_tweak_add(STATIC_CTX, &pubkey, ctmp) == 1);
- CHECK(ecount == 2);
CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, ctmp) == 1);
- CHECK(ecount2 == 10);
CHECK(secp256k1_ec_pubkey_negate(STATIC_CTX, &pubkey) == 1);
- CHECK(ecount == 2);
CHECK(secp256k1_ec_pubkey_negate(CTX, &pubkey) == 1);
- CHECK(ecount == 2);
- CHECK(secp256k1_ec_pubkey_negate(STATIC_CTX, &zero_pubkey) == 0);
- CHECK(ecount == 3);
- CHECK(secp256k1_ec_pubkey_negate(CTX, NULL) == 0);
- CHECK(ecount2 == 11);
+ CHECK_ILLEGAL(STATIC_CTX, secp256k1_ec_pubkey_negate(STATIC_CTX, &zero_pubkey));
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_negate(CTX, NULL));
CHECK(secp256k1_ec_pubkey_tweak_mul(STATIC_CTX, &pubkey, ctmp) == 1);
- CHECK(ecount == 3);
-
- /* Clean up */
- secp256k1_context_set_illegal_callback(STATIC_CTX, NULL, NULL);
- secp256k1_context_set_illegal_callback(CTX, NULL, NULL);
}
static void run_static_context_tests(int use_prealloc) {
@@ -356,8 +342,8 @@ static void run_static_context_tests(int use_prealloc) {
{
/* Verify that setting and resetting illegal callback works */
int32_t dummy = 0;
- secp256k1_context_set_illegal_callback(STATIC_CTX, counting_illegal_callback_fn, &dummy);
- CHECK(STATIC_CTX->illegal_callback.fn == counting_illegal_callback_fn);
+ secp256k1_context_set_illegal_callback(STATIC_CTX, counting_callback_fn, &dummy);
+ CHECK(STATIC_CTX->illegal_callback.fn == counting_callback_fn);
CHECK(STATIC_CTX->illegal_callback.data == &dummy);
secp256k1_context_set_illegal_callback(STATIC_CTX, NULL, NULL);
CHECK(STATIC_CTX->illegal_callback.fn == secp256k1_default_illegal_callback_fn);
@@ -448,8 +434,8 @@ static void run_proper_context_tests(int use_prealloc) {
CHECK(context_eq(my_ctx, my_ctx_fresh));
/* Verify that setting and resetting illegal callback works */
- secp256k1_context_set_illegal_callback(my_ctx, counting_illegal_callback_fn, &dummy);
- CHECK(my_ctx->illegal_callback.fn == counting_illegal_callback_fn);
+ secp256k1_context_set_illegal_callback(my_ctx, counting_callback_fn, &dummy);
+ CHECK(my_ctx->illegal_callback.fn == counting_callback_fn);
CHECK(my_ctx->illegal_callback.data == &dummy);
secp256k1_context_set_illegal_callback(my_ctx, NULL, NULL);
CHECK(my_ctx->illegal_callback.fn == secp256k1_default_illegal_callback_fn);
@@ -490,19 +476,14 @@ static void run_proper_context_tests(int use_prealloc) {
static void run_scratch_tests(void) {
const size_t adj_alloc = ((500 + ALIGNMENT - 1) / ALIGNMENT) * ALIGNMENT;
- int32_t ecount = 0;
size_t checkpoint;
size_t checkpoint_2;
secp256k1_scratch_space *scratch;
secp256k1_scratch_space local_scratch;
- secp256k1_context_set_illegal_callback(CTX, counting_illegal_callback_fn, &ecount);
- secp256k1_context_set_error_callback(CTX, counting_illegal_callback_fn, &ecount);
-
/* Test public API */
scratch = secp256k1_scratch_space_create(CTX, 1000);
CHECK(scratch != NULL);
- CHECK(ecount == 0);
/* Test internal API */
CHECK(secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 0) == 1000);
@@ -535,22 +516,16 @@ static void run_scratch_tests(void) {
/* try to apply a bad checkpoint */
checkpoint_2 = secp256k1_scratch_checkpoint(&CTX->error_callback, scratch);
secp256k1_scratch_apply_checkpoint(&CTX->error_callback, scratch, checkpoint);
- CHECK(ecount == 0);
- secp256k1_scratch_apply_checkpoint(&CTX->error_callback, scratch, checkpoint_2); /* checkpoint_2 is after checkpoint */
- CHECK(ecount == 1);
- secp256k1_scratch_apply_checkpoint(&CTX->error_callback, scratch, (size_t) -1); /* this is just wildly invalid */
- CHECK(ecount == 2);
+ CHECK_ERROR_VOID(CTX, secp256k1_scratch_apply_checkpoint(&CTX->error_callback, scratch, checkpoint_2)); /* checkpoint_2 is after checkpoint */
+ CHECK_ERROR_VOID(CTX, secp256k1_scratch_apply_checkpoint(&CTX->error_callback, scratch, (size_t) -1)); /* this is just wildly invalid */
/* try to use badly initialized scratch space */
secp256k1_scratch_space_destroy(CTX, scratch);
memset(&local_scratch, 0, sizeof(local_scratch));
scratch = &local_scratch;
- CHECK(!secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 0));
- CHECK(ecount == 3);
- CHECK(secp256k1_scratch_alloc(&CTX->error_callback, scratch, 500) == NULL);
- CHECK(ecount == 4);
- secp256k1_scratch_space_destroy(CTX, scratch);
- CHECK(ecount == 5);
+ CHECK_ERROR(CTX, secp256k1_scratch_max_allocation(&CTX->error_callback, scratch, 0));
+ CHECK_ERROR(CTX, secp256k1_scratch_alloc(&CTX->error_callback, scratch, 500));
+ CHECK_ERROR_VOID(CTX, secp256k1_scratch_space_destroy(CTX, scratch));
/* Test that large integers do not wrap around in a bad way */
scratch = secp256k1_scratch_space_create(CTX, 1000);
@@ -566,9 +541,6 @@ static void run_scratch_tests(void) {
/* cleanup */
secp256k1_scratch_space_destroy(CTX, NULL); /* no-op */
-
- secp256k1_context_set_illegal_callback(CTX, NULL, NULL);
- secp256k1_context_set_error_callback(CTX, NULL, NULL);
}
static void run_ctz_tests(void) {
@@ -848,7 +820,6 @@ static void run_rfc6979_hmac_sha256_tests(void) {
}
static void run_tagged_sha256_tests(void) {
- int ecount = 0;
unsigned char tag[32] = { 0 };
unsigned char msg[32] = { 0 };
unsigned char hash32[32];
@@ -859,16 +830,11 @@ static void run_tagged_sha256_tests(void) {
0xE2, 0x76, 0x55, 0x9A, 0x3B, 0xDE, 0x55, 0xB3
};
- secp256k1_context_set_illegal_callback(CTX, counting_illegal_callback_fn, &ecount);
-
/* API test */
CHECK(secp256k1_tagged_sha256(CTX, hash32, tag, sizeof(tag), msg, sizeof(msg)) == 1);
- CHECK(secp256k1_tagged_sha256(CTX, NULL, tag, sizeof(tag), msg, sizeof(msg)) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_tagged_sha256(CTX, hash32, NULL, 0, msg, sizeof(msg)) == 0);
- CHECK(ecount == 2);
- CHECK(secp256k1_tagged_sha256(CTX, hash32, tag, sizeof(tag), NULL, 0) == 0);
- CHECK(ecount == 3);
+ CHECK_ILLEGAL(CTX, secp256k1_tagged_sha256(CTX, NULL, tag, sizeof(tag), msg, sizeof(msg)));
+ CHECK_ILLEGAL(CTX, secp256k1_tagged_sha256(CTX, hash32, NULL, 0, msg, sizeof(msg)));
+ CHECK_ILLEGAL(CTX, secp256k1_tagged_sha256(CTX, hash32, tag, sizeof(tag), NULL, 0));
/* Static test vector */
memcpy(tag, "tag", 3);
@@ -2215,20 +2181,6 @@ static void scalar_test(void) {
}
{
- /* test secp256k1_scalar_shr_int */
- secp256k1_scalar r;
- int i;
- random_scalar_order_test(&r);
- for (i = 0; i < 100; ++i) {
- int low;
- int shift = 1 + secp256k1_testrand_int(15);
- int expected = r.d[0] % (1ULL << shift);
- low = secp256k1_scalar_shr_int(&r, shift);
- CHECK(expected == low);
- }
- }
-
- {
/* Test commutativity of add. */
secp256k1_scalar r1, r2;
secp256k1_scalar_add(&r1, &s1, &s2);
@@ -2319,6 +2271,13 @@ static void scalar_test(void) {
CHECK(secp256k1_scalar_eq(&r1, &secp256k1_scalar_zero));
}
+ {
+ /* Test halving. */
+ secp256k1_scalar r;
+ secp256k1_scalar_add(&r, &s, &s);
+ secp256k1_scalar_half(&r, &r);
+ CHECK(secp256k1_scalar_eq(&r, &s));
+ }
}
static void run_scalar_set_b32_seckey_tests(void) {
@@ -2372,6 +2331,38 @@ static void run_scalar_tests(void) {
}
{
+ /* Test that halving and doubling roundtrips on some fixed values. */
+ static const secp256k1_scalar HALF_TESTS[] = {
+ /* 0 */
+ SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 0),
+ /* 1 */
+ SECP256K1_SCALAR_CONST(0, 0, 0, 0, 0, 0, 0, 1),
+ /* -1 */
+ SECP256K1_SCALAR_CONST(0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffeul, 0xbaaedce6ul, 0xaf48a03bul, 0xbfd25e8cul, 0xd0364140ul),
+ /* -2 (largest odd value) */
+ SECP256K1_SCALAR_CONST(0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffeul, 0xbaaedce6ul, 0xaf48a03bul, 0xbfd25e8cul, 0xd036413Ful),
+ /* Half the secp256k1 order */
+ SECP256K1_SCALAR_CONST(0x7ffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0x5d576e73ul, 0x57a4501dul, 0xdfe92f46ul, 0x681b20a0ul),
+ /* Half the secp256k1 order + 1 */
+ SECP256K1_SCALAR_CONST(0x7ffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0x5d576e73ul, 0x57a4501dul, 0xdfe92f46ul, 0x681b20a1ul),
+ /* 2^255 */
+ SECP256K1_SCALAR_CONST(0x80000000ul, 0, 0, 0, 0, 0, 0, 0),
+ /* 2^255 - 1 */
+ SECP256K1_SCALAR_CONST(0x7ffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful, 0xfffffffful),
+ };
+ unsigned n;
+ for (n = 0; n < sizeof(HALF_TESTS) / sizeof(HALF_TESTS[0]); ++n) {
+ secp256k1_scalar s;
+ secp256k1_scalar_half(&s, &HALF_TESTS[n]);
+ secp256k1_scalar_add(&s, &s, &s);
+ CHECK(secp256k1_scalar_eq(&s, &HALF_TESTS[n]));
+ secp256k1_scalar_add(&s, &s, &s);
+ secp256k1_scalar_half(&s, &s);
+ CHECK(secp256k1_scalar_eq(&s, &HALF_TESTS[n]));
+ }
+ }
+
+ {
/* Does check_overflow check catch all ones? */
static const secp256k1_scalar overflowed = SECP256K1_SCALAR_CONST(
0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL, 0xFFFFFFFFUL,
@@ -2956,29 +2947,6 @@ static void run_scalar_tests(void) {
/***** FIELD TESTS *****/
-static void random_fe(secp256k1_fe *x) {
- unsigned char bin[32];
- do {
- secp256k1_testrand256(bin);
- if (secp256k1_fe_set_b32_limit(x, bin)) {
- return;
- }
- } while(1);
-}
-
-static void random_fe_non_zero(secp256k1_fe *nz) {
- int tries = 10;
- while (--tries >= 0) {
- random_fe(nz);
- secp256k1_fe_normalize(nz);
- if (!secp256k1_fe_is_zero(nz)) {
- break;
- }
- }
- /* Infinitesimal probability of spurious failure here */
- CHECK(tries >= 0);
-}
-
static void random_fe_non_square(secp256k1_fe *ns) {
secp256k1_fe r;
random_fe_non_zero(ns);
@@ -3698,15 +3666,6 @@ static void run_inverse_tests(void)
/***** GROUP TESTS *****/
-static void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) {
- CHECK(a->infinity == b->infinity);
- if (a->infinity) {
- return;
- }
- CHECK(secp256k1_fe_equal(&a->x, &b->x));
- CHECK(secp256k1_fe_equal(&a->y, &b->y));
-}
-
/* This compares jacobian points including their Z, not just their geometric meaning. */
static int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b) {
secp256k1_gej a2;
@@ -3729,23 +3688,6 @@ static int gej_xyz_equals_gej(const secp256k1_gej *a, const secp256k1_gej *b) {
return ret;
}
-static void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) {
- secp256k1_fe z2s;
- secp256k1_fe u1, u2, s1, s2;
- CHECK(a->infinity == b->infinity);
- if (a->infinity) {
- return;
- }
- /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */
- secp256k1_fe_sqr(&z2s, &b->z);
- secp256k1_fe_mul(&u1, &a->x, &z2s);
- u2 = b->x;
- secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z);
- s2 = b->y;
- CHECK(secp256k1_fe_equal(&u1, &u2));
- CHECK(secp256k1_fe_equal(&s1, &s2));
-}
-
static void test_ge(void) {
int i, i1;
int runs = 6;
@@ -3764,11 +3706,12 @@ static void test_ge(void) {
secp256k1_ge_clear(&ge[0]);
secp256k1_ge_set_gej_var(&ge[0], &gej[0]);
for (i = 0; i < runs; i++) {
- int j;
+ int j, k;
secp256k1_ge g;
random_group_element_test(&g);
if (i >= runs - 2) {
secp256k1_ge_mul_lambda(&g, &ge[1]);
+ CHECK(!secp256k1_ge_eq_var(&g, &ge[1]));
}
if (i >= runs - 1) {
secp256k1_ge_mul_lambda(&g, &g);
@@ -3788,6 +3731,16 @@ static void test_ge(void) {
random_gej_y_magnitude(&gej[1 + j + 4 * i]);
random_gej_z_magnitude(&gej[1 + j + 4 * i]);
}
+
+ for (j = 0; j < 4; ++j) {
+ for (k = 0; k < 4; ++k) {
+ int expect_equal = (j >> 1) == (k >> 1);
+ CHECK(secp256k1_ge_eq_var(&ge[1 + j + 4 * i], &ge[1 + k + 4 * i]) == expect_equal);
+ CHECK(secp256k1_gej_eq_var(&gej[1 + j + 4 * i], &gej[1 + k + 4 * i]) == expect_equal);
+ CHECK(secp256k1_gej_eq_ge_var(&gej[1 + j + 4 * i], &ge[1 + k + 4 * i]) == expect_equal);
+ CHECK(secp256k1_gej_eq_ge_var(&gej[1 + k + 4 * i], &ge[1 + j + 4 * i]) == expect_equal);
+ }
+ }
}
/* Generate random zf, and zfi2 = 1/zf^2, zfi3 = 1/zf^3 */
@@ -3817,7 +3770,7 @@ static void test_ge(void) {
/* Test gej + ge with Z ratio result (var). */
secp256k1_gej_add_ge_var(&resj, &gej[i1], &ge[i2], secp256k1_gej_is_infinity(&gej[i1]) ? NULL : &zr);
- ge_equals_gej(&ref, &resj);
+ CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
if (!secp256k1_gej_is_infinity(&gej[i1]) && !secp256k1_gej_is_infinity(&resj)) {
secp256k1_fe zrz; secp256k1_fe_mul(&zrz, &zr, &gej[i1].z);
CHECK(secp256k1_fe_equal(&zrz, &resj.z));
@@ -3831,14 +3784,14 @@ static void test_ge(void) {
random_ge_x_magnitude(&ge2_zfi);
random_ge_y_magnitude(&ge2_zfi);
secp256k1_gej_add_zinv_var(&resj, &gej[i1], &ge2_zfi, &zf);
- ge_equals_gej(&ref, &resj);
+ CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
}
/* Test gej + ge (const). */
if (i2 != 0) {
/* secp256k1_gej_add_ge does not support its second argument being infinity. */
secp256k1_gej_add_ge(&resj, &gej[i1], &ge[i2]);
- ge_equals_gej(&ref, &resj);
+ CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
}
/* Test doubling (var). */
@@ -3846,16 +3799,16 @@ static void test_ge(void) {
secp256k1_fe zr2;
/* Normal doubling with Z ratio result. */
secp256k1_gej_double_var(&resj, &gej[i1], &zr2);
- ge_equals_gej(&ref, &resj);
+ CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
/* Check Z ratio. */
secp256k1_fe_mul(&zr2, &zr2, &gej[i1].z);
CHECK(secp256k1_fe_equal(&zr2, &resj.z));
/* Normal doubling. */
secp256k1_gej_double_var(&resj, &gej[i2], NULL);
- ge_equals_gej(&ref, &resj);
+ CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
/* Constant-time doubling. */
secp256k1_gej_double(&resj, &gej[i2]);
- ge_equals_gej(&ref, &resj);
+ CHECK(secp256k1_gej_eq_ge_var(&resj, &ref));
}
/* Test adding opposites. */
@@ -3867,12 +3820,12 @@ static void test_ge(void) {
if (i1 == 0) {
CHECK(secp256k1_ge_is_infinity(&ge[i1]));
CHECK(secp256k1_gej_is_infinity(&gej[i1]));
- ge_equals_gej(&ref, &gej[i2]);
+ CHECK(secp256k1_gej_eq_ge_var(&gej[i2], &ref));
}
if (i2 == 0) {
CHECK(secp256k1_ge_is_infinity(&ge[i2]));
CHECK(secp256k1_gej_is_infinity(&gej[i2]));
- ge_equals_gej(&ref, &gej[i1]);
+ CHECK(secp256k1_gej_eq_ge_var(&gej[i1], &ref));
}
}
}
@@ -3907,7 +3860,7 @@ static void test_ge(void) {
secp256k1_fe s;
random_fe_non_zero(&s);
secp256k1_gej_rescale(&gej[i], &s);
- ge_equals_gej(&ge_set_all[i], &gej[i]);
+ CHECK(secp256k1_gej_eq_ge_var(&gej[i], &ge_set_all[i]));
}
free(ge_set_all);
}
@@ -3951,7 +3904,7 @@ static void test_ge(void) {
secp256k1_ge_set_all_gej_var(ge, gej, 4 * runs + 1);
/* check result */
for (i = 0; i < 4 * runs + 1; i++) {
- ge_equals_gej(&ge[i], &gej[i]);
+ CHECK(secp256k1_gej_eq_ge_var(&gej[i], &ge[i]));
}
/* Test batch gej -> ge conversion with all infinities. */
@@ -4050,15 +4003,15 @@ static void test_add_neg_y_diff_x(void) {
secp256k1_gej_add_var(&resj, &aj, &bj, NULL);
secp256k1_ge_set_gej(&res, &resj);
- ge_equals_gej(&res, &sumj);
+ CHECK(secp256k1_gej_eq_ge_var(&sumj, &res));
secp256k1_gej_add_ge(&resj, &aj, &b);
secp256k1_ge_set_gej(&res, &resj);
- ge_equals_gej(&res, &sumj);
+ CHECK(secp256k1_gej_eq_ge_var(&sumj, &res));
secp256k1_gej_add_ge_var(&resj, &aj, &b, NULL);
secp256k1_ge_set_gej(&res, &resj);
- ge_equals_gej(&res, &sumj);
+ CHECK(secp256k1_gej_eq_ge_var(&sumj, &res));
}
static void run_ge(void) {
@@ -4351,10 +4304,10 @@ static void test_point_times_order(const secp256k1_gej *point) {
CHECK(secp256k1_ge_is_infinity(&res3));
secp256k1_ecmult(&res1, point, &secp256k1_scalar_one, &secp256k1_scalar_zero);
secp256k1_ge_set_gej(&res3, &res1);
- ge_equals_gej(&res3, point);
+ CHECK(secp256k1_gej_eq_ge_var(point, &res3));
secp256k1_ecmult(&res1, point, &secp256k1_scalar_zero, &secp256k1_scalar_one);
secp256k1_ge_set_gej(&res3, &res1);
- ge_equals_ge(&res3, &secp256k1_ge_const_g);
+ CHECK(secp256k1_ge_eq_var(&secp256k1_ge_const_g, &res3));
}
/* These scalars reach large (in absolute value) outputs when fed to secp256k1_scalar_split_lambda.
@@ -4482,7 +4435,7 @@ static void ecmult_const_random_mult(void) {
secp256k1_ecmult_const(&b, &a, &xn);
CHECK(secp256k1_ge_is_valid_var(&a));
- ge_equals_gej(&expected_b, &b);
+ CHECK(secp256k1_gej_eq_ge_var(&b, &expected_b));
}
static void ecmult_const_commutativity(void) {
@@ -4503,27 +4456,76 @@ static void ecmult_const_commutativity(void) {
secp256k1_ecmult_const(&res2, &mid2, &a);
secp256k1_ge_set_gej(&mid1, &res1);
secp256k1_ge_set_gej(&mid2, &res2);
- ge_equals_ge(&mid1, &mid2);
+ CHECK(secp256k1_ge_eq_var(&mid1, &mid2));
}
static void ecmult_const_mult_zero_one(void) {
+ secp256k1_scalar s;
secp256k1_scalar negone;
secp256k1_gej res1;
secp256k1_ge res2;
secp256k1_ge point;
- secp256k1_scalar_negate(&negone, &secp256k1_scalar_one);
+ secp256k1_ge inf;
+ random_scalar_order_test(&s);
+ secp256k1_scalar_negate(&negone, &secp256k1_scalar_one);
random_group_element_test(&point);
+ secp256k1_ge_set_infinity(&inf);
+
+ /* 0*point */
secp256k1_ecmult_const(&res1, &point, &secp256k1_scalar_zero);
- secp256k1_ge_set_gej(&res2, &res1);
- CHECK(secp256k1_ge_is_infinity(&res2));
+ CHECK(secp256k1_gej_is_infinity(&res1));
+
+ /* s*inf */
+ secp256k1_ecmult_const(&res1, &inf, &s);
+ CHECK(secp256k1_gej_is_infinity(&res1));
+
+ /* 1*point */
secp256k1_ecmult_const(&res1, &point, &secp256k1_scalar_one);
secp256k1_ge_set_gej(&res2, &res1);
- ge_equals_ge(&res2, &point);
+ CHECK(secp256k1_ge_eq_var(&res2, &point));
+
+ /* -1*point */
secp256k1_ecmult_const(&res1, &point, &negone);
secp256k1_gej_neg(&res1, &res1);
secp256k1_ge_set_gej(&res2, &res1);
- ge_equals_ge(&res2, &point);
+ CHECK(secp256k1_ge_eq_var(&res2, &point));
+}
+
+static void ecmult_const_check_result(const secp256k1_ge *A, const secp256k1_scalar* q, const secp256k1_gej *res) {
+ secp256k1_gej pointj, res2j;
+ secp256k1_ge res2;
+ secp256k1_gej_set_ge(&pointj, A);
+ secp256k1_ecmult(&res2j, &pointj, q, &secp256k1_scalar_zero);
+ secp256k1_ge_set_gej(&res2, &res2j);
+ CHECK(secp256k1_gej_eq_ge_var(res, &res2));
+}
+
+static void ecmult_const_edges(void) {
+ secp256k1_scalar q;
+ secp256k1_ge point;
+ secp256k1_gej res;
+ size_t i;
+ size_t cases = 1 + sizeof(scalars_near_split_bounds) / sizeof(scalars_near_split_bounds[0]);
+
+ /* We are trying to reach the following edge cases (variables are defined as
+ * in ecmult_const_impl.h):
+ * 1. i = 0: s = 0 <=> q = -K
+ * 2. i > 0: v1, v2 large values
+ * <=> s1, s2 large values
+ * <=> s = scalars_near_split_bounds[i]
+ * <=> q = 2*scalars_near_split_bounds[i] - K
+ */
+ for (i = 0; i < cases; ++i) {
+ secp256k1_scalar_negate(&q, &secp256k1_ecmult_const_K);
+ if (i > 0) {
+ secp256k1_scalar_add(&q, &q, &scalars_near_split_bounds[i - 1]);
+ secp256k1_scalar_add(&q, &q, &scalars_near_split_bounds[i - 1]);
+ }
+ random_group_element_test(&point);
+ secp256k1_ecmult_const(&res, &point, &q);
+ ecmult_const_check_result(&point, &q, &res);
+ }
}
static void ecmult_const_mult_xonly(void) {
@@ -4604,11 +4606,12 @@ static void ecmult_const_chain_multiply(void) {
secp256k1_ecmult_const(&point, &tmp, &scalar);
}
secp256k1_ge_set_gej(&res, &point);
- ge_equals_gej(&res, &expected_point);
+ CHECK(secp256k1_gej_eq_ge_var(&expected_point, &res));
}
static void run_ecmult_const_tests(void) {
ecmult_const_mult_zero_one();
+ ecmult_const_edges();
ecmult_const_random_mult();
ecmult_const_commutativity();
ecmult_const_chain_multiply();
@@ -5269,73 +5272,17 @@ static void test_wnaf(const secp256k1_scalar *number, int w) {
CHECK(secp256k1_scalar_eq(&x, number)); /* check that wnaf represents number */
}
-static void test_constant_wnaf_negate(const secp256k1_scalar *number) {
- secp256k1_scalar neg1 = *number;
- secp256k1_scalar neg2 = *number;
- int sign1 = 1;
- int sign2 = 1;
-
- if (!secp256k1_scalar_get_bits(&neg1, 0, 1)) {
- secp256k1_scalar_negate(&neg1, &neg1);
- sign1 = -1;
- }
- sign2 = secp256k1_scalar_cond_negate(&neg2, secp256k1_scalar_is_even(&neg2));
- CHECK(sign1 == sign2);
- CHECK(secp256k1_scalar_eq(&neg1, &neg2));
-}
-
-static void test_constant_wnaf(const secp256k1_scalar *number, int w) {
- secp256k1_scalar x, shift;
- int wnaf[256] = {0};
- int i;
- int skew;
- int bits = 256;
- secp256k1_scalar num = *number;
- secp256k1_scalar scalar_skew;
-
- secp256k1_scalar_set_int(&x, 0);
- secp256k1_scalar_set_int(&shift, 1 << w);
- for (i = 0; i < 16; ++i) {
- secp256k1_scalar_shr_int(&num, 8);
- }
- bits = 128;
- skew = secp256k1_wnaf_const(wnaf, &num, w, bits);
-
- for (i = WNAF_SIZE_BITS(bits, w); i >= 0; --i) {
- secp256k1_scalar t;
- int v = wnaf[i];
- CHECK(v != 0); /* check nonzero */
- CHECK(v & 1); /* check parity */
- CHECK(v > -(1 << w)); /* check range above */
- CHECK(v < (1 << w)); /* check range below */
-
- secp256k1_scalar_mul(&x, &x, &shift);
- if (v >= 0) {
- secp256k1_scalar_set_int(&t, v);
- } else {
- secp256k1_scalar_set_int(&t, -v);
- secp256k1_scalar_negate(&t, &t);
- }
- secp256k1_scalar_add(&x, &x, &t);
- }
- /* Skew num because when encoding numbers as odd we use an offset */
- secp256k1_scalar_set_int(&scalar_skew, skew);
- secp256k1_scalar_add(&num, &num, &scalar_skew);
- CHECK(secp256k1_scalar_eq(&x, &num));
-}
-
static void test_fixed_wnaf(const secp256k1_scalar *number, int w) {
secp256k1_scalar x, shift;
int wnaf[256] = {0};
int i;
int skew;
- secp256k1_scalar num = *number;
+ secp256k1_scalar num, unused;
secp256k1_scalar_set_int(&x, 0);
secp256k1_scalar_set_int(&shift, 1 << w);
- for (i = 0; i < 16; ++i) {
- secp256k1_scalar_shr_int(&num, 8);
- }
+ /* Make num a 128-bit scalar. */
+ secp256k1_scalar_split_128(&num, &unused, number);
skew = secp256k1_wnaf_fixed(wnaf, &num, w);
for (i = WNAF_SIZE(w)-1; i >= 0; --i) {
@@ -5427,32 +5374,7 @@ static void test_fixed_wnaf_small(void) {
static void run_wnaf(void) {
int i;
- secp256k1_scalar n = {{0}};
-
- test_constant_wnaf(&n, 4);
- /* Sanity check: 1 and 2 are the smallest odd and even numbers and should
- * have easier-to-diagnose failure modes */
- n.d[0] = 1;
- test_constant_wnaf(&n, 4);
- n.d[0] = 2;
- test_constant_wnaf(&n, 4);
- /* Test -1, because it's a special case in wnaf_const */
- n = secp256k1_scalar_one;
- secp256k1_scalar_negate(&n, &n);
- test_constant_wnaf(&n, 4);
-
- /* Test -2, which may not lead to overflows in wnaf_const */
- secp256k1_scalar_add(&n, &secp256k1_scalar_one, &secp256k1_scalar_one);
- secp256k1_scalar_negate(&n, &n);
- test_constant_wnaf(&n, 4);
-
- /* Test (1/2) - 1 = 1/-2 and 1/2 = (1/-2) + 1
- as corner cases of negation handling in wnaf_const */
- secp256k1_scalar_inverse(&n, &n);
- test_constant_wnaf(&n, 4);
-
- secp256k1_scalar_add(&n, &n, &secp256k1_scalar_one);
- test_constant_wnaf(&n, 4);
+ secp256k1_scalar n;
/* Test 0 for fixed wnaf */
test_fixed_wnaf_small();
@@ -5460,8 +5382,6 @@ static void run_wnaf(void) {
for (i = 0; i < COUNT; i++) {
random_scalar_order(&n);
test_wnaf(&n, 4+(i%10));
- test_constant_wnaf_negate(&n);
- test_constant_wnaf(&n, 4 + (i % 10));
test_fixed_wnaf(&n, 4 + (i % 10));
}
secp256k1_scalar_set_int(&n, 0);
@@ -5494,11 +5414,11 @@ static void test_ecmult_accumulate(secp256k1_sha256* acc, const secp256k1_scalar
secp256k1_ecmult_multi_var(NULL, scratch, &rj5, &secp256k1_scalar_zero, test_ecmult_accumulate_cb, (void*)x, 1);
secp256k1_ecmult_const(&rj6, &secp256k1_ge_const_g, x);
secp256k1_ge_set_gej_var(&r, &rj1);
- ge_equals_gej(&r, &rj2);
- ge_equals_gej(&r, &rj3);
- ge_equals_gej(&r, &rj4);
- ge_equals_gej(&r, &rj5);
- ge_equals_gej(&r, &rj6);
+ CHECK(secp256k1_gej_eq_ge_var(&rj2, &r));
+ CHECK(secp256k1_gej_eq_ge_var(&rj3, &r));
+ CHECK(secp256k1_gej_eq_ge_var(&rj4, &r));
+ CHECK(secp256k1_gej_eq_ge_var(&rj5, &r));
+ CHECK(secp256k1_gej_eq_ge_var(&rj6, &r));
if (secp256k1_ge_is_infinity(&r)) {
/* Store infinity as 0x00 */
const unsigned char zerobyte[1] = {0};
@@ -5652,7 +5572,7 @@ static void test_ecmult_gen_blind(void) {
CHECK(!gej_xyz_equals_gej(&pgej, &pgej2));
CHECK(!gej_xyz_equals_gej(&i, &CTX->ecmult_gen_ctx.initial));
secp256k1_ge_set_gej(&pge, &pgej);
- ge_equals_gej(&pge, &pgej2);
+ CHECK(secp256k1_gej_eq_ge_var(&pgej2, &pge));
}
static void test_ecmult_gen_blind_reset(void) {
@@ -5729,9 +5649,7 @@ static void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, in
secp256k1_pubkey pubkey;
secp256k1_ge ge;
size_t pubkeyclen;
- int32_t ecount;
- ecount = 0;
- secp256k1_context_set_illegal_callback(CTX, counting_illegal_callback_fn, &ecount);
+
for (pubkeyclen = 3; pubkeyclen <= 65; pubkeyclen++) {
/* Smaller sizes are tested exhaustively elsewhere. */
int32_t i;
@@ -5756,7 +5674,6 @@ static void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, in
size_t outl;
memset(&pubkey, 0, sizeof(pubkey));
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
- ecount = 0;
CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, pubkeyclen) == 1);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
outl = 65;
@@ -5782,21 +5699,16 @@ static void ec_pubkey_parse_pointtest(const unsigned char *input, int xvalid, in
CHECK(pubkeyo[0] == 4);
CHECK(secp256k1_memcmp_var(&pubkeyo[1], input, 64) == 0);
}
- CHECK(ecount == 0);
} else {
/* These cases must fail to parse. */
memset(&pubkey, 0xfe, sizeof(pubkey));
- ecount = 0;
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, pubkeyclen) == 0);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
- CHECK(ecount == 0);
- CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
}
}
}
- secp256k1_context_set_illegal_callback(CTX, NULL, NULL);
}
static void run_ec_pubkey_parse_test(void) {
@@ -5979,142 +5891,99 @@ static void run_ec_pubkey_parse_test(void) {
0xB8, 0x00
};
unsigned char sout[65];
- unsigned char shortkey[2];
+ unsigned char shortkey[2] = { 0 };
secp256k1_ge ge;
secp256k1_pubkey pubkey;
size_t len;
int32_t i;
- int32_t ecount;
- int32_t ecount2;
- ecount = 0;
+
/* Nothing should be reading this far into pubkeyc. */
SECP256K1_CHECKMEM_UNDEFINE(&pubkeyc[65], 1);
- secp256k1_context_set_illegal_callback(CTX, counting_illegal_callback_fn, &ecount);
/* Zero length claimed, fail, zeroize, no illegal arg error. */
memset(&pubkey, 0xfe, sizeof(pubkey));
- ecount = 0;
SECP256K1_CHECKMEM_UNDEFINE(shortkey, 2);
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, shortkey, 0) == 0);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
- CHECK(ecount == 0);
- CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
/* Length one claimed, fail, zeroize, no illegal arg error. */
for (i = 0; i < 256 ; i++) {
memset(&pubkey, 0xfe, sizeof(pubkey));
- ecount = 0;
shortkey[0] = i;
SECP256K1_CHECKMEM_UNDEFINE(&shortkey[1], 1);
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, shortkey, 1) == 0);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
- CHECK(ecount == 0);
- CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
}
/* Length two claimed, fail, zeroize, no illegal arg error. */
for (i = 0; i < 65536 ; i++) {
memset(&pubkey, 0xfe, sizeof(pubkey));
- ecount = 0;
shortkey[0] = i & 255;
shortkey[1] = i >> 8;
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, shortkey, 2) == 0);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
- CHECK(ecount == 0);
- CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
}
memset(&pubkey, 0xfe, sizeof(pubkey));
- ecount = 0;
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
/* 33 bytes claimed on otherwise valid input starting with 0x04, fail, zeroize output, no illegal arg error. */
CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 33) == 0);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
- CHECK(ecount == 0);
- CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
/* NULL pubkey, illegal arg error. Pubkey isn't rewritten before this step, since it's NULL into the parser. */
- CHECK(secp256k1_ec_pubkey_parse(CTX, NULL, pubkeyc, 65) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_parse(CTX, NULL, pubkeyc, 65));
/* NULL input string. Illegal arg and zeroize output. */
memset(&pubkey, 0xfe, sizeof(pubkey));
- ecount = 0;
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
- CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, NULL, 65) == 0);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_parse(CTX, &pubkey, NULL, 65));
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
- CHECK(ecount == 1);
- CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
/* 64 bytes claimed on input starting with 0x04, fail, zeroize output, no illegal arg error. */
memset(&pubkey, 0xfe, sizeof(pubkey));
- ecount = 0;
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 64) == 0);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
- CHECK(ecount == 0);
- CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
/* 66 bytes claimed, fail, zeroize output, no illegal arg error. */
memset(&pubkey, 0xfe, sizeof(pubkey));
- ecount = 0;
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 66) == 0);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
- CHECK(ecount == 0);
- CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_pubkey_load(CTX, &ge, &pubkey));
/* Valid parse. */
memset(&pubkey, 0, sizeof(pubkey));
- ecount = 0;
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
CHECK(secp256k1_ec_pubkey_parse(CTX, &pubkey, pubkeyc, 65) == 1);
CHECK(secp256k1_ec_pubkey_parse(secp256k1_context_static, &pubkey, pubkeyc, 65) == 1);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(pubkey));
- CHECK(ecount == 0);
SECP256K1_CHECKMEM_UNDEFINE(&ge, sizeof(ge));
CHECK(secp256k1_pubkey_load(CTX, &ge, &pubkey) == 1);
SECP256K1_CHECKMEM_CHECK(&ge.x, sizeof(ge.x));
SECP256K1_CHECKMEM_CHECK(&ge.y, sizeof(ge.y));
SECP256K1_CHECKMEM_CHECK(&ge.infinity, sizeof(ge.infinity));
- ge_equals_ge(&secp256k1_ge_const_g, &ge);
- CHECK(ecount == 0);
+ CHECK(secp256k1_ge_eq_var(&ge, &secp256k1_ge_const_g));
/* secp256k1_ec_pubkey_serialize illegal args. */
- ecount = 0;
len = 65;
- CHECK(secp256k1_ec_pubkey_serialize(CTX, NULL, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_serialize(CTX, NULL, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED));
CHECK(len == 0);
- CHECK(secp256k1_ec_pubkey_serialize(CTX, sout, NULL, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_serialize(CTX, sout, NULL, &pubkey, SECP256K1_EC_UNCOMPRESSED));
len = 65;
SECP256K1_CHECKMEM_UNDEFINE(sout, 65);
- CHECK(secp256k1_ec_pubkey_serialize(CTX, sout, &len, NULL, SECP256K1_EC_UNCOMPRESSED) == 0);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_serialize(CTX, sout, &len, NULL, SECP256K1_EC_UNCOMPRESSED));
SECP256K1_CHECKMEM_CHECK(sout, 65);
- CHECK(ecount == 3);
CHECK(len == 0);
len = 65;
- CHECK(secp256k1_ec_pubkey_serialize(CTX, sout, &len, &pubkey, ~0) == 0);
- CHECK(ecount == 4);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_serialize(CTX, sout, &len, &pubkey, ~0));
CHECK(len == 0);
len = 65;
SECP256K1_CHECKMEM_UNDEFINE(sout, 65);
CHECK(secp256k1_ec_pubkey_serialize(CTX, sout, &len, &pubkey, SECP256K1_EC_UNCOMPRESSED) == 1);
SECP256K1_CHECKMEM_CHECK(sout, 65);
- CHECK(ecount == 4);
CHECK(len == 65);
/* Multiple illegal args. Should still set arg error only once. */
- ecount = 0;
- ecount2 = 11;
- CHECK(secp256k1_ec_pubkey_parse(CTX, NULL, NULL, 65) == 0);
- CHECK(ecount == 1);
- /* Does the illegal arg callback actually change the behavior? */
- secp256k1_context_set_illegal_callback(CTX, uncounting_illegal_callback_fn, &ecount2);
- CHECK(secp256k1_ec_pubkey_parse(CTX, NULL, NULL, 65) == 0);
- CHECK(ecount == 1);
- CHECK(ecount2 == 10);
- secp256k1_context_set_illegal_callback(CTX, NULL, NULL);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_parse(CTX, NULL, NULL, 65));
/* Try a bunch of prefabbed points with all possible encodings. */
for (i = 0; i < SECP256K1_EC_PARSE_TEST_NVALID; i++) {
ec_pubkey_parse_pointtest(valid[i], 1, 1);
@@ -6143,7 +6012,6 @@ static void run_eckey_edge_case_test(void) {
secp256k1_pubkey pubkey_negone;
const secp256k1_pubkey *pubkeys[3];
size_t len;
- int32_t ecount;
/* Group order is too large, reject. */
CHECK(secp256k1_ec_seckey_verify(CTX, orderc) == 0);
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(pubkey));
@@ -6265,88 +6133,59 @@ static void run_eckey_edge_case_test(void) {
ctmp2[31] = 2;
CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey2, ctmp2) == 1);
CHECK(secp256k1_memcmp_var(&pubkey, &pubkey2, sizeof(pubkey)) == 0);
- /* Test argument errors. */
- ecount = 0;
- secp256k1_context_set_illegal_callback(CTX, counting_illegal_callback_fn, &ecount);
- CHECK(ecount == 0);
/* Zeroize pubkey on parse error. */
memset(&pubkey, 0, 32);
- CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp2) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, ctmp2));
CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(pubkey)) == 0);
memcpy(&pubkey, &pubkey2, sizeof(pubkey));
memset(&pubkey2, 0, 32);
- CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey2, ctmp2) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey2, ctmp2));
CHECK(secp256k1_memcmp_var(&pubkey2, zeros, sizeof(pubkey2)) == 0);
/* Plain argument errors. */
- ecount = 0;
CHECK(secp256k1_ec_seckey_verify(CTX, ctmp) == 1);
- CHECK(ecount == 0);
- CHECK(secp256k1_ec_seckey_verify(CTX, NULL) == 0);
- CHECK(ecount == 1);
- ecount = 0;
+ CHECK_ILLEGAL(CTX, secp256k1_ec_seckey_verify(CTX, NULL));
memset(ctmp2, 0, 32);
ctmp2[31] = 4;
- CHECK(secp256k1_ec_pubkey_tweak_add(CTX, NULL, ctmp2) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, NULL) == 0);
- CHECK(ecount == 2);
- ecount = 0;
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_tweak_add(CTX, NULL, ctmp2));
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_tweak_add(CTX, &pubkey, NULL));
memset(ctmp2, 0, 32);
ctmp2[31] = 4;
- CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, NULL, ctmp2) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, NULL) == 0);
- CHECK(ecount == 2);
- ecount = 0;
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_tweak_mul(CTX, NULL, ctmp2));
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_tweak_mul(CTX, &pubkey, NULL));
memset(ctmp2, 0, 32);
- CHECK(secp256k1_ec_seckey_tweak_add(CTX, NULL, ctmp2) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ec_seckey_tweak_add(CTX, ctmp, NULL) == 0);
- CHECK(ecount == 2);
- ecount = 0;
+ CHECK_ILLEGAL(CTX, secp256k1_ec_seckey_tweak_add(CTX, NULL, ctmp2));
+ CHECK_ILLEGAL(CTX, secp256k1_ec_seckey_tweak_add(CTX, ctmp, NULL));
memset(ctmp2, 0, 32);
ctmp2[31] = 1;
- CHECK(secp256k1_ec_seckey_tweak_mul(CTX, NULL, ctmp2) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ec_seckey_tweak_mul(CTX, ctmp, NULL) == 0);
- CHECK(ecount == 2);
- ecount = 0;
- CHECK(secp256k1_ec_pubkey_create(CTX, NULL, ctmp) == 0);
- CHECK(ecount == 1);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_seckey_tweak_mul(CTX, NULL, ctmp2));
+ CHECK_ILLEGAL(CTX, secp256k1_ec_seckey_tweak_mul(CTX, ctmp, NULL));
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_create(CTX, NULL, ctmp));
memset(&pubkey, 1, sizeof(pubkey));
- CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, NULL) == 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_create(CTX, &pubkey, NULL));
CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
/* secp256k1_ec_pubkey_combine tests. */
- ecount = 0;
pubkeys[0] = &pubkey_one;
SECP256K1_CHECKMEM_UNDEFINE(&pubkeys[0], sizeof(secp256k1_pubkey *));
SECP256K1_CHECKMEM_UNDEFINE(&pubkeys[1], sizeof(secp256k1_pubkey *));
SECP256K1_CHECKMEM_UNDEFINE(&pubkeys[2], sizeof(secp256k1_pubkey *));
memset(&pubkey, 255, sizeof(secp256k1_pubkey));
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(secp256k1_pubkey));
- CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 0) == 0);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 0));
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(secp256k1_pubkey));
CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ec_pubkey_combine(CTX, NULL, pubkeys, 1) == 0);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_combine(CTX, NULL, pubkeys, 1));
CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
- CHECK(ecount == 2);
memset(&pubkey, 255, sizeof(secp256k1_pubkey));
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(secp256k1_pubkey));
- CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, NULL, 1) == 0);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_combine(CTX, &pubkey, NULL, 1));
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(secp256k1_pubkey));
CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
- CHECK(ecount == 3);
pubkeys[0] = &pubkey_negone;
memset(&pubkey, 255, sizeof(secp256k1_pubkey));
SECP256K1_CHECKMEM_UNDEFINE(&pubkey, sizeof(secp256k1_pubkey));
CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 1) == 1);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(secp256k1_pubkey));
CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
- CHECK(ecount == 3);
len = 33;
CHECK(secp256k1_ec_pubkey_serialize(CTX, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1);
CHECK(secp256k1_ec_pubkey_serialize(CTX, ctmp2, &len, &pubkey_negone, SECP256K1_EC_COMPRESSED) == 1);
@@ -6359,7 +6198,6 @@ static void run_eckey_edge_case_test(void) {
CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 2) == 0);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(secp256k1_pubkey));
CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) == 0);
- CHECK(ecount == 3);
/* Passes through infinity but comes out one. */
pubkeys[2] = &pubkey_one;
memset(&pubkey, 255, sizeof(secp256k1_pubkey));
@@ -6367,7 +6205,6 @@ static void run_eckey_edge_case_test(void) {
CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 3) == 1);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(secp256k1_pubkey));
CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
- CHECK(ecount == 3);
len = 33;
CHECK(secp256k1_ec_pubkey_serialize(CTX, ctmp, &len, &pubkey, SECP256K1_EC_COMPRESSED) == 1);
CHECK(secp256k1_ec_pubkey_serialize(CTX, ctmp2, &len, &pubkey_one, SECP256K1_EC_COMPRESSED) == 1);
@@ -6379,8 +6216,6 @@ static void run_eckey_edge_case_test(void) {
CHECK(secp256k1_ec_pubkey_combine(CTX, &pubkey, pubkeys, 2) == 1);
SECP256K1_CHECKMEM_CHECK(&pubkey, sizeof(secp256k1_pubkey));
CHECK(secp256k1_memcmp_var(&pubkey, zeros, sizeof(secp256k1_pubkey)) > 0);
- CHECK(ecount == 3);
- secp256k1_context_set_illegal_callback(CTX, NULL, NULL);
}
static void run_eckey_negate_test(void) {
@@ -6697,7 +6532,7 @@ static void test_random_pubkeys(void) {
CHECK(secp256k1_eckey_pubkey_serialize(&elem, in, &size, 0));
CHECK(size == 65);
CHECK(secp256k1_eckey_pubkey_parse(&elem2, in, size));
- ge_equals_ge(&elem,&elem2);
+ CHECK(secp256k1_ge_eq_var(&elem2, &elem));
/* Check that the X9.62 hybrid type is checked. */
in[0] = secp256k1_testrand_bits(1) ? 6 : 7;
res = secp256k1_eckey_pubkey_parse(&elem2, in, size);
@@ -6709,7 +6544,7 @@ static void test_random_pubkeys(void) {
}
}
if (res) {
- ge_equals_ge(&elem,&elem2);
+ CHECK(secp256k1_ge_eq_var(&elem, &elem2));
CHECK(secp256k1_eckey_pubkey_serialize(&elem, out, &size, 0));
CHECK(secp256k1_memcmp_var(&in[1], &out[1], 64) == 0);
}
@@ -6729,34 +6564,30 @@ static void run_pubkey_comparison(void) {
};
secp256k1_pubkey pk1;
secp256k1_pubkey pk2;
- int32_t ecount = 0;
CHECK(secp256k1_ec_pubkey_parse(CTX, &pk1, pk1_ser, sizeof(pk1_ser)) == 1);
CHECK(secp256k1_ec_pubkey_parse(CTX, &pk2, pk2_ser, sizeof(pk2_ser)) == 1);
- secp256k1_context_set_illegal_callback(CTX, counting_illegal_callback_fn, &ecount);
- CHECK(secp256k1_ec_pubkey_cmp(CTX, NULL, &pk2) < 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk1, NULL) > 0);
- CHECK(ecount == 2);
+ CHECK_ILLEGAL_VOID(CTX, CHECK(secp256k1_ec_pubkey_cmp(CTX, NULL, &pk2) < 0));
+ CHECK_ILLEGAL_VOID(CTX, CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk1, NULL) > 0));
CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk1, &pk2) < 0);
CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk2, &pk1) > 0);
CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk1, &pk1) == 0);
CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk2, &pk2) == 0);
- CHECK(ecount == 2);
{
secp256k1_pubkey pk_tmp;
memset(&pk_tmp, 0, sizeof(pk_tmp)); /* illegal pubkey */
- CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk_tmp, &pk2) < 0);
- CHECK(ecount == 3);
- CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk_tmp, &pk_tmp) == 0);
- CHECK(ecount == 5);
- CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk2, &pk_tmp) > 0);
- CHECK(ecount == 6);
+ CHECK_ILLEGAL_VOID(CTX, CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk_tmp, &pk2) < 0));
+ {
+ int32_t ecount = 0;
+ secp256k1_context_set_illegal_callback(CTX, counting_callback_fn, &ecount);
+ CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk_tmp, &pk_tmp) == 0);
+ CHECK(ecount == 2);
+ secp256k1_context_set_illegal_callback(CTX, NULL, NULL);
+ }
+ CHECK_ILLEGAL_VOID(CTX, CHECK(secp256k1_ec_pubkey_cmp(CTX, &pk2, &pk_tmp) > 0));
}
- secp256k1_context_set_illegal_callback(CTX, NULL, NULL);
-
/* Make pk2 the same as pk1 but with 3 rather than 2. Note that in
* an uncompressed encoding, these would have the opposite ordering */
pk1_ser[0] = 3;
@@ -7226,7 +7057,6 @@ static void test_ecdsa_edge_cases(void) {
{
secp256k1_pubkey pubkey;
size_t siglen;
- int32_t ecount;
unsigned char signature[72];
static const unsigned char nonce[32] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
@@ -7252,72 +7082,42 @@ static void test_ecdsa_edge_cases(void) {
0xb8, 0x12, 0xe0, 0x0b, 0x81, 0x7a, 0x77, 0x62,
0x65, 0xdf, 0xdd, 0x31, 0xb9, 0x3e, 0x29, 0xa9,
};
- ecount = 0;
- secp256k1_context_set_illegal_callback(CTX, counting_illegal_callback_fn, &ecount);
CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, precomputed_nonce_function, nonce) == 0);
CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, precomputed_nonce_function, nonce2) == 0);
msg[31] = 0xaa;
CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, precomputed_nonce_function, nonce) == 1);
- CHECK(ecount == 0);
- CHECK(secp256k1_ecdsa_sign(CTX, NULL, msg, key, precomputed_nonce_function, nonce2) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ecdsa_sign(CTX, &sig, NULL, key, precomputed_nonce_function, nonce2) == 0);
- CHECK(ecount == 2);
- CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, NULL, precomputed_nonce_function, nonce2) == 0);
- CHECK(ecount == 3);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_sign(CTX, NULL, msg, key, precomputed_nonce_function, nonce2));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_sign(CTX, &sig, NULL, key, precomputed_nonce_function, nonce2));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_sign(CTX, &sig, msg, NULL, precomputed_nonce_function, nonce2));
CHECK(secp256k1_ecdsa_sign(CTX, &sig, msg, key, precomputed_nonce_function, nonce2) == 1);
CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, key) == 1);
- CHECK(secp256k1_ecdsa_verify(CTX, NULL, msg, &pubkey) == 0);
- CHECK(ecount == 4);
- CHECK(secp256k1_ecdsa_verify(CTX, &sig, NULL, &pubkey) == 0);
- CHECK(ecount == 5);
- CHECK(secp256k1_ecdsa_verify(CTX, &sig, msg, NULL) == 0);
- CHECK(ecount == 6);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_verify(CTX, NULL, msg, &pubkey));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_verify(CTX, &sig, NULL, &pubkey));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_verify(CTX, &sig, msg, NULL));
CHECK(secp256k1_ecdsa_verify(CTX, &sig, msg, &pubkey) == 1);
- CHECK(ecount == 6);
- CHECK(secp256k1_ec_pubkey_create(CTX, &pubkey, NULL) == 0);
- CHECK(ecount == 7);
+ CHECK_ILLEGAL(CTX, secp256k1_ec_pubkey_create(CTX, &pubkey, NULL));
/* That pubkeyload fails via an ARGCHECK is a little odd but makes sense because pubkeys are an opaque data type. */
- CHECK(secp256k1_ecdsa_verify(CTX, &sig, msg, &pubkey) == 0);
- CHECK(ecount == 8);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_verify(CTX, &sig, msg, &pubkey));
siglen = 72;
- CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, NULL, &siglen, &sig) == 0);
- CHECK(ecount == 9);
- CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, signature, NULL, &sig) == 0);
- CHECK(ecount == 10);
- CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, signature, &siglen, NULL) == 0);
- CHECK(ecount == 11);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_serialize_der(CTX, NULL, &siglen, &sig));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_serialize_der(CTX, signature, NULL, &sig));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_serialize_der(CTX, signature, &siglen, NULL));
CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, signature, &siglen, &sig) == 1);
- CHECK(ecount == 11);
- CHECK(secp256k1_ecdsa_signature_parse_der(CTX, NULL, signature, siglen) == 0);
- CHECK(ecount == 12);
- CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &sig, NULL, siglen) == 0);
- CHECK(ecount == 13);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_parse_der(CTX, NULL, signature, siglen));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_parse_der(CTX, &sig, NULL, siglen));
CHECK(secp256k1_ecdsa_signature_parse_der(CTX, &sig, signature, siglen) == 1);
- CHECK(ecount == 13);
siglen = 10;
/* Too little room for a signature does not fail via ARGCHECK. */
CHECK(secp256k1_ecdsa_signature_serialize_der(CTX, signature, &siglen, &sig) == 0);
- CHECK(ecount == 13);
- ecount = 0;
- CHECK(secp256k1_ecdsa_signature_normalize(CTX, NULL, NULL) == 0);
- CHECK(ecount == 1);
- CHECK(secp256k1_ecdsa_signature_serialize_compact(CTX, NULL, &sig) == 0);
- CHECK(ecount == 2);
- CHECK(secp256k1_ecdsa_signature_serialize_compact(CTX, signature, NULL) == 0);
- CHECK(ecount == 3);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_normalize(CTX, NULL, NULL));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_serialize_compact(CTX, NULL, &sig));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_serialize_compact(CTX, signature, NULL));
CHECK(secp256k1_ecdsa_signature_serialize_compact(CTX, signature, &sig) == 1);
- CHECK(ecount == 3);
- CHECK(secp256k1_ecdsa_signature_parse_compact(CTX, NULL, signature) == 0);
- CHECK(ecount == 4);
- CHECK(secp256k1_ecdsa_signature_parse_compact(CTX, &sig, NULL) == 0);
- CHECK(ecount == 5);
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_parse_compact(CTX, NULL, signature));
+ CHECK_ILLEGAL(CTX, secp256k1_ecdsa_signature_parse_compact(CTX, &sig, NULL));
CHECK(secp256k1_ecdsa_signature_parse_compact(CTX, &sig, signature) == 1);
- CHECK(ecount == 5);
memset(signature, 255, 64);
CHECK(secp256k1_ecdsa_signature_parse_compact(CTX, &sig, signature) == 0);
- CHECK(ecount == 5);
- secp256k1_context_set_illegal_callback(CTX, NULL, NULL);
}
/* Nonce function corner cases. */
diff --git a/src/secp256k1/src/tests_exhaustive.c b/src/secp256k1/src/tests_exhaustive.c
index 3af8ec1ee5..1a8be57d07 100644
--- a/src/secp256k1/src/tests_exhaustive.c
+++ b/src/secp256k1/src/tests_exhaustive.c
@@ -28,61 +28,11 @@
#include "testrand_impl.h"
#include "ecmult_compute_table_impl.h"
#include "ecmult_gen_compute_table_impl.h"
+#include "testutil.h"
#include "util.h"
static int count = 2;
-/** stolen from tests.c */
-static void ge_equals_ge(const secp256k1_ge *a, const secp256k1_ge *b) {
- CHECK(a->infinity == b->infinity);
- if (a->infinity) {
- return;
- }
- CHECK(secp256k1_fe_equal(&a->x, &b->x));
- CHECK(secp256k1_fe_equal(&a->y, &b->y));
-}
-
-static void ge_equals_gej(const secp256k1_ge *a, const secp256k1_gej *b) {
- secp256k1_fe z2s;
- secp256k1_fe u1, u2, s1, s2;
- CHECK(a->infinity == b->infinity);
- if (a->infinity) {
- return;
- }
- /* Check a.x * b.z^2 == b.x && a.y * b.z^3 == b.y, to avoid inverses. */
- secp256k1_fe_sqr(&z2s, &b->z);
- secp256k1_fe_mul(&u1, &a->x, &z2s);
- u2 = b->x;
- secp256k1_fe_mul(&s1, &a->y, &z2s); secp256k1_fe_mul(&s1, &s1, &b->z);
- s2 = b->y;
- CHECK(secp256k1_fe_equal(&u1, &u2));
- CHECK(secp256k1_fe_equal(&s1, &s2));
-}
-
-static void random_fe(secp256k1_fe *x) {
- unsigned char bin[32];
- do {
- secp256k1_testrand256(bin);
- if (secp256k1_fe_set_b32_limit(x, bin)) {
- return;
- }
- } while(1);
-}
-
-static void random_fe_non_zero(secp256k1_fe *nz) {
- int tries = 10;
- while (--tries >= 0) {
- random_fe(nz);
- secp256k1_fe_normalize(nz);
- if (!secp256k1_fe_is_zero(nz)) {
- break;
- }
- }
- /* Infinitesimal probability of spurious failure here */
- CHECK(tries >= 0);
-}
-/** END stolen from tests.c */
-
static uint32_t num_cores = 1;
static uint32_t this_core = 0;
@@ -117,7 +67,7 @@ static void test_exhaustive_endomorphism(const secp256k1_ge *group) {
for (i = 0; i < EXHAUSTIVE_TEST_ORDER; i++) {
secp256k1_ge res;
secp256k1_ge_mul_lambda(&res, &group[i]);
- ge_equals_ge(&group[i * EXHAUSTIVE_TEST_LAMBDA % EXHAUSTIVE_TEST_ORDER], &res);
+ CHECK(secp256k1_ge_eq_var(&group[i * EXHAUSTIVE_TEST_LAMBDA % EXHAUSTIVE_TEST_ORDER], &res));
}
}
@@ -143,21 +93,21 @@ static void test_exhaustive_addition(const secp256k1_ge *group, const secp256k1_
secp256k1_gej tmp;
/* add_var */
secp256k1_gej_add_var(&tmp, &groupj[i], &groupj[j], NULL);
- ge_equals_gej(&group[(i + j) % EXHAUSTIVE_TEST_ORDER], &tmp);
+ CHECK(secp256k1_gej_eq_ge_var(&tmp, &group[(i + j) % EXHAUSTIVE_TEST_ORDER]));
/* add_ge */
if (j > 0) {
secp256k1_gej_add_ge(&tmp, &groupj[i], &group[j]);
- ge_equals_gej(&group[(i + j) % EXHAUSTIVE_TEST_ORDER], &tmp);
+ CHECK(secp256k1_gej_eq_ge_var(&tmp, &group[(i + j) % EXHAUSTIVE_TEST_ORDER]));
}
/* add_ge_var */
secp256k1_gej_add_ge_var(&tmp, &groupj[i], &group[j], NULL);
- ge_equals_gej(&group[(i + j) % EXHAUSTIVE_TEST_ORDER], &tmp);
+ CHECK(secp256k1_gej_eq_ge_var(&tmp, &group[(i + j) % EXHAUSTIVE_TEST_ORDER]));
/* add_zinv_var */
zless_gej.infinity = groupj[j].infinity;
zless_gej.x = groupj[j].x;
zless_gej.y = groupj[j].y;
secp256k1_gej_add_zinv_var(&tmp, &groupj[i], &zless_gej, &fe_inv);
- ge_equals_gej(&group[(i + j) % EXHAUSTIVE_TEST_ORDER], &tmp);
+ CHECK(secp256k1_gej_eq_ge_var(&tmp, &group[(i + j) % EXHAUSTIVE_TEST_ORDER]));
}
}
@@ -165,9 +115,9 @@ static void test_exhaustive_addition(const secp256k1_ge *group, const secp256k1_
for (i = 0; i < EXHAUSTIVE_TEST_ORDER; i++) {
secp256k1_gej tmp;
secp256k1_gej_double(&tmp, &groupj[i]);
- ge_equals_gej(&group[(2 * i) % EXHAUSTIVE_TEST_ORDER], &tmp);
+ CHECK(secp256k1_gej_eq_ge_var(&tmp, &group[(2 * i) % EXHAUSTIVE_TEST_ORDER]));
secp256k1_gej_double_var(&tmp, &groupj[i], NULL);
- ge_equals_gej(&group[(2 * i) % EXHAUSTIVE_TEST_ORDER], &tmp);
+ CHECK(secp256k1_gej_eq_ge_var(&tmp, &group[(2 * i) % EXHAUSTIVE_TEST_ORDER]));
}
/* Check negation */
@@ -175,9 +125,9 @@ static void test_exhaustive_addition(const secp256k1_ge *group, const secp256k1_
secp256k1_ge tmp;
secp256k1_gej tmpj;
secp256k1_ge_neg(&tmp, &group[i]);
- ge_equals_ge(&group[EXHAUSTIVE_TEST_ORDER - i], &tmp);
+ CHECK(secp256k1_ge_eq_var(&tmp, &group[EXHAUSTIVE_TEST_ORDER - i]));
secp256k1_gej_neg(&tmpj, &groupj[i]);
- ge_equals_gej(&group[EXHAUSTIVE_TEST_ORDER - i], &tmpj);
+ CHECK(secp256k1_gej_eq_ge_var(&tmpj, &group[EXHAUSTIVE_TEST_ORDER - i]));
}
}
@@ -194,8 +144,7 @@ static void test_exhaustive_ecmult(const secp256k1_ge *group, const secp256k1_ge
secp256k1_scalar_set_int(&ng, j);
secp256k1_ecmult(&tmp, &groupj[r_log], &na, &ng);
- ge_equals_gej(&group[(i * r_log + j) % EXHAUSTIVE_TEST_ORDER], &tmp);
-
+ CHECK(secp256k1_gej_eq_ge_var(&tmp, &group[(i * r_log + j) % EXHAUSTIVE_TEST_ORDER]));
}
}
}
@@ -213,7 +162,7 @@ static void test_exhaustive_ecmult(const secp256k1_ge *group, const secp256k1_ge
/* Test secp256k1_ecmult_const. */
secp256k1_ecmult_const(&tmp, &group[i], &ng);
- ge_equals_gej(&group[(i * j) % EXHAUSTIVE_TEST_ORDER], &tmp);
+ CHECK(secp256k1_gej_eq_ge_var(&tmp, &group[(i * j) % EXHAUSTIVE_TEST_ORDER]));
if (i != 0 && j != 0) {
/* Test secp256k1_ecmult_const_xonly with all curve X coordinates, and xd=NULL. */
@@ -265,7 +214,7 @@ static void test_exhaustive_ecmult_multi(const secp256k1_context *ctx, const sec
data.pt[1] = group[y];
secp256k1_ecmult_multi_var(&ctx->error_callback, scratch, &tmp, &g_sc, ecmult_multi_callback, &data, 2);
- ge_equals_gej(&group[(i * x + j * y + k) % EXHAUSTIVE_TEST_ORDER], &tmp);
+ CHECK(secp256k1_gej_eq_ge_var(&tmp, &group[(i * x + j * y + k) % EXHAUSTIVE_TEST_ORDER]));
}
}
}
diff --git a/src/secp256k1/src/testutil.h b/src/secp256k1/src/testutil.h
new file mode 100644
index 0000000000..4e2cb7d5b3
--- /dev/null
+++ b/src/secp256k1/src/testutil.h
@@ -0,0 +1,29 @@
+/***********************************************************************
+ * Distributed under the MIT software license, see the accompanying *
+ * file COPYING or https://www.opensource.org/licenses/mit-license.php.*
+ ***********************************************************************/
+
+#ifndef SECP256K1_TESTUTIL_H
+#define SECP256K1_TESTUTIL_H
+
+#include "field.h"
+#include "testrand.h"
+#include "util.h"
+
+static void random_fe(secp256k1_fe *x) {
+ unsigned char bin[32];
+ do {
+ secp256k1_testrand256(bin);
+ if (secp256k1_fe_set_b32_limit(x, bin)) {
+ return;
+ }
+ } while(1);
+}
+
+static void random_fe_non_zero(secp256k1_fe *nz) {
+ do {
+ random_fe(nz);
+ } while (secp256k1_fe_is_zero(nz));
+}
+
+#endif /* SECP256K1_TESTUTIL_H */
diff --git a/src/secp256k1/src/util.h b/src/secp256k1/src/util.h
index cf7e5d1af5..187bf1c5e0 100644
--- a/src/secp256k1/src/util.h
+++ b/src/secp256k1/src/util.h
@@ -132,16 +132,11 @@ static const secp256k1_callback default_error_callback = {
} while(0)
#endif
-/* Like assert(), but when VERIFY is defined, and side-effect safe. */
-#if defined(COVERAGE)
-#define VERIFY_CHECK(check)
-#define VERIFY_SETUP(stmt)
-#elif defined(VERIFY)
+/* Like assert(), but when VERIFY is defined. */
+#if defined(VERIFY)
#define VERIFY_CHECK CHECK
-#define VERIFY_SETUP(stmt) do { stmt; } while(0)
#else
-#define VERIFY_CHECK(cond) do { (void)(cond); } while(0)
-#define VERIFY_SETUP(stmt)
+#define VERIFY_CHECK(cond)
#endif
static SECP256K1_INLINE void *checked_malloc(const secp256k1_callback* cb, size_t size) {
diff --git a/src/secp256k1/tools/check-abi.sh b/src/secp256k1/tools/check-abi.sh
new file mode 100755
index 0000000000..8f6119cd8e
--- /dev/null
+++ b/src/secp256k1/tools/check-abi.sh
@@ -0,0 +1,64 @@
+#!/bin/sh
+
+set -eu
+
+default_base_version="$(git describe --match "v*.*.*" --abbrev=0)"
+default_new_version="master"
+
+display_help_and_exit() {
+ echo "Usage: $0 <base_ver> <new_ver>"
+ echo ""
+ echo "Description: This script uses the ABI Compliance Checker tool to determine if the ABI"
+ echo " of a new version of libsecp256k1 has changed in a backward-incompatible way."
+ echo ""
+ echo "Options:"
+ echo " base_ver Specify the base version (default: $default_base_version)"
+ echo " new_ver Specify the new version (default: $default_new_version)"
+ echo " -h, --help Display this help message"
+ exit 0
+}
+
+if [ "$#" -eq 0 ]; then
+ base_version="$default_base_version"
+ new_version="$default_new_version"
+elif [ "$#" -eq 1 ] && { [ "$1" = "-h" ] || [ "$1" = "--help" ]; }; then
+ display_help_and_exit
+elif [ "$#" -eq 2 ]; then
+ base_version="$1"
+ new_version="$2"
+else
+ echo "Invalid usage. See help:"
+ echo ""
+ display_help_and_exit
+fi
+
+checkout_and_build() {
+ git worktree add -d "$1" "$2"
+ cd "$1"
+ mkdir build && cd build
+ cmake -S .. --preset dev-mode \
+ -DCMAKE_C_COMPILER=gcc -DCMAKE_BUILD_TYPE=None -DCMAKE_C_FLAGS="-g -Og -gdwarf-4" \
+ -DSECP256K1_BUILD_BENCHMARK=OFF \
+ -DSECP256K1_BUILD_TESTS=OFF \
+ -DSECP256K1_BUILD_EXHAUSTIVE_TESTS=OFF \
+ -DSECP256K1_BUILD_CTIME_TESTS=OFF \
+ -DSECP256K1_BUILD_EXAMPLES=OFF
+ cmake --build . -j "$(nproc)"
+ abi-dumper src/libsecp256k1.so -o ABI.dump -lver "$2"
+}
+
+echo "Comparing $base_version (base version) to $new_version (new version)"
+echo
+
+original_dir="$(pwd)"
+
+base_source_dir=$(mktemp -d)
+checkout_and_build "$base_source_dir" "$base_version"
+
+new_source_dir=$(mktemp -d)
+checkout_and_build "$new_source_dir" "$new_version"
+
+cd "$original_dir"
+abi-compliance-checker -lib libsecp256k1 -old "${base_source_dir}/build/ABI.dump" -new "${new_source_dir}/build/ABI.dump"
+git worktree remove "$base_source_dir"
+git worktree remove "$new_source_dir"
diff --git a/src/serialize.h b/src/serialize.h
index 263b781f21..2f13fba582 100644
--- a/src/serialize.h
+++ b/src/serialize.h
@@ -13,6 +13,7 @@
#include <span.h>
#include <algorithm>
+#include <concepts>
#include <cstdint>
#include <cstring>
#include <ios>
@@ -56,27 +57,27 @@ template<typename Stream> inline void ser_writedata8(Stream &s, uint8_t obj)
}
template<typename Stream> inline void ser_writedata16(Stream &s, uint16_t obj)
{
- obj = htole16(obj);
+ obj = htole16_internal(obj);
s.write(AsBytes(Span{&obj, 1}));
}
template<typename Stream> inline void ser_writedata16be(Stream &s, uint16_t obj)
{
- obj = htobe16(obj);
+ obj = htobe16_internal(obj);
s.write(AsBytes(Span{&obj, 1}));
}
template<typename Stream> inline void ser_writedata32(Stream &s, uint32_t obj)
{
- obj = htole32(obj);
+ obj = htole32_internal(obj);
s.write(AsBytes(Span{&obj, 1}));
}
template<typename Stream> inline void ser_writedata32be(Stream &s, uint32_t obj)
{
- obj = htobe32(obj);
+ obj = htobe32_internal(obj);
s.write(AsBytes(Span{&obj, 1}));
}
template<typename Stream> inline void ser_writedata64(Stream &s, uint64_t obj)
{
- obj = htole64(obj);
+ obj = htole64_internal(obj);
s.write(AsBytes(Span{&obj, 1}));
}
template<typename Stream> inline uint8_t ser_readdata8(Stream &s)
@@ -89,31 +90,31 @@ template<typename Stream> inline uint16_t ser_readdata16(Stream &s)
{
uint16_t obj;
s.read(AsWritableBytes(Span{&obj, 1}));
- return le16toh(obj);
+ return le16toh_internal(obj);
}
template<typename Stream> inline uint16_t ser_readdata16be(Stream &s)
{
uint16_t obj;
s.read(AsWritableBytes(Span{&obj, 1}));
- return be16toh(obj);
+ return be16toh_internal(obj);
}
template<typename Stream> inline uint32_t ser_readdata32(Stream &s)
{
uint32_t obj;
s.read(AsWritableBytes(Span{&obj, 1}));
- return le32toh(obj);
+ return le32toh_internal(obj);
}
template<typename Stream> inline uint32_t ser_readdata32be(Stream &s)
{
uint32_t obj;
s.read(AsWritableBytes(Span{&obj, 1}));
- return be32toh(obj);
+ return be32toh_internal(obj);
}
template<typename Stream> inline uint64_t ser_readdata64(Stream &s)
{
uint64_t obj;
s.read(AsWritableBytes(Span{&obj, 1}));
- return le64toh(obj);
+ return le64toh_internal(obj);
}
@@ -259,9 +260,14 @@ const Out& AsBase(const In& x)
// i.e. anything that supports .read(Span<std::byte>) and .write(Span<const std::byte>)
//
// clang-format off
-#ifndef CHAR_EQUALS_INT8
-template <typename Stream> void Serialize(Stream&, char) = delete; // char serialization forbidden. Use uint8_t or int8_t
-#endif
+
+// Typically int8_t and char are distinct types, but some systems may define int8_t
+// in terms of char. Forbid serialization of char in the typical case, but allow it if
+// it's the only way to describe an int8_t.
+template<class T>
+concept CharNotInt8 = std::same_as<T, char> && !std::same_as<T, int8_t>;
+
+template <typename Stream, CharNotInt8 V> void Serialize(Stream&, V) = delete; // char serialization forbidden. Use uint8_t or int8_t
template <typename Stream> void Serialize(Stream& s, std::byte a) { ser_writedata8(s, uint8_t(a)); }
template<typename Stream> inline void Serialize(Stream& s, int8_t a ) { ser_writedata8(s, a); }
template<typename Stream> inline void Serialize(Stream& s, uint8_t a ) { ser_writedata8(s, a); }
@@ -271,14 +277,11 @@ template<typename Stream> inline void Serialize(Stream& s, int32_t a ) { ser_wri
template<typename Stream> inline void Serialize(Stream& s, uint32_t a) { ser_writedata32(s, a); }
template<typename Stream> inline void Serialize(Stream& s, int64_t a ) { ser_writedata64(s, a); }
template<typename Stream> inline void Serialize(Stream& s, uint64_t a) { ser_writedata64(s, a); }
-template<typename Stream, int N> inline void Serialize(Stream& s, const char (&a)[N]) { s.write(MakeByteSpan(a)); }
-template<typename Stream, int N> inline void Serialize(Stream& s, const unsigned char (&a)[N]) { s.write(MakeByteSpan(a)); }
-template <typename Stream, typename B, std::size_t N> void Serialize(Stream& s, const std::array<B, N>& a) { (void)/* force byte-type */UCharCast(a.data()); s.write(MakeByteSpan(a)); }
-template <typename Stream, typename B> void Serialize(Stream& s, Span<B> span) { (void)/* force byte-type */UCharCast(span.data()); s.write(AsBytes(span)); }
-
-#ifndef CHAR_EQUALS_INT8
-template <typename Stream> void Unserialize(Stream&, char) = delete; // char serialization forbidden. Use uint8_t or int8_t
-#endif
+template <typename Stream, BasicByte B, int N> void Serialize(Stream& s, const B (&a)[N]) { s.write(MakeByteSpan(a)); }
+template <typename Stream, BasicByte B, std::size_t N> void Serialize(Stream& s, const std::array<B, N>& a) { s.write(MakeByteSpan(a)); }
+template <typename Stream, BasicByte B> void Serialize(Stream& s, Span<B> span) { s.write(AsBytes(span)); }
+
+template <typename Stream, CharNotInt8 V> void Unserialize(Stream&, V) = delete; // char serialization forbidden. Use uint8_t or int8_t
template <typename Stream> void Unserialize(Stream& s, std::byte& a) { a = std::byte{ser_readdata8(s)}; }
template<typename Stream> inline void Unserialize(Stream& s, int8_t& a ) { a = ser_readdata8(s); }
template<typename Stream> inline void Unserialize(Stream& s, uint8_t& a ) { a = ser_readdata8(s); }
@@ -288,10 +291,9 @@ template<typename Stream> inline void Unserialize(Stream& s, int32_t& a ) { a =
template<typename Stream> inline void Unserialize(Stream& s, uint32_t& a) { a = ser_readdata32(s); }
template<typename Stream> inline void Unserialize(Stream& s, int64_t& a ) { a = ser_readdata64(s); }
template<typename Stream> inline void Unserialize(Stream& s, uint64_t& a) { a = ser_readdata64(s); }
-template<typename Stream, int N> inline void Unserialize(Stream& s, char (&a)[N]) { s.read(MakeWritableByteSpan(a)); }
-template<typename Stream, int N> inline void Unserialize(Stream& s, unsigned char (&a)[N]) { s.read(MakeWritableByteSpan(a)); }
-template <typename Stream, typename B, std::size_t N> void Unserialize(Stream& s, std::array<B, N>& a) { (void)/* force byte-type */UCharCast(a.data()); s.read(MakeWritableByteSpan(a)); }
-template <typename Stream, typename B> void Unserialize(Stream& s, Span<B> span) { (void)/* force byte-type */UCharCast(span.data()); s.read(AsWritableBytes(span)); }
+template <typename Stream, BasicByte B, int N> void Unserialize(Stream& s, B (&a)[N]) { s.read(MakeWritableByteSpan(a)); }
+template <typename Stream, BasicByte B, std::size_t N> void Unserialize(Stream& s, std::array<B, N>& a) { s.read(MakeWritableByteSpan(a)); }
+template <typename Stream, BasicByte B> void Unserialize(Stream& s, Span<B> span) { s.read(AsWritableBytes(span)); }
template <typename Stream> inline void Serialize(Stream& s, bool a) { uint8_t f = a; ser_writedata8(s, f); }
template <typename Stream> inline void Unserialize(Stream& s, bool& a) { uint8_t f = ser_readdata8(s); a = f; }
@@ -546,10 +548,10 @@ struct CustomUintFormatter
{
if (v < 0 || v > MAX) throw std::ios_base::failure("CustomUintFormatter value out of range");
if (BigEndian) {
- uint64_t raw = htobe64(v);
+ uint64_t raw = htobe64_internal(v);
s.write(AsBytes(Span{&raw, 1}).last(Bytes));
} else {
- uint64_t raw = htole64(v);
+ uint64_t raw = htole64_internal(v);
s.write(AsBytes(Span{&raw, 1}).first(Bytes));
}
}
@@ -561,10 +563,10 @@ struct CustomUintFormatter
uint64_t raw = 0;
if (BigEndian) {
s.read(AsWritableBytes(Span{&raw, 1}).last(Bytes));
- v = static_cast<I>(be64toh(raw));
+ v = static_cast<I>(be64toh_internal(raw));
} else {
s.read(AsWritableBytes(Span{&raw, 1}).first(Bytes));
- v = static_cast<I>(le64toh(raw));
+ v = static_cast<I>(le64toh_internal(raw));
}
}
};
@@ -712,14 +714,12 @@ template<typename Stream, typename C> void Unserialize(Stream& is, std::basic_st
/**
* prevector
- * prevectors of unsigned char are a special case and are intended to be serialized as a single opaque blob.
*/
template<typename Stream, unsigned int N, typename T> inline void Serialize(Stream& os, const prevector<N, T>& v);
template<typename Stream, unsigned int N, typename T> inline void Unserialize(Stream& is, prevector<N, T>& v);
/**
* vector
- * vectors of unsigned char are a special case and are intended to be serialized as a single opaque blob.
*/
template<typename Stream, typename T, typename A> inline void Serialize(Stream& os, const std::vector<T, A>& v);
template<typename Stream, typename T, typename A> inline void Unserialize(Stream& is, std::vector<T, A>& v);
@@ -755,18 +755,23 @@ template<typename Stream, typename T> void Serialize(Stream& os, const std::uniq
template<typename Stream, typename T> void Unserialize(Stream& os, std::unique_ptr<const T>& p);
-
/**
* If none of the specialized versions above matched, default to calling member function.
*/
-template<typename Stream, typename T>
-inline void Serialize(Stream& os, const T& a)
+template <class T, class Stream>
+concept Serializable = requires(T a, Stream s) { a.Serialize(s); };
+template <typename Stream, typename T>
+ requires Serializable<T, Stream>
+void Serialize(Stream& os, const T& a)
{
a.Serialize(os);
}
-template<typename Stream, typename T>
-inline void Unserialize(Stream& is, T&& a)
+template <class T, class Stream>
+concept Unserializable = requires(T a, Stream s) { a.Unserialize(s); };
+template <typename Stream, typename T>
+ requires Unserializable<T, Stream>
+void Unserialize(Stream& is, T&& a)
{
a.Unserialize(is);
}
@@ -817,10 +822,9 @@ void Unserialize(Stream& is, std::basic_string<C>& str)
template <typename Stream, unsigned int N, typename T>
void Serialize(Stream& os, const prevector<N, T>& v)
{
- if constexpr (std::is_same_v<T, unsigned char>) {
+ if constexpr (BasicByte<T>) { // Use optimized version for unformatted basic bytes
WriteCompactSize(os, v.size());
- if (!v.empty())
- os.write(MakeByteSpan(v));
+ if (!v.empty()) os.write(MakeByteSpan(v));
} else {
Serialize(os, Using<VectorFormatter<DefaultFormatter>>(v));
}
@@ -830,7 +834,7 @@ void Serialize(Stream& os, const prevector<N, T>& v)
template <typename Stream, unsigned int N, typename T>
void Unserialize(Stream& is, prevector<N, T>& v)
{
- if constexpr (std::is_same_v<T, unsigned char>) {
+ if constexpr (BasicByte<T>) { // Use optimized version for unformatted basic bytes
// Limit size per read so bogus size value won't cause out of memory
v.clear();
unsigned int nSize = ReadCompactSize(is);
@@ -853,10 +857,9 @@ void Unserialize(Stream& is, prevector<N, T>& v)
template <typename Stream, typename T, typename A>
void Serialize(Stream& os, const std::vector<T, A>& v)
{
- if constexpr (std::is_same_v<T, unsigned char>) {
+ if constexpr (BasicByte<T>) { // Use optimized version for unformatted basic bytes
WriteCompactSize(os, v.size());
- if (!v.empty())
- os.write(MakeByteSpan(v));
+ if (!v.empty()) os.write(MakeByteSpan(v));
} else if constexpr (std::is_same_v<T, bool>) {
// A special case for std::vector<bool>, as dereferencing
// std::vector<bool>::const_iterator does not result in a const bool&
@@ -874,7 +877,7 @@ void Serialize(Stream& os, const std::vector<T, A>& v)
template <typename Stream, typename T, typename A>
void Unserialize(Stream& is, std::vector<T, A>& v)
{
- if constexpr (std::is_same_v<T, unsigned char>) {
+ if constexpr (BasicByte<T>) { // Use optimized version for unformatted basic bytes
// Limit size per read so bogus size value won't cause out of memory
v.clear();
unsigned int nSize = ReadCompactSize(is);
diff --git a/src/span.h b/src/span.h
index 2e8da27cde..c974c265ce 100644
--- a/src/span.h
+++ b/src/span.h
@@ -8,6 +8,7 @@
#include <algorithm>
#include <cassert>
#include <cstddef>
+#include <span>
#include <type_traits>
#ifdef DEBUG
@@ -283,13 +284,18 @@ Span<std::byte> MakeWritableByteSpan(V&& v) noexcept
return AsWritableBytes(Span{std::forward<V>(v)});
}
-// Helper functions to safely cast to unsigned char pointers.
+// Helper functions to safely cast basic byte pointers to unsigned char pointers.
inline unsigned char* UCharCast(char* c) { return reinterpret_cast<unsigned char*>(c); }
inline unsigned char* UCharCast(unsigned char* c) { return c; }
+inline unsigned char* UCharCast(signed char* c) { return reinterpret_cast<unsigned char*>(c); }
inline unsigned char* UCharCast(std::byte* c) { return reinterpret_cast<unsigned char*>(c); }
inline const unsigned char* UCharCast(const char* c) { return reinterpret_cast<const unsigned char*>(c); }
inline const unsigned char* UCharCast(const unsigned char* c) { return c; }
+inline const unsigned char* UCharCast(const signed char* c) { return reinterpret_cast<const unsigned char*>(c); }
inline const unsigned char* UCharCast(const std::byte* c) { return reinterpret_cast<const unsigned char*>(c); }
+// Helper concept for the basic byte types.
+template <typename B>
+concept BasicByte = requires { UCharCast(std::span<B>{}.data()); };
// Helper function to safely convert a Span to a Span<[const] unsigned char>.
template <typename T> constexpr auto UCharSpanCast(Span<T> s) -> Span<typename std::remove_pointer<decltype(UCharCast(s.data()))>::type> { return {UCharCast(s.data()), s.size()}; }
diff --git a/src/support/lockedpool.cpp b/src/support/lockedpool.cpp
index f92d1d8fb7..fe3ba38cde 100644
--- a/src/support/lockedpool.cpp
+++ b/src/support/lockedpool.cpp
@@ -5,10 +5,6 @@
#include <support/lockedpool.h>
#include <support/cleanse.h>
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#ifdef WIN32
#include <windows.h>
#else
diff --git a/src/sync.cpp b/src/sync.cpp
index 58752a9f18..a8bdfc1dea 100644
--- a/src/sync.cpp
+++ b/src/sync.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <sync.h>
#include <logging.h>
diff --git a/src/test/.gitignore b/src/test/.gitignore
new file mode 100644
index 0000000000..036df1430c
--- /dev/null
+++ b/src/test/.gitignore
@@ -0,0 +1,2 @@
+# capnp generated files
+*.capnp.*
diff --git a/src/test/README.md b/src/test/README.md
index 4c152b0d52..bab1a28f61 100644
--- a/src/test/README.md
+++ b/src/test/README.md
@@ -15,7 +15,8 @@ that runs all of the unit tests. The main source file for the test library is fo
Unit tests will be automatically compiled if dependencies were met in `./configure`
and tests weren't explicitly disabled.
-After configuring, they can be run with `make check`.
+After configuring, they can be run with `make check`, which includes unit tests from
+subtrees, or `make && make -C src check-unit` for just the unit tests.
To run the unit tests manually, launch `src/test/test_bitcoin`. To recompile
after a test file was modified, run `make` and then run the test again. If you
diff --git a/src/test/addrman_tests.cpp b/src/test/addrman_tests.cpp
index 5bd4f271cd..9668a85484 100644
--- a/src/test/addrman_tests.cpp
+++ b/src/test/addrman_tests.cpp
@@ -1068,7 +1068,7 @@ BOOST_AUTO_TEST_CASE(load_addrman_corrupted)
BOOST_AUTO_TEST_CASE(addrman_update_address)
{
- // Tests updating nTime via Connected() and nServices via SetServices()
+ // Tests updating nTime via Connected() and nServices via SetServices() and Add()
auto addrman = std::make_unique<AddrMan>(EMPTY_NETGROUPMAN, DETERMINISTIC, GetCheckRatio(m_node));
CNetAddr source{ResolveIP("252.2.2.2")};
CAddress addr{CAddress(ResolveService("250.1.1.1", 8333), NODE_NONE)};
@@ -1095,6 +1095,32 @@ BOOST_AUTO_TEST_CASE(addrman_update_address)
BOOST_CHECK_EQUAL(vAddr2.size(), 1U);
BOOST_CHECK(vAddr2.at(0).nTime >= start_time + 10000s);
BOOST_CHECK_EQUAL(vAddr2.at(0).nServices, NODE_NETWORK_LIMITED);
+
+ // Updating an existing addr through Add() (used in gossip relay) can add additional services but can't remove existing ones.
+ CAddress addr_v2{CAddress(ResolveService("250.1.1.1", 8333), NODE_P2P_V2)};
+ addr_v2.nTime = start_time;
+ BOOST_CHECK(!addrman->Add({addr_v2}, source));
+ std::vector<CAddress> vAddr3{addrman->GetAddr(/*max_addresses=*/0, /*max_pct=*/0, /*network=*/std::nullopt)};
+ BOOST_CHECK_EQUAL(vAddr3.size(), 1U);
+ BOOST_CHECK_EQUAL(vAddr3.at(0).nServices, NODE_P2P_V2 | NODE_NETWORK_LIMITED);
+
+ // SetServices() (used when we connected to them) overwrites existing service flags
+ addrman->SetServices(addr, NODE_NETWORK);
+ std::vector<CAddress> vAddr4{addrman->GetAddr(/*max_addresses=*/0, /*max_pct=*/0, /*network=*/std::nullopt)};
+ BOOST_CHECK_EQUAL(vAddr4.size(), 1U);
+ BOOST_CHECK_EQUAL(vAddr4.at(0).nServices, NODE_NETWORK);
+
+ // Promoting to Tried does not affect the service flags
+ BOOST_CHECK(addrman->Good(addr)); // addr has NODE_NONE
+ std::vector<CAddress> vAddr5{addrman->GetAddr(/*max_addresses=*/0, /*max_pct=*/0, /*network=*/std::nullopt)};
+ BOOST_CHECK_EQUAL(vAddr5.size(), 1U);
+ BOOST_CHECK_EQUAL(vAddr5.at(0).nServices, NODE_NETWORK);
+
+ // Adding service flags even works when the addr is in Tried
+ BOOST_CHECK(!addrman->Add({addr_v2}, source));
+ std::vector<CAddress> vAddr6{addrman->GetAddr(/*max_addresses=*/0, /*max_pct=*/0, /*network=*/std::nullopt)};
+ BOOST_CHECK_EQUAL(vAddr6.size(), 1U);
+ BOOST_CHECK_EQUAL(vAddr6.at(0).nServices, NODE_NETWORK | NODE_P2P_V2);
}
BOOST_AUTO_TEST_CASE(addrman_size)
diff --git a/src/test/blockfilter_index_tests.cpp b/src/test/blockfilter_index_tests.cpp
index a9009948ee..d44d84af93 100644
--- a/src/test/blockfilter_index_tests.cpp
+++ b/src/test/blockfilter_index_tests.cpp
@@ -162,9 +162,8 @@ BOOST_FIXTURE_TEST_CASE(blockfilter_index_initial_sync, BuildChainTestingSetup)
LOCK(cs_main);
tip = m_node.chainman->ActiveChain().Tip();
}
- CKey coinbase_key_A, coinbase_key_B;
- coinbase_key_A.MakeNewKey(true);
- coinbase_key_B.MakeNewKey(true);
+ CKey coinbase_key_A = GenerateRandomKey();
+ CKey coinbase_key_B = GenerateRandomKey();
CScript coinbase_script_pub_key_A = GetScriptForDestination(PKHash(coinbase_key_A.GetPubKey()));
CScript coinbase_script_pub_key_B = GetScriptForDestination(PKHash(coinbase_key_B.GetPubKey()));
std::vector<std::shared_ptr<CBlock>> chainA, chainB;
diff --git a/src/test/bswap_tests.cpp b/src/test/bswap_tests.cpp
index 2be7122fc1..fe48e39c41 100644
--- a/src/test/bswap_tests.cpp
+++ b/src/test/bswap_tests.cpp
@@ -16,9 +16,9 @@ BOOST_AUTO_TEST_CASE(bswap_tests)
uint16_t e1 = 0x3412;
uint32_t e2 = 0xbc9a7856;
uint64_t e3 = 0xbc9a78563412f0de;
- BOOST_CHECK(bswap_16(u1) == e1);
- BOOST_CHECK(bswap_32(u2) == e2);
- BOOST_CHECK(bswap_64(u3) == e3);
+ BOOST_CHECK(internal_bswap_16(u1) == e1);
+ BOOST_CHECK(internal_bswap_32(u2) == e2);
+ BOOST_CHECK(internal_bswap_64(u3) == e3);
}
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/coinstatsindex_tests.cpp b/src/test/coinstatsindex_tests.cpp
index cc1ec49d41..08814c1499 100644
--- a/src/test/coinstatsindex_tests.cpp
+++ b/src/test/coinstatsindex_tests.cpp
@@ -70,7 +70,7 @@ BOOST_FIXTURE_TEST_CASE(coinstatsindex_initial_sync, TestChain100Setup)
// SyncWithValidationInterfaceQueue() call below is also needed to ensure
// TSAN always sees the test thread waiting for the notification thread, and
// avoid potential false positive reports.
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
// Shutdown sequence (c.f. Shutdown() in init.cpp)
coin_stats_index.Stop();
diff --git a/src/test/compress_tests.cpp b/src/test/compress_tests.cpp
index b56629ae40..264b47b07c 100644
--- a/src/test/compress_tests.cpp
+++ b/src/test/compress_tests.cpp
@@ -65,8 +65,7 @@ BOOST_AUTO_TEST_CASE(compress_amounts)
BOOST_AUTO_TEST_CASE(compress_script_to_ckey_id)
{
// case CKeyID
- CKey key;
- key.MakeNewKey(true);
+ CKey key = GenerateRandomKey();
CPubKey pubkey = key.GetPubKey();
CScript script = CScript() << OP_DUP << OP_HASH160 << ToByteVector(pubkey.GetID()) << OP_EQUALVERIFY << OP_CHECKSIG;
@@ -101,8 +100,7 @@ BOOST_AUTO_TEST_CASE(compress_script_to_cscript_id)
BOOST_AUTO_TEST_CASE(compress_script_to_compressed_pubkey_id)
{
- CKey key;
- key.MakeNewKey(true); // case compressed PubKeyID
+ CKey key = GenerateRandomKey(); // case compressed PubKeyID
CScript script = CScript() << ToByteVector(key.GetPubKey()) << OP_CHECKSIG; // COMPRESSED_PUBLIC_KEY_SIZE (33)
BOOST_CHECK_EQUAL(script.size(), 35U);
@@ -119,8 +117,7 @@ BOOST_AUTO_TEST_CASE(compress_script_to_compressed_pubkey_id)
BOOST_AUTO_TEST_CASE(compress_script_to_uncompressed_pubkey_id)
{
- CKey key;
- key.MakeNewKey(false); // case uncompressed PubKeyID
+ CKey key = GenerateRandomKey(/*compressed=*/false); // case uncompressed PubKeyID
CScript script = CScript() << ToByteVector(key.GetPubKey()) << OP_CHECKSIG; // PUBLIC_KEY_SIZE (65)
BOOST_CHECK_EQUAL(script.size(), 67U); // 1 char code + 65 char pubkey + OP_CHECKSIG
diff --git a/src/test/crypto_tests.cpp b/src/test/crypto_tests.cpp
index 0a6378adf4..46acc6fc9f 100644
--- a/src/test/crypto_tests.cpp
+++ b/src/test/crypto_tests.cpp
@@ -1060,28 +1060,6 @@ BOOST_AUTO_TEST_CASE(hkdf_hmac_sha256_l32_tests)
"8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d");
}
-BOOST_AUTO_TEST_CASE(countbits_tests)
-{
- FastRandomContext ctx;
- for (unsigned int i = 0; i <= 64; ++i) {
- if (i == 0) {
- // Check handling of zero.
- BOOST_CHECK_EQUAL(CountBits(0), 0U);
- } else if (i < 10) {
- for (uint64_t j = uint64_t{1} << (i - 1); (j >> i) == 0; ++j) {
- // Exhaustively test up to 10 bits
- BOOST_CHECK_EQUAL(CountBits(j), i);
- }
- } else {
- for (int k = 0; k < 1000; k++) {
- // Randomly test 1000 samples of each length above 10 bits.
- uint64_t j = (uint64_t{1}) << (i - 1) | ctx.randbits(i - 1);
- BOOST_CHECK_EQUAL(CountBits(j), i);
- }
- }
- }
-}
-
BOOST_AUTO_TEST_CASE(sha256d64)
{
for (int i = 0; i <= 32; ++i) {
diff --git a/src/test/data/tx_valid.json b/src/test/data/tx_valid.json
index b874f6f26c..70df0d0f69 100644
--- a/src/test/data/tx_valid.json
+++ b/src/test/data/tx_valid.json
@@ -319,6 +319,10 @@
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x7c17aff532f22beb54069942f9bf567a66133eaf EQUAL"]],
"0200000001000100000000000000000000000000000000000000000000000000000000000000000000030251b2010000000100000000000000000000000000", "NONE"],
+["Valid CHECKSEQUENCEVERIFY even with negative tx version number"],
+[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "HASH160 0x14 0x7c17aff532f22beb54069942f9bf567a66133eaf EQUAL"]],
+"ffffffff01000100000000000000000000000000000000000000000000000000000000000000000000030251b2010000000100000000000000000000000000", "NONE"],
+
["Valid P2WPKH (Private key of segwit tests is L5AQtV2HDm4xGsseLokK2VAT2EtYKcTm3c7HwqnJBFt9LdaQULsM)"],
[[["0000000000000000000000000000000000000000000000000000000000000100", 0, "0x00 0x14 0x4c9c3dfac4207d5d8cb89df5722cb3d712385e3f", 1000]],
"0100000000010100010000000000000000000000000000000000000000000000000000000000000000000000ffffffff01e8030000000000001976a9144c9c3dfac4207d5d8cb89df5722cb3d712385e3f88ac02483045022100cfb07164b36ba64c1b1e8c7720a56ad64d96f6ef332d3d37f9cb3c96477dc44502200a464cd7a9cf94cd70f66ce4f4f0625ef650052c7afcfe29d7d7e01830ff91ed012103596d3451025c19dbbdeb932d6bf8bfb4ad499b95b6f88db8899efac102e5fc7100000000", "NONE"],
diff --git a/src/test/fuzz/addition_overflow.cpp b/src/test/fuzz/addition_overflow.cpp
index 7b84bfda20..5100b6f438 100644
--- a/src/test/fuzz/addition_overflow.cpp
+++ b/src/test/fuzz/addition_overflow.cpp
@@ -11,14 +11,6 @@
#include <string>
#include <vector>
-#if defined(__has_builtin)
-#if __has_builtin(__builtin_add_overflow)
-#define HAVE_BUILTIN_ADD_OVERFLOW
-#endif
-#elif defined(__GNUC__)
-#define HAVE_BUILTIN_ADD_OVERFLOW
-#endif
-
namespace {
template <typename T>
void TestAdditionOverflow(FuzzedDataProvider& fuzzed_data_provider)
@@ -32,14 +24,12 @@ void TestAdditionOverflow(FuzzedDataProvider& fuzzed_data_provider)
assert(is_addition_overflow_custom == AdditionOverflow(j, i));
assert(maybe_add == CheckedAdd(j, i));
assert(sat_add == SaturatingAdd(j, i));
-#if defined(HAVE_BUILTIN_ADD_OVERFLOW)
T result_builtin;
const bool is_addition_overflow_builtin = __builtin_add_overflow(i, j, &result_builtin);
assert(is_addition_overflow_custom == is_addition_overflow_builtin);
if (!is_addition_overflow_custom) {
assert(i + j == result_builtin);
}
-#endif
if (is_addition_overflow_custom) {
assert(sat_add == std::numeric_limits<T>::min() || sat_add == std::numeric_limits<T>::max());
} else {
diff --git a/src/test/fuzz/addrman.cpp b/src/test/fuzz/addrman.cpp
index ece396aadf..8a54cc656d 100644
--- a/src/test/fuzz/addrman.cpp
+++ b/src/test/fuzz/addrman.cpp
@@ -64,26 +64,13 @@ FUZZ_TARGET(data_stream_addr_man, .init = initialize_addrman)
CNetAddr RandAddr(FuzzedDataProvider& fuzzed_data_provider, FastRandomContext& fast_random_context)
{
CNetAddr addr;
- if (fuzzed_data_provider.remaining_bytes() > 1 && fuzzed_data_provider.ConsumeBool()) {
- addr = ConsumeNetAddr(fuzzed_data_provider);
- } else {
- // The networks [1..6] correspond to CNetAddr::BIP155Network (private).
- static const std::map<uint8_t, uint8_t> net_len_map = {{1, ADDR_IPV4_SIZE},
- {2, ADDR_IPV6_SIZE},
- {4, ADDR_TORV3_SIZE},
- {5, ADDR_I2P_SIZE},
- {6, ADDR_CJDNS_SIZE}};
- uint8_t net = fast_random_context.randrange(5) + 1; // [1..5]
- if (net == 3) {
- net = 6;
+ assert(!addr.IsValid());
+ for (size_t i = 0; i < 8 && !addr.IsValid(); ++i) {
+ if (fuzzed_data_provider.remaining_bytes() > 1 && fuzzed_data_provider.ConsumeBool()) {
+ addr = ConsumeNetAddr(fuzzed_data_provider);
+ } else {
+ addr = ConsumeNetAddr(fuzzed_data_provider, &fast_random_context);
}
-
- DataStream s{};
-
- s << net;
- s << fast_random_context.randbytes(net_len_map.at(net));
-
- s >> CAddress::V2_NETWORK(addr);
}
// Return a dummy IPv4 5.5.5.5 if we generated an invalid address.
diff --git a/src/test/fuzz/banman.cpp b/src/test/fuzz/banman.cpp
index 4a040c56de..b26151f63c 100644
--- a/src/test/fuzz/banman.cpp
+++ b/src/test/fuzz/banman.cpp
@@ -70,11 +70,13 @@ FUZZ_TARGET(banman, .init = initialize_banman)
fuzzed_data_provider,
[&] {
CNetAddr net_addr{ConsumeNetAddr(fuzzed_data_provider)};
- const std::optional<CNetAddr>& addr{LookupHost(net_addr.ToStringAddr(), /*fAllowLookup=*/false)};
- if (addr.has_value() && addr->IsValid()) {
- net_addr = *addr;
- } else {
- contains_invalid = true;
+ if (!net_addr.IsCJDNS() || !net_addr.IsValid()) {
+ const std::optional<CNetAddr>& addr{LookupHost(net_addr.ToStringAddr(), /*fAllowLookup=*/false)};
+ if (addr.has_value() && addr->IsValid()) {
+ net_addr = *addr;
+ } else {
+ contains_invalid = true;
+ }
}
ban_man.Ban(net_addr, ConsumeBanTimeOffset(fuzzed_data_provider), fuzzed_data_provider.ConsumeBool());
},
diff --git a/src/test/fuzz/connman.cpp b/src/test/fuzz/connman.cpp
index 24f91abd25..8f5f6a6071 100644
--- a/src/test/fuzz/connman.cpp
+++ b/src/test/fuzz/connman.cpp
@@ -38,6 +38,12 @@ FUZZ_TARGET(connman, .init = initialize_connman)
*g_setup->m_node.netgroupman,
Params(),
fuzzed_data_provider.ConsumeBool()};
+
+ const uint64_t max_outbound_limit{fuzzed_data_provider.ConsumeIntegral<uint64_t>()};
+ CConnman::Options options;
+ options.nMaxOutboundLimit = max_outbound_limit;
+ connman.Init(options);
+
CNetAddr random_netaddr;
CNode random_node = ConsumeNode(fuzzed_data_provider);
CSubNet random_subnet;
@@ -125,7 +131,7 @@ FUZZ_TARGET(connman, .init = initialize_connman)
(void)connman.GetAddedNodeInfo(fuzzed_data_provider.ConsumeBool());
(void)connman.GetExtraFullOutboundCount();
(void)connman.GetLocalServices();
- (void)connman.GetMaxOutboundTarget();
+ assert(connman.GetMaxOutboundTarget() == max_outbound_limit);
(void)connman.GetMaxOutboundTimeframe();
(void)connman.GetMaxOutboundTimeLeftInCycle();
(void)connman.GetNetworkActive();
diff --git a/src/test/fuzz/descriptor_parse.cpp b/src/test/fuzz/descriptor_parse.cpp
index 5474b38204..6ea315d4e2 100644
--- a/src/test/fuzz/descriptor_parse.cpp
+++ b/src/test/fuzz/descriptor_parse.cpp
@@ -67,6 +67,11 @@ void initialize_mocked_descriptor_parse()
FUZZ_TARGET(mocked_descriptor_parse, .init = initialize_mocked_descriptor_parse)
{
+ // Key derivation is expensive. Deriving deep derivation paths take a lot of compute and we'd
+ // rather spend time elsewhere in this target, like on the actual descriptor syntax. So rule
+ // out strings which could correspond to a descriptor containing a too large derivation path.
+ if (HasDeepDerivPath(buffer)) return;
+
const std::string mocked_descriptor{buffer.begin(), buffer.end()};
if (const auto descriptor = MOCKED_DESC_CONVERTER.GetDescriptor(mocked_descriptor)) {
FlatSigningProvider signing_provider;
@@ -78,6 +83,9 @@ FUZZ_TARGET(mocked_descriptor_parse, .init = initialize_mocked_descriptor_parse)
FUZZ_TARGET(descriptor_parse, .init = initialize_descriptor_parse)
{
+ // See comment above for rationale.
+ if (HasDeepDerivPath(buffer)) return;
+
const std::string descriptor(buffer.begin(), buffer.end());
FlatSigningProvider signing_provider;
std::string error;
diff --git a/src/test/fuzz/fuzz.cpp b/src/test/fuzz/fuzz.cpp
index 0507aa251b..d1a67cb0d8 100644
--- a/src/test/fuzz/fuzz.cpp
+++ b/src/test/fuzz/fuzz.cpp
@@ -1,4 +1,4 @@
-// Copyright (c) 2009-2022 The Bitcoin Core developers
+// Copyright (c) 2009-present The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -73,7 +73,7 @@ auto& FuzzTargets()
void FuzzFrameworkRegisterTarget(std::string_view name, TypeTestOneInput target, FuzzTargetOptions opts)
{
- const auto it_ins{FuzzTargets().try_emplace(name, FuzzTarget /* temporary can be dropped in C++20 */ {std::move(target), std::move(opts)})};
+ const auto it_ins{FuzzTargets().try_emplace(name, FuzzTarget /* temporary can be dropped after clang-16 */ {std::move(target), std::move(opts)})};
Assert(it_ins.second);
}
diff --git a/src/test/fuzz/headerssync.cpp b/src/test/fuzz/headerssync.cpp
index 62f6bbaffe..1aa878bd6d 100644
--- a/src/test/fuzz/headerssync.cpp
+++ b/src/test/fuzz/headerssync.cpp
@@ -108,7 +108,7 @@ FUZZ_TARGET(headers_sync_state, .init = initialize_headers_sync_state_fuzz)
// If we get to redownloading, the presynced headers need
// to have the min amount of work on them.
- assert(CalculateHeadersWork(all_headers) >= min_work);
+ assert(CalculateClaimedHeadersWork(all_headers) >= min_work);
}
}
diff --git a/src/test/fuzz/integer.cpp b/src/test/fuzz/integer.cpp
index 9b97958a5d..db246bb84e 100644
--- a/src/test/fuzz/integer.cpp
+++ b/src/test/fuzz/integer.cpp
@@ -80,7 +80,6 @@ FUZZ_TARGET(integer, .init = initialize_integer)
static const uint256 u256_max(uint256S("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff"));
const std::vector<uint256> v256{u256, u256_min, u256_max};
(void)ComputeMerkleRoot(v256);
- (void)CountBits(u64);
(void)DecompressAmount(u64);
{
if (std::optional<CAmount> parsed = ParseMoney(FormatMoney(i64))) {
@@ -213,7 +212,6 @@ FUZZ_TARGET(integer, .init = initialize_integer)
{
const ServiceFlags service_flags = (ServiceFlags)u64;
- (void)HasAllDesirableServiceFlags(service_flags);
(void)MayHaveUsefulAddressDB(service_flags);
}
diff --git a/src/test/fuzz/key.cpp b/src/test/fuzz/key.cpp
index be45443172..9e1e318e02 100644
--- a/src/test/fuzz/key.cpp
+++ b/src/test/fuzz/key.cpp
@@ -322,7 +322,10 @@ FUZZ_TARGET(ellswift_roundtrip, .init = initialize_key)
auto encoded_ellswift = key.EllSwiftCreate(ent32);
auto decoded_pubkey = encoded_ellswift.Decode();
- assert(key.VerifyPubKey(decoded_pubkey));
+ uint256 hash{ConsumeUInt256(fdp)};
+ std::vector<unsigned char> sig;
+ key.Sign(hash, sig);
+ assert(decoded_pubkey.Verify(hash, sig));
}
FUZZ_TARGET(bip324_ecdh, .init = initialize_key)
diff --git a/src/test/fuzz/multiplication_overflow.cpp b/src/test/fuzz/multiplication_overflow.cpp
index fbe4d061bf..aeef4f24b7 100644
--- a/src/test/fuzz/multiplication_overflow.cpp
+++ b/src/test/fuzz/multiplication_overflow.cpp
@@ -2,10 +2,6 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
@@ -21,18 +17,12 @@ void TestMultiplicationOverflow(FuzzedDataProvider& fuzzed_data_provider)
const T i = fuzzed_data_provider.ConsumeIntegral<T>();
const T j = fuzzed_data_provider.ConsumeIntegral<T>();
const bool is_multiplication_overflow_custom = MultiplicationOverflow(i, j);
-#if defined(HAVE_BUILTIN_MUL_OVERFLOW)
T result_builtin;
const bool is_multiplication_overflow_builtin = __builtin_mul_overflow(i, j, &result_builtin);
assert(is_multiplication_overflow_custom == is_multiplication_overflow_builtin);
if (!is_multiplication_overflow_custom) {
assert(i * j == result_builtin);
}
-#else
- if (!is_multiplication_overflow_custom) {
- (void)(i * j);
- }
-#endif
}
} // namespace
diff --git a/src/test/fuzz/net.cpp b/src/test/fuzz/net.cpp
index c882bd766a..e8b1480c5b 100644
--- a/src/test/fuzz/net.cpp
+++ b/src/test/fuzz/net.cpp
@@ -77,3 +77,40 @@ FUZZ_TARGET(net, .init = initialize_net)
(void)node.HasPermission(net_permission_flags);
(void)node.ConnectedThroughNetwork();
}
+
+FUZZ_TARGET(local_address, .init = initialize_net)
+{
+ FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
+ CService service{ConsumeService(fuzzed_data_provider)};
+ CNode node{ConsumeNode(fuzzed_data_provider)};
+ {
+ LOCK(g_maplocalhost_mutex);
+ mapLocalHost.clear();
+ }
+ LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000) {
+ CallOneOf(
+ fuzzed_data_provider,
+ [&] {
+ service = ConsumeService(fuzzed_data_provider);
+ },
+ [&] {
+ const bool added{AddLocal(service, fuzzed_data_provider.ConsumeIntegralInRange<int>(0, LOCAL_MAX - 1))};
+ if (!added) return;
+ assert(service.IsRoutable());
+ assert(IsLocal(service));
+ assert(SeenLocal(service));
+ },
+ [&] {
+ (void)RemoveLocal(service);
+ },
+ [&] {
+ (void)SeenLocal(service);
+ },
+ [&] {
+ (void)IsLocal(service);
+ },
+ [&] {
+ (void)GetLocalAddress(node);
+ });
+ }
+}
diff --git a/src/test/fuzz/net_permissions.cpp b/src/test/fuzz/net_permissions.cpp
index ae343602e9..6ea2139c46 100644
--- a/src/test/fuzz/net_permissions.cpp
+++ b/src/test/fuzz/net_permissions.cpp
@@ -17,7 +17,7 @@
FUZZ_TARGET(net_permissions)
{
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
- const std::string s = fuzzed_data_provider.ConsumeRandomLengthString(32);
+ const std::string s = fuzzed_data_provider.ConsumeRandomLengthString(1000);
const NetPermissionFlags net_permission_flags = ConsumeWeakEnum(fuzzed_data_provider, ALL_NET_PERMISSION_FLAGS);
NetWhitebindPermissions net_whitebind_permissions;
diff --git a/src/test/fuzz/netaddress.cpp b/src/test/fuzz/netaddress.cpp
index 5141d3362d..4803cdccad 100644
--- a/src/test/fuzz/netaddress.cpp
+++ b/src/test/fuzz/netaddress.cpp
@@ -26,6 +26,12 @@ FUZZ_TARGET(netaddress)
if (net_addr.GetNetwork() == Network::NET_ONION) {
assert(net_addr.IsTor());
}
+ if (net_addr.GetNetwork() == Network::NET_I2P) {
+ assert(net_addr.IsI2P());
+ }
+ if (net_addr.GetNetwork() == Network::NET_CJDNS) {
+ assert(net_addr.IsCJDNS());
+ }
if (net_addr.GetNetwork() == Network::NET_INTERNAL) {
assert(net_addr.IsInternal());
}
@@ -69,6 +75,12 @@ FUZZ_TARGET(netaddress)
if (net_addr.IsTor()) {
assert(net_addr.GetNetwork() == Network::NET_ONION);
}
+ if (net_addr.IsI2P()) {
+ assert(net_addr.GetNetwork() == Network::NET_I2P);
+ }
+ if (net_addr.IsCJDNS()) {
+ assert(net_addr.GetNetwork() == Network::NET_CJDNS);
+ }
(void)net_addr.IsValid();
(void)net_addr.ToStringAddr();
diff --git a/src/test/fuzz/package_eval.cpp b/src/test/fuzz/package_eval.cpp
index 5a08d0ff44..a48ce37bce 100644
--- a/src/test/fuzz/package_eval.cpp
+++ b/src/test/fuzz/package_eval.cpp
@@ -6,6 +6,7 @@
#include <node/context.h>
#include <node/mempool_args.h>
#include <node/miner.h>
+#include <policy/v3_policy.h>
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
@@ -46,7 +47,7 @@ void initialize_tx_pool()
g_outpoints_coinbase_init_mature.push_back(prevout);
}
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
struct OutpointsUpdater final : public CValidationInterface {
@@ -119,7 +120,8 @@ CTxMemPool MakeMempool(FuzzedDataProvider& fuzzed_data_provider, const NodeConte
mempool_opts.limits.descendant_size_vbytes = fuzzed_data_provider.ConsumeIntegralInRange<unsigned>(0, 202) * 1'000;
mempool_opts.max_size_bytes = fuzzed_data_provider.ConsumeIntegralInRange<unsigned>(0, 200) * 1'000'000;
mempool_opts.expiry = std::chrono::hours{fuzzed_data_provider.ConsumeIntegralInRange<unsigned>(0, 999)};
- nBytesPerSigOp = fuzzed_data_provider.ConsumeIntegralInRange<unsigned>(1, 999);
+ // Only interested in 2 cases: sigop cost 0 or when single legacy sigop cost is >> 1KvB
+ nBytesPerSigOp = fuzzed_data_provider.ConsumeIntegralInRange<unsigned>(0, 1) * 10'000;
mempool_opts.check_ratio = 1;
mempool_opts.require_standard = fuzzed_data_provider.ConsumeBool();
@@ -145,7 +147,7 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
}
auto outpoints_updater = std::make_shared<OutpointsUpdater>(mempool_outpoints);
- RegisterSharedValidationInterface(outpoints_updater);
+ node.validation_signals->RegisterSharedValidationInterface(outpoints_updater);
CTxMemPool tx_pool_{MakeMempool(fuzzed_data_provider, node)};
MockedTxPool& tx_pool = *static_cast<MockedTxPool*>(&tx_pool_);
@@ -171,11 +173,11 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
// Create transaction to add to the mempool
const CTransactionRef tx = [&] {
CMutableTransaction tx_mut;
- tx_mut.nVersion = CTransaction::CURRENT_VERSION;
+ tx_mut.nVersion = fuzzed_data_provider.ConsumeBool() ? 3 : CTransaction::CURRENT_VERSION;
tx_mut.nLockTime = fuzzed_data_provider.ConsumeBool() ? 0 : fuzzed_data_provider.ConsumeIntegral<uint32_t>();
// Last tx will sweep all outpoints in package
const auto num_in = last_tx ? package_outpoints.size() : fuzzed_data_provider.ConsumeIntegralInRange<int>(1, mempool_outpoints.size());
- const auto num_out = fuzzed_data_provider.ConsumeIntegralInRange<int>(1, mempool_outpoints.size() * 2);
+ auto num_out = fuzzed_data_provider.ConsumeIntegralInRange<int>(1, mempool_outpoints.size() * 2);
auto& outpoints = last_tx ? package_outpoints : mempool_outpoints;
@@ -211,17 +213,24 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
tx_mut.vin.push_back(tx_mut.vin.back());
}
- // Refer to a non-existant input
+ // Refer to a non-existent input
if (fuzzed_data_provider.ConsumeBool()) {
tx_mut.vin.emplace_back();
}
+ // Make a p2pk output to make sigops adjusted vsize to violate v3, potentially, which is never spent
+ if (last_tx && amount_in > 1000 && fuzzed_data_provider.ConsumeBool()) {
+ tx_mut.vout.emplace_back(1000, CScript() << std::vector<unsigned char>(33, 0x02) << OP_CHECKSIG);
+ // Don't add any other outputs.
+ num_out = 1;
+ amount_in -= 1000;
+ }
+
const auto amount_fee = fuzzed_data_provider.ConsumeIntegralInRange<CAmount>(0, amount_in);
const auto amount_out = (amount_in - amount_fee) / num_out;
for (int i = 0; i < num_out; ++i) {
tx_mut.vout.emplace_back(amount_out, P2WSH_EMPTY);
}
- // TODO vary transaction sizes to catch size-related issues
auto tx = MakeTransactionRef(tx_mut);
// Restore previously removed outpoints, except in-package outpoints
if (!last_tx) {
@@ -260,8 +269,7 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
// Remember all added transactions
std::set<CTransactionRef> added;
auto txr = std::make_shared<TransactionsDelta>(added);
- RegisterSharedValidationInterface(txr);
- const bool bypass_limits = fuzzed_data_provider.ConsumeBool();
+ node.validation_signals->RegisterSharedValidationInterface(txr);
// When there are multiple transactions in the package, we call ProcessNewPackage(txs, test_accept=false)
// and AcceptToMemoryPool(txs.back(), test_accept=true). When there is only 1 transaction, we might flip it
@@ -271,17 +279,20 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
const auto result_package = WITH_LOCK(::cs_main,
return ProcessNewPackage(chainstate, tx_pool, txs, /*test_accept=*/single_submit));
- const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, txs.back(), GetTime(), bypass_limits, /*test_accept=*/!single_submit));
- const bool accepted = res.m_result_type == MempoolAcceptResult::ResultType::VALID;
+ // Always set bypass_limits to false because it is not supported in ProcessNewPackage and
+ // can be a source of divergence.
+ const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, txs.back(), GetTime(),
+ /*bypass_limits=*/false, /*test_accept=*/!single_submit));
+ const bool passed = res.m_result_type == MempoolAcceptResult::ResultType::VALID;
- SyncWithValidationInterfaceQueue();
- UnregisterSharedValidationInterface(txr);
+ node.validation_signals->SyncWithValidationInterfaceQueue();
+ node.validation_signals->UnregisterSharedValidationInterface(txr);
// There is only 1 transaction in the package. We did a test-package-accept and a ATMP
if (single_submit) {
- Assert(accepted != added.empty());
- Assert(accepted == res.m_state.IsValid());
- if (accepted) {
+ Assert(passed != added.empty());
+ Assert(passed == res.m_state.IsValid());
+ if (passed) {
Assert(added.size() == 1);
Assert(txs.back() == *added.begin());
}
@@ -295,9 +306,11 @@ FUZZ_TARGET(tx_package_eval, .init = initialize_tx_pool)
// This is empty if it fails early checks, or "full" if transactions are looked at deeper
Assert(result_package.m_tx_results.size() == txs.size() || result_package.m_tx_results.empty());
}
+
+ CheckMempoolV3Invariants(tx_pool);
}
- UnregisterSharedValidationInterface(outpoints_updater);
+ node.validation_signals->UnregisterSharedValidationInterface(outpoints_updater);
WITH_LOCK(::cs_main, tx_pool.check(chainstate.CoinsTip(), chainstate.m_chain.Height() + 1));
}
diff --git a/src/test/fuzz/policy_estimator.cpp b/src/test/fuzz/policy_estimator.cpp
index 40a1fc80f0..a4e1947b9f 100644
--- a/src/test/fuzz/policy_estimator.cpp
+++ b/src/test/fuzz/policy_estimator.cpp
@@ -45,12 +45,14 @@ FUZZ_TARGET(policy_estimator, .init = initialize_policy_estimator)
}
const CTransaction tx{*mtx};
const CTxMemPoolEntry& entry = ConsumeTxMemPoolEntry(fuzzed_data_provider, tx);
+ const auto tx_submitted_in_package = fuzzed_data_provider.ConsumeBool();
+ const auto tx_has_mempool_parents = fuzzed_data_provider.ConsumeBool();
const auto tx_info = NewMempoolTransactionInfo(entry.GetSharedTx(), entry.GetFee(),
entry.GetTxSize(), entry.GetHeight(),
- /* m_from_disconnected_block */ false,
- /* m_submitted_in_package */ false,
- /* m_chainstate_is_current */ true,
- /* m_has_no_mempool_parents */ fuzzed_data_provider.ConsumeBool());
+ /*mempool_limit_bypassed=*/false,
+ tx_submitted_in_package,
+ /*chainstate_is_current=*/true,
+ tx_has_mempool_parents);
block_policy_estimator.processTransaction(tx_info);
if (fuzzed_data_provider.ConsumeBool()) {
(void)block_policy_estimator.removeTx(tx.GetHash());
diff --git a/src/test/fuzz/process_message.cpp b/src/test/fuzz/process_message.cpp
index 56b391ed5c..a467fd5382 100644
--- a/src/test/fuzz/process_message.cpp
+++ b/src/test/fuzz/process_message.cpp
@@ -47,7 +47,7 @@ void initialize_process_message()
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
MineBlock(g_setup->m_node, CScript() << OP_TRUE);
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
FUZZ_TARGET(process_message, .init = initialize_process_message)
@@ -89,6 +89,6 @@ FUZZ_TARGET(process_message, .init = initialize_process_message)
}
g_setup->m_node.peerman->SendMessages(&p2p_node);
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
g_setup->m_node.connman->StopNodes();
}
diff --git a/src/test/fuzz/process_messages.cpp b/src/test/fuzz/process_messages.cpp
index 6b264907b5..38acd432fa 100644
--- a/src/test/fuzz/process_messages.cpp
+++ b/src/test/fuzz/process_messages.cpp
@@ -37,7 +37,7 @@ void initialize_process_messages()
for (int i = 0; i < 2 * COINBASE_MATURITY; i++) {
MineBlock(g_setup->m_node, CScript() << OP_TRUE);
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
FUZZ_TARGET(process_messages, .init = initialize_process_messages)
@@ -89,6 +89,6 @@ FUZZ_TARGET(process_messages, .init = initialize_process_messages)
g_setup->m_node.peerman->SendMessages(&random_node);
}
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
g_setup->m_node.connman->StopNodes();
}
diff --git a/src/test/fuzz/tx_pool.cpp b/src/test/fuzz/tx_pool.cpp
index 4ad0956201..b6ba612a84 100644
--- a/src/test/fuzz/tx_pool.cpp
+++ b/src/test/fuzz/tx_pool.cpp
@@ -6,6 +6,7 @@
#include <node/context.h>
#include <node/mempool_args.h>
#include <node/miner.h>
+#include <policy/v3_policy.h>
#include <test/fuzz/FuzzedDataProvider.h>
#include <test/fuzz/fuzz.h>
#include <test/fuzz/util.h>
@@ -49,7 +50,7 @@ void initialize_tx_pool()
g_outpoints_coinbase_init_immature;
outpoints.push_back(prevout);
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
struct TransactionsDelta final : public CValidationInterface {
@@ -101,12 +102,10 @@ void Finish(FuzzedDataProvider& fuzzed_data_provider, MockedTxPool& tx_pool, Cha
if (!info_all.empty()) {
const auto& tx_to_remove = *PickValue(fuzzed_data_provider, info_all).tx;
WITH_LOCK(tx_pool.cs, tx_pool.removeRecursive(tx_to_remove, MemPoolRemovalReason::BLOCK /* dummy */));
- std::vector<uint256> all_txids;
- tx_pool.queryHashes(all_txids);
- assert(all_txids.size() < info_all.size());
+ assert(tx_pool.size() < info_all.size());
WITH_LOCK(::cs_main, tx_pool.check(chainstate.CoinsTip(), chainstate.m_chain.Height() + 1));
}
- SyncWithValidationInterfaceQueue();
+ g_setup->m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
void MockTime(FuzzedDataProvider& fuzzed_data_provider, const Chainstate& chainstate)
@@ -229,7 +228,7 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool)
// Create transaction to add to the mempool
const CTransactionRef tx = [&] {
CMutableTransaction tx_mut;
- tx_mut.nVersion = CTransaction::CURRENT_VERSION;
+ tx_mut.nVersion = fuzzed_data_provider.ConsumeBool() ? 3 : CTransaction::CURRENT_VERSION;
tx_mut.nLockTime = fuzzed_data_provider.ConsumeBool() ? 0 : fuzzed_data_provider.ConsumeIntegral<uint32_t>();
const auto num_in = fuzzed_data_provider.ConsumeIntegralInRange<int>(1, outpoints_rbf.size());
const auto num_out = fuzzed_data_provider.ConsumeIntegralInRange<int>(1, outpoints_rbf.size() * 2);
@@ -286,7 +285,7 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool)
std::set<CTransactionRef> removed;
std::set<CTransactionRef> added;
auto txr = std::make_shared<TransactionsDelta>(removed, added);
- RegisterSharedValidationInterface(txr);
+ node.validation_signals->RegisterSharedValidationInterface(txr);
const bool bypass_limits = fuzzed_data_provider.ConsumeBool();
// Make sure ProcessNewPackage on one transaction works.
@@ -304,8 +303,8 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool)
const auto res = WITH_LOCK(::cs_main, return AcceptToMemoryPool(chainstate, tx, GetTime(), bypass_limits, /*test_accept=*/false));
const bool accepted = res.m_result_type == MempoolAcceptResult::ResultType::VALID;
- SyncWithValidationInterfaceQueue();
- UnregisterSharedValidationInterface(txr);
+ node.validation_signals->SyncWithValidationInterfaceQueue();
+ node.validation_signals->UnregisterSharedValidationInterface(txr);
bool txid_in_mempool = tx_pool.exists(GenTxid::Txid(tx->GetHash()));
bool wtxid_in_mempool = tx_pool.exists(GenTxid::Wtxid(tx->GetWitnessHash()));
@@ -315,6 +314,7 @@ FUZZ_TARGET(tx_pool_standard, .init = initialize_tx_pool)
if (accepted) {
Assert(added.size() == 1); // For now, no package acceptance
Assert(tx == *added.begin());
+ CheckMempoolV3Invariants(tx_pool);
} else {
// Do not consider rejected transaction removed
removed.erase(tx);
@@ -407,6 +407,7 @@ FUZZ_TARGET(tx_pool, .init = initialize_tx_pool)
const bool accepted = res.m_result_type == MempoolAcceptResult::ResultType::VALID;
if (accepted) {
txids.push_back(tx->GetHash());
+ CheckMempoolV3Invariants(tx_pool);
}
}
Finish(fuzzed_data_provider, tx_pool, chainstate);
diff --git a/src/test/fuzz/util.cpp b/src/test/fuzz/util.cpp
index 23b0761355..259b00fcae 100644
--- a/src/test/fuzz/util.cpp
+++ b/src/test/fuzz/util.cpp
@@ -272,7 +272,7 @@ FILE* FuzzedFileProvider::open()
[&] {
mode = "a+";
});
-#if defined _GNU_SOURCE && !defined __ANDROID__
+#if defined _GNU_SOURCE && (defined(__linux__) || defined(__FreeBSD__))
const cookie_io_functions_t io_hooks = {
FuzzedFileProvider::read,
FuzzedFileProvider::write,
diff --git a/src/test/fuzz/util/descriptor.cpp b/src/test/fuzz/util/descriptor.cpp
index 5bfd2721ce..df78bdf314 100644
--- a/src/test/fuzz/util/descriptor.cpp
+++ b/src/test/fuzz/util/descriptor.cpp
@@ -70,3 +70,17 @@ std::optional<std::string> MockedDescriptorConverter::GetDescriptor(std::string_
return desc;
}
+
+bool HasDeepDerivPath(const FuzzBufferType& buff, const int max_depth)
+{
+ auto depth{0};
+ for (const auto& ch: buff) {
+ if (ch == ',') {
+ // A comma is always present between two key expressions, so we use that as a delimiter.
+ depth = 0;
+ } else if (ch == '/') {
+ if (++depth > max_depth) return true;
+ }
+ }
+ return false;
+}
diff --git a/src/test/fuzz/util/descriptor.h b/src/test/fuzz/util/descriptor.h
index 6289b91b07..cd41dbafa3 100644
--- a/src/test/fuzz/util/descriptor.h
+++ b/src/test/fuzz/util/descriptor.h
@@ -8,6 +8,7 @@
#include <key_io.h>
#include <util/strencodings.h>
#include <script/descriptor.h>
+#include <test/fuzz/fuzz.h>
#include <functional>
@@ -45,4 +46,13 @@ public:
std::optional<std::string> GetDescriptor(std::string_view mocked_desc) const;
};
+//! Default maximum number of derivation indexes in a single derivation path when limiting its depth.
+constexpr int MAX_DEPTH{2};
+
+/**
+ * Whether the buffer, if it represents a valid descriptor, contains a derivation path deeper than
+ * a given maximum depth. Note this may also be hit for deriv paths in origins.
+ */
+bool HasDeepDerivPath(const FuzzBufferType& buff, const int max_depth = MAX_DEPTH);
+
#endif // BITCOIN_TEST_FUZZ_UTIL_DESCRIPTOR_H
diff --git a/src/test/fuzz/util/net.cpp b/src/test/fuzz/util/net.cpp
index eb0f14ede0..99151bb84d 100644
--- a/src/test/fuzz/util/net.cpp
+++ b/src/test/fuzz/util/net.cpp
@@ -25,33 +25,63 @@
class CNode;
-CNetAddr ConsumeNetAddr(FuzzedDataProvider& fuzzed_data_provider) noexcept
+CNetAddr ConsumeNetAddr(FuzzedDataProvider& fuzzed_data_provider, FastRandomContext* rand) noexcept
{
- const Network network = fuzzed_data_provider.PickValueInArray({Network::NET_IPV4, Network::NET_IPV6, Network::NET_INTERNAL, Network::NET_ONION});
- CNetAddr net_addr;
- if (network == Network::NET_IPV4) {
- in_addr v4_addr = {};
- v4_addr.s_addr = fuzzed_data_provider.ConsumeIntegral<uint32_t>();
- net_addr = CNetAddr{v4_addr};
- } else if (network == Network::NET_IPV6) {
- if (fuzzed_data_provider.remaining_bytes() >= 16) {
- in6_addr v6_addr = {};
- auto addr_bytes = fuzzed_data_provider.ConsumeBytes<uint8_t>(16);
- if (addr_bytes[0] == CJDNS_PREFIX) { // Avoid generating IPv6 addresses that look like CJDNS.
- addr_bytes[0] = 0x55; // Just an arbitrary number, anything != CJDNS_PREFIX would do.
- }
- memcpy(v6_addr.s6_addr, addr_bytes.data(), 16);
- net_addr = CNetAddr{v6_addr, fuzzed_data_provider.ConsumeIntegral<uint32_t>()};
+ struct NetAux {
+ Network net;
+ CNetAddr::BIP155Network bip155;
+ size_t len;
+ };
+
+ static constexpr std::array<NetAux, 6> nets{
+ NetAux{.net = Network::NET_IPV4, .bip155 = CNetAddr::BIP155Network::IPV4, .len = ADDR_IPV4_SIZE},
+ NetAux{.net = Network::NET_IPV6, .bip155 = CNetAddr::BIP155Network::IPV6, .len = ADDR_IPV6_SIZE},
+ NetAux{.net = Network::NET_ONION, .bip155 = CNetAddr::BIP155Network::TORV3, .len = ADDR_TORV3_SIZE},
+ NetAux{.net = Network::NET_I2P, .bip155 = CNetAddr::BIP155Network::I2P, .len = ADDR_I2P_SIZE},
+ NetAux{.net = Network::NET_CJDNS, .bip155 = CNetAddr::BIP155Network::CJDNS, .len = ADDR_CJDNS_SIZE},
+ NetAux{.net = Network::NET_INTERNAL, .bip155 = CNetAddr::BIP155Network{0}, .len = 0},
+ };
+
+ const size_t nets_index{rand == nullptr
+ ? fuzzed_data_provider.ConsumeIntegralInRange<size_t>(0, nets.size() - 1)
+ : static_cast<size_t>(rand->randrange(nets.size()))};
+
+ const auto& aux = nets[nets_index];
+
+ CNetAddr addr;
+
+ if (aux.net == Network::NET_INTERNAL) {
+ if (rand == nullptr) {
+ addr.SetInternal(fuzzed_data_provider.ConsumeBytesAsString(32));
+ } else {
+ const auto v = rand->randbytes(32);
+ addr.SetInternal(std::string{v.begin(), v.end()});
}
- } else if (network == Network::NET_INTERNAL) {
- net_addr.SetInternal(fuzzed_data_provider.ConsumeBytesAsString(32));
- } else if (network == Network::NET_ONION) {
- auto pub_key{fuzzed_data_provider.ConsumeBytes<uint8_t>(ADDR_TORV3_SIZE)};
- pub_key.resize(ADDR_TORV3_SIZE);
- const bool ok{net_addr.SetSpecial(OnionToString(pub_key))};
- assert(ok);
+ return addr;
+ }
+
+ DataStream s;
+
+ s << static_cast<uint8_t>(aux.bip155);
+
+ std::vector<uint8_t> addr_bytes;
+ if (rand == nullptr) {
+ addr_bytes = fuzzed_data_provider.ConsumeBytes<uint8_t>(aux.len);
+ addr_bytes.resize(aux.len);
+ } else {
+ addr_bytes = rand->randbytes(aux.len);
}
- return net_addr;
+ if (aux.net == NET_IPV6 && addr_bytes[0] == CJDNS_PREFIX) { // Avoid generating IPv6 addresses that look like CJDNS.
+ addr_bytes[0] = 0x55; // Just an arbitrary number, anything != CJDNS_PREFIX would do.
+ }
+ if (aux.net == NET_CJDNS) { // Avoid generating CJDNS addresses that don't start with CJDNS_PREFIX because those are !IsValid().
+ addr_bytes[0] = CJDNS_PREFIX;
+ }
+ s << addr_bytes;
+
+ s >> CAddress::V2_NETWORK(addr);
+
+ return addr;
}
CAddress ConsumeAddress(FuzzedDataProvider& fuzzed_data_provider) noexcept
diff --git a/src/test/fuzz/util/net.h b/src/test/fuzz/util/net.h
index 47e4a2fac0..a6c9e23f2e 100644
--- a/src/test/fuzz/util/net.h
+++ b/src/test/fuzz/util/net.h
@@ -24,7 +24,15 @@
#include <optional>
#include <string>
-CNetAddr ConsumeNetAddr(FuzzedDataProvider& fuzzed_data_provider) noexcept;
+/**
+ * Create a CNetAddr. It may have `addr.IsValid() == false`.
+ * @param[in,out] fuzzed_data_provider Take data for the address from this, if `rand` is `nullptr`.
+ * @param[in,out] rand If not nullptr, take data from it instead of from `fuzzed_data_provider`.
+ * Prefer generating addresses using `fuzzed_data_provider` because it is not uniform. Only use
+ * `rand` if `fuzzed_data_provider` is exhausted or its data is needed for other things.
+ * @return a "random" network address.
+ */
+CNetAddr ConsumeNetAddr(FuzzedDataProvider& fuzzed_data_provider, FastRandomContext* rand = nullptr) noexcept;
class FuzzedSock : public Sock
{
diff --git a/src/test/ipc_test.capnp b/src/test/ipc_test.capnp
new file mode 100644
index 0000000000..55a3dc2683
--- /dev/null
+++ b/src/test/ipc_test.capnp
@@ -0,0 +1,18 @@
+# Copyright (c) 2023 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+@0xd71b0fc8727fdf83;
+
+using Cxx = import "/capnp/c++.capnp";
+$Cxx.namespace("gen");
+
+using Proxy = import "/mp/proxy.capnp";
+$Proxy.include("test/ipc_test.h");
+$Proxy.includeTypes("ipc/capnp/common-types.h");
+
+interface FooInterface $Proxy.wrap("FooImplementation") {
+ add @0 (a :Int32, b :Int32) -> (result :Int32);
+ passOutPoint @1 (arg :Data) -> (result :Data);
+ passUniValue @2 (arg :Text) -> (result :Text);
+}
diff --git a/src/test/ipc_test.cpp b/src/test/ipc_test.cpp
new file mode 100644
index 0000000000..ce4edaceb0
--- /dev/null
+++ b/src/test/ipc_test.cpp
@@ -0,0 +1,67 @@
+// Copyright (c) 2023 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <logging.h>
+#include <mp/proxy-types.h>
+#include <test/ipc_test.capnp.h>
+#include <test/ipc_test.capnp.proxy.h>
+#include <test/ipc_test.h>
+
+#include <future>
+#include <kj/common.h>
+#include <kj/memory.h>
+#include <kj/test.h>
+
+#include <boost/test/unit_test.hpp>
+
+//! Unit test that tests execution of IPC calls without actually creating a
+//! separate process. This test is primarily intended to verify behavior of type
+//! conversion code that converts C++ objects to Cap'n Proto messages and vice
+//! versa.
+//!
+//! The test creates a thread which creates a FooImplementation object (defined
+//! in ipc_test.h) and a two-way pipe accepting IPC requests which call methods
+//! on the object through FooInterface (defined in ipc_test.capnp).
+void IpcTest()
+{
+ // Setup: create FooImplemention object and listen for FooInterface requests
+ std::promise<std::unique_ptr<mp::ProxyClient<gen::FooInterface>>> foo_promise;
+ std::function<void()> disconnect_client;
+ std::thread thread([&]() {
+ mp::EventLoop loop("IpcTest", [](bool raise, const std::string& log) { LogPrintf("LOG%i: %s\n", raise, log); });
+ auto pipe = loop.m_io_context.provider->newTwoWayPipe();
+
+ auto connection_client = std::make_unique<mp::Connection>(loop, kj::mv(pipe.ends[0]));
+ auto foo_client = std::make_unique<mp::ProxyClient<gen::FooInterface>>(
+ connection_client->m_rpc_system.bootstrap(mp::ServerVatId().vat_id).castAs<gen::FooInterface>(),
+ connection_client.get(), /* destroy_connection= */ false);
+ foo_promise.set_value(std::move(foo_client));
+ disconnect_client = [&] { loop.sync([&] { connection_client.reset(); }); };
+
+ auto connection_server = std::make_unique<mp::Connection>(loop, kj::mv(pipe.ends[1]), [&](mp::Connection& connection) {
+ auto foo_server = kj::heap<mp::ProxyServer<gen::FooInterface>>(std::make_shared<FooImplementation>(), connection);
+ return capnp::Capability::Client(kj::mv(foo_server));
+ });
+ connection_server->onDisconnect([&] { connection_server.reset(); });
+ loop.loop();
+ });
+ std::unique_ptr<mp::ProxyClient<gen::FooInterface>> foo{foo_promise.get_future().get()};
+
+ // Test: make sure arguments were sent and return value is received
+ BOOST_CHECK_EQUAL(foo->add(1, 2), 3);
+
+ COutPoint txout1{Txid::FromUint256(uint256{100}), 200};
+ COutPoint txout2{foo->passOutPoint(txout1)};
+ BOOST_CHECK(txout1 == txout2);
+
+ UniValue uni1{UniValue::VOBJ};
+ uni1.pushKV("i", 1);
+ uni1.pushKV("s", "two");
+ UniValue uni2{foo->passUniValue(uni1)};
+ BOOST_CHECK_EQUAL(uni1.write(), uni2.write());
+
+ // Test cleanup: disconnect pipe and join thread
+ disconnect_client();
+ thread.join();
+}
diff --git a/src/test/ipc_test.h b/src/test/ipc_test.h
new file mode 100644
index 0000000000..bcfcc2125c
--- /dev/null
+++ b/src/test/ipc_test.h
@@ -0,0 +1,21 @@
+// Copyright (c) 2023 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_TEST_IPC_TEST_H
+#define BITCOIN_TEST_IPC_TEST_H
+
+#include <primitives/transaction.h>
+#include <univalue.h>
+
+class FooImplementation
+{
+public:
+ int add(int a, int b) { return a + b; }
+ COutPoint passOutPoint(COutPoint o) { return o; }
+ UniValue passUniValue(UniValue v) { return v; }
+};
+
+void IpcTest();
+
+#endif // BITCOIN_TEST_IPC_TEST_H
diff --git a/src/test/ipc_tests.cpp b/src/test/ipc_tests.cpp
new file mode 100644
index 0000000000..6e144b0f41
--- /dev/null
+++ b/src/test/ipc_tests.cpp
@@ -0,0 +1,13 @@
+// Copyright (c) 2023 The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#include <test/ipc_test.h>
+#include <boost/test/unit_test.hpp>
+
+BOOST_AUTO_TEST_SUITE(ipc_tests)
+BOOST_AUTO_TEST_CASE(ipc_tests)
+{
+ IpcTest();
+}
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/logging_tests.cpp b/src/test/logging_tests.cpp
index e448805e69..88e3ec94b7 100644
--- a/src/test/logging_tests.cpp
+++ b/src/test/logging_tests.cpp
@@ -84,27 +84,32 @@ BOOST_FIXTURE_TEST_CASE(logging_LogPrintf_, LogSetup)
{
LogInstance().m_log_sourcelocations = true;
LogPrintf_("fn1", "src1", 1, BCLog::LogFlags::NET, BCLog::Level::Debug, "foo1: %s\n", "bar1");
- LogPrintf_("fn2", "src2", 2, BCLog::LogFlags::NET, BCLog::Level::None, "foo2: %s\n", "bar2");
- LogPrintf_("fn3", "src3", 3, BCLog::LogFlags::NONE, BCLog::Level::Debug, "foo3: %s\n", "bar3");
- LogPrintf_("fn4", "src4", 4, BCLog::LogFlags::NONE, BCLog::Level::None, "foo4: %s\n", "bar4");
+ LogPrintf_("fn2", "src2", 2, BCLog::LogFlags::NET, BCLog::Level::Info, "foo2: %s\n", "bar2");
+ LogPrintf_("fn3", "src3", 3, BCLog::LogFlags::ALL, BCLog::Level::Debug, "foo3: %s\n", "bar3");
+ LogPrintf_("fn4", "src4", 4, BCLog::LogFlags::ALL, BCLog::Level::Info, "foo4: %s\n", "bar4");
+ LogPrintf_("fn5", "src5", 5, BCLog::LogFlags::NONE, BCLog::Level::Debug, "foo5: %s\n", "bar5");
+ LogPrintf_("fn6", "src6", 6, BCLog::LogFlags::NONE, BCLog::Level::Info, "foo6: %s\n", "bar6");
std::ifstream file{tmp_log_path};
std::vector<std::string> log_lines;
for (std::string log; std::getline(file, log);) {
log_lines.push_back(log);
}
std::vector<std::string> expected = {
- "[src1:1] [fn1] [net:debug] foo1: bar1",
- "[src2:2] [fn2] [net] foo2: bar2",
+ "[src1:1] [fn1] [net] foo1: bar1",
+ "[src2:2] [fn2] [net:info] foo2: bar2",
"[src3:3] [fn3] [debug] foo3: bar3",
"[src4:4] [fn4] foo4: bar4",
+ "[src5:5] [fn5] [debug] foo5: bar5",
+ "[src6:6] [fn6] foo6: bar6",
};
BOOST_CHECK_EQUAL_COLLECTIONS(log_lines.begin(), log_lines.end(), expected.begin(), expected.end());
}
-BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacros, LogSetup)
+BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacrosDeprecated, LogSetup)
{
LogPrintf("foo5: %s\n", "bar5");
LogPrint(BCLog::NET, "foo6: %s\n", "bar6");
+ LogPrintLevel(BCLog::NET, BCLog::Level::Trace, "foo4: %s\n", "bar4"); // not logged
LogPrintLevel(BCLog::NET, BCLog::Level::Debug, "foo7: %s\n", "bar7");
LogPrintLevel(BCLog::NET, BCLog::Level::Info, "foo8: %s\n", "bar8");
LogPrintLevel(BCLog::NET, BCLog::Level::Warning, "foo9: %s\n", "bar9");
@@ -118,11 +123,32 @@ BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacros, LogSetup)
std::vector<std::string> expected = {
"foo5: bar5",
"[net] foo6: bar6",
- "[net:debug] foo7: bar7",
+ "[net] foo7: bar7",
"[net:info] foo8: bar8",
"[net:warning] foo9: bar9",
"[net:error] foo10: bar10",
- "[validation] foo11: bar11",
+ "[validation:info] foo11: bar11",
+ };
+ BOOST_CHECK_EQUAL_COLLECTIONS(log_lines.begin(), log_lines.end(), expected.begin(), expected.end());
+}
+
+BOOST_FIXTURE_TEST_CASE(logging_LogPrintMacros, LogSetup)
+{
+ LogTrace(BCLog::NET, "foo6: %s\n", "bar6"); // not logged
+ LogDebug(BCLog::NET, "foo7: %s\n", "bar7");
+ LogInfo("foo8: %s\n", "bar8");
+ LogWarning("foo9: %s\n", "bar9");
+ LogError("foo10: %s\n", "bar10");
+ std::ifstream file{tmp_log_path};
+ std::vector<std::string> log_lines;
+ for (std::string log; std::getline(file, log);) {
+ log_lines.push_back(log);
+ }
+ std::vector<std::string> expected = {
+ "[net] foo7: bar7",
+ "foo8: bar8",
+ "[warning] foo9: bar9",
+ "[error] foo10: bar10",
};
BOOST_CHECK_EQUAL_COLLECTIONS(log_lines.begin(), log_lines.end(), expected.begin(), expected.end());
}
diff --git a/src/test/miner_tests.cpp b/src/test/miner_tests.cpp
index 342d2514ed..d50af4c175 100644
--- a/src/test/miner_tests.cpp
+++ b/src/test/miner_tests.cpp
@@ -12,7 +12,6 @@
#include <policy/policy.h>
#include <test/util/random.h>
#include <test/util/txmempool.h>
-#include <timedata.h>
#include <txmempool.h>
#include <uint256.h>
#include <util/strencodings.h>
diff --git a/src/test/peerman_tests.cpp b/src/test/peerman_tests.cpp
new file mode 100644
index 0000000000..28866695bc
--- /dev/null
+++ b/src/test/peerman_tests.cpp
@@ -0,0 +1,76 @@
+// Copyright (c) 2024-present The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or https://www.opensource.org/licenses/mit-license.php.
+
+#include <chainparams.h>
+#include <node/miner.h>
+#include <net_processing.h>
+#include <pow.h>
+#include <test/util/setup_common.h>
+#include <validation.h>
+
+#include <boost/test/unit_test.hpp>
+
+BOOST_FIXTURE_TEST_SUITE(peerman_tests, RegTestingSetup)
+
+/** Window, in blocks, for connecting to NODE_NETWORK_LIMITED peers */
+static constexpr int64_t NODE_NETWORK_LIMITED_ALLOW_CONN_BLOCKS = 144;
+
+static void mineBlock(const node::NodeContext& node, std::chrono::seconds block_time)
+{
+ auto curr_time = GetTime<std::chrono::seconds>();
+ SetMockTime(block_time); // update time so the block is created with it
+ CBlock block = node::BlockAssembler{node.chainman->ActiveChainstate(), nullptr}.CreateNewBlock(CScript() << OP_TRUE)->block;
+ while (!CheckProofOfWork(block.GetHash(), block.nBits, node.chainman->GetConsensus())) ++block.nNonce;
+ block.fChecked = true; // little speedup
+ SetMockTime(curr_time); // process block at current time
+ Assert(node.chainman->ProcessNewBlock(std::make_shared<const CBlock>(block), /*force_processing=*/true, /*min_pow_checked=*/true, nullptr));
+ node.validation_signals->SyncWithValidationInterfaceQueue(); // drain events queue
+}
+
+// Verifying when network-limited peer connections are desirable based on the node's proximity to the tip
+BOOST_AUTO_TEST_CASE(connections_desirable_service_flags)
+{
+ std::unique_ptr<PeerManager> peerman = PeerManager::make(*m_node.connman, *m_node.addrman, nullptr, *m_node.chainman, *m_node.mempool, {});
+ auto consensus = m_node.chainman->GetParams().GetConsensus();
+
+ // Check we start connecting to full nodes
+ ServiceFlags peer_flags{NODE_WITNESS | NODE_NETWORK_LIMITED};
+ BOOST_CHECK(peerman->GetDesirableServiceFlags(peer_flags) == ServiceFlags(NODE_NETWORK | NODE_WITNESS));
+
+ // Make peerman aware of the initial best block and verify we accept limited peers when we start close to the tip time.
+ auto tip = WITH_LOCK(::cs_main, return m_node.chainman->ActiveChain().Tip());
+ uint64_t tip_block_time = tip->GetBlockTime();
+ int tip_block_height = tip->nHeight;
+ peerman->SetBestBlock(tip_block_height, std::chrono::seconds{tip_block_time});
+
+ SetMockTime(tip_block_time + 1); // Set node time to tip time
+ BOOST_CHECK(peerman->GetDesirableServiceFlags(peer_flags) == ServiceFlags(NODE_NETWORK_LIMITED | NODE_WITNESS));
+
+ // Check we don't disallow limited peers connections when we are behind but still recoverable (below the connection safety window)
+ SetMockTime(GetTime<std::chrono::seconds>() + std::chrono::seconds{consensus.nPowTargetSpacing * (NODE_NETWORK_LIMITED_ALLOW_CONN_BLOCKS - 1)});
+ BOOST_CHECK(peerman->GetDesirableServiceFlags(peer_flags) == ServiceFlags(NODE_NETWORK_LIMITED | NODE_WITNESS));
+
+ // Check we disallow limited peers connections when we are further than the limited peers safety window
+ SetMockTime(GetTime<std::chrono::seconds>() + std::chrono::seconds{consensus.nPowTargetSpacing * 2});
+ BOOST_CHECK(peerman->GetDesirableServiceFlags(peer_flags) == ServiceFlags(NODE_NETWORK | NODE_WITNESS));
+
+ // By now, we tested that the connections desirable services flags change based on the node's time proximity to the tip.
+ // Now, perform the same tests for when the node receives a block.
+ m_node.validation_signals->RegisterValidationInterface(peerman.get());
+
+ // First, verify a block in the past doesn't enable limited peers connections
+ // At this point, our time is (NODE_NETWORK_LIMITED_ALLOW_CONN_BLOCKS + 1) * 10 minutes ahead the tip's time.
+ mineBlock(m_node, /*block_time=*/std::chrono::seconds{tip_block_time + 1});
+ BOOST_CHECK(peerman->GetDesirableServiceFlags(peer_flags) == ServiceFlags(NODE_NETWORK | NODE_WITNESS));
+
+ // Verify a block close to the tip enables limited peers connections
+ mineBlock(m_node, /*block_time=*/GetTime<std::chrono::seconds>());
+ BOOST_CHECK(peerman->GetDesirableServiceFlags(peer_flags) == ServiceFlags(NODE_NETWORK_LIMITED | NODE_WITNESS));
+
+ // Lastly, verify the stale tip checks can disallow limited peers connections after not receiving blocks for a prolonged period.
+ SetMockTime(GetTime<std::chrono::seconds>() + std::chrono::seconds{consensus.nPowTargetSpacing * NODE_NETWORK_LIMITED_ALLOW_CONN_BLOCKS + 1});
+ BOOST_CHECK(peerman->GetDesirableServiceFlags(peer_flags) == ServiceFlags(NODE_NETWORK | NODE_WITNESS));
+}
+
+BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/policyestimator_tests.cpp b/src/test/policyestimator_tests.cpp
index 13ec89663a..6cadc3290a 100644
--- a/src/test/policyestimator_tests.cpp
+++ b/src/test/policyestimator_tests.cpp
@@ -20,7 +20,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
{
CBlockPolicyEstimator& feeEst = *Assert(m_node.fee_estimator);
CTxMemPool& mpool = *Assert(m_node.mempool);
- RegisterValidationInterface(&feeEst);
+ m_node.validation_signals->RegisterValidationInterface(&feeEst);
TestMemPoolEntryHelper entry;
CAmount basefee(2000);
CAmount deltaFee(100);
@@ -70,11 +70,11 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
feeV[j],
virtual_size,
entry.nHeight,
- /* m_from_disconnected_block */ false,
- /* m_submitted_in_package */ false,
- /* m_chainstate_is_current */ true,
- /* m_has_no_mempool_parents */ true)};
- GetMainSignals().TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
+ /*mempool_limit_bypassed=*/false,
+ /*submitted_in_package=*/false,
+ /*chainstate_is_current=*/true,
+ /*has_no_mempool_parents=*/true)};
+ m_node.validation_signals->TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
}
uint256 hash = tx.GetHash();
txHashes[j].push_back(hash);
@@ -102,7 +102,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
// Check after just a few txs that combining buckets works as expected
if (blocknum == 3) {
// Wait for fee estimator to catch up
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
// At this point we should need to combine 3 buckets to get enough data points
// So estimateFee(1) should fail and estimateFee(2) should return somewhere around
// 9*baserate. estimateFee(2) %'s are 100,100,90 = average 97%
@@ -112,6 +112,9 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
}
}
+ // Wait for fee estimator to catch up
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
+
std::vector<CAmount> origFeeEst;
// Highest feerate is 10*baseRate and gets in all blocks,
// second highest feerate is 9*baseRate and gets in 9/10 blocks = 90%,
@@ -143,7 +146,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
}
// Wait for fee estimator to catch up
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
BOOST_CHECK(feeEst.estimateFee(1) == CFeeRate(0));
for (int i = 2; i < 10;i++) {
@@ -168,11 +171,11 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
feeV[j],
virtual_size,
entry.nHeight,
- /* m_from_disconnected_block */ false,
- /* m_submitted_in_package */ false,
- /* m_chainstate_is_current */ true,
- /* m_has_no_mempool_parents */ true)};
- GetMainSignals().TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
+ /*mempool_limit_bypassed=*/false,
+ /*submitted_in_package=*/false,
+ /*chainstate_is_current=*/true,
+ /*has_no_mempool_parents=*/true)};
+ m_node.validation_signals->TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
}
uint256 hash = tx.GetHash();
txHashes[j].push_back(hash);
@@ -185,7 +188,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
}
// Wait for fee estimator to catch up
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
for (int i = 1; i < 10;i++) {
BOOST_CHECK(feeEst.estimateFee(i) == CFeeRate(0) || feeEst.estimateFee(i).GetFeePerK() > origFeeEst[i-1] - deltaFee);
@@ -209,7 +212,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
block.clear();
// Wait for fee estimator to catch up
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
BOOST_CHECK(feeEst.estimateFee(1) == CFeeRate(0));
for (int i = 2; i < 10;i++) {
@@ -232,11 +235,11 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
feeV[j],
virtual_size,
entry.nHeight,
- /* m_from_disconnected_block */ false,
- /* m_submitted_in_package */ false,
- /* m_chainstate_is_current */ true,
- /* m_has_no_mempool_parents */ true)};
- GetMainSignals().TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
+ /*mempool_limit_bypassed=*/false,
+ /*submitted_in_package=*/false,
+ /*chainstate_is_current=*/true,
+ /*has_no_mempool_parents=*/true)};
+ m_node.validation_signals->TransactionAddedToMempool(tx_info, mpool.GetAndIncrementSequence());
}
uint256 hash = tx.GetHash();
CTransactionRef ptx = mpool.get(hash);
@@ -254,7 +257,7 @@ BOOST_AUTO_TEST_CASE(BlockPolicyEstimates)
block.clear();
}
// Wait for fee estimator to catch up
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
BOOST_CHECK(feeEst.estimateFee(1) == CFeeRate(0));
for (int i = 2; i < 9; i++) { // At 9, the original estimate was already at the bottom (b/c scale = 2)
BOOST_CHECK(feeEst.estimateFee(i).GetFeePerK() < origFeeEst[i-1] - deltaFee);
diff --git a/src/test/rbf_tests.cpp b/src/test/rbf_tests.cpp
index fb6a3614c0..e6c135eed9 100644
--- a/src/test/rbf_tests.cpp
+++ b/src/test/rbf_tests.cpp
@@ -135,8 +135,6 @@ BOOST_FIXTURE_TEST_CASE(rbf_helper_functions, TestChain100Setup)
// Tests for EntriesAndTxidsDisjoint
BOOST_CHECK(EntriesAndTxidsDisjoint(empty_set, {tx1->GetHash()}, unused_txid) == std::nullopt);
BOOST_CHECK(EntriesAndTxidsDisjoint(set_12_normal, {tx3->GetHash()}, unused_txid) == std::nullopt);
- // EntriesAndTxidsDisjoint uses txids, not wtxids.
- BOOST_CHECK(EntriesAndTxidsDisjoint({entry2}, {tx2->GetWitnessHash()}, unused_txid) == std::nullopt);
BOOST_CHECK(EntriesAndTxidsDisjoint({entry2}, {tx2->GetHash()}, unused_txid).has_value());
BOOST_CHECK(EntriesAndTxidsDisjoint(set_12_normal, {tx1->GetHash()}, unused_txid).has_value());
BOOST_CHECK(EntriesAndTxidsDisjoint(set_12_normal, {tx2->GetHash()}, unused_txid).has_value());
diff --git a/src/test/scheduler_tests.cpp b/src/test/scheduler_tests.cpp
index 3fb3378598..95e725de46 100644
--- a/src/test/scheduler_tests.cpp
+++ b/src/test/scheduler_tests.cpp
@@ -129,8 +129,8 @@ BOOST_AUTO_TEST_CASE(singlethreadedscheduler_ordered)
CScheduler scheduler;
// each queue should be well ordered with respect to itself but not other queues
- SingleThreadedSchedulerClient queue1(scheduler);
- SingleThreadedSchedulerClient queue2(scheduler);
+ SerialTaskRunner queue1(scheduler);
+ SerialTaskRunner queue2(scheduler);
// create more threads than queues
// if the queues only permit execution of one task at once then
@@ -142,7 +142,7 @@ BOOST_AUTO_TEST_CASE(singlethreadedscheduler_ordered)
threads.emplace_back([&] { scheduler.serviceQueue(); });
}
- // these are not atomic, if SinglethreadedSchedulerClient prevents
+ // these are not atomic, if SerialTaskRunner prevents
// parallel execution at the queue level no synchronization should be required here
int counter1 = 0;
int counter2 = 0;
@@ -150,12 +150,12 @@ BOOST_AUTO_TEST_CASE(singlethreadedscheduler_ordered)
// just simply count up on each queue - if execution is properly ordered then
// the callbacks should run in exactly the order in which they were enqueued
for (int i = 0; i < 100; ++i) {
- queue1.AddToProcessQueue([i, &counter1]() {
+ queue1.insert([i, &counter1]() {
bool expectation = i == counter1++;
assert(expectation);
});
- queue2.AddToProcessQueue([i, &counter2]() {
+ queue2.insert([i, &counter2]() {
bool expectation = i == counter2++;
assert(expectation);
});
diff --git a/src/test/script_standard_tests.cpp b/src/test/script_standard_tests.cpp
index 58bdb37b7c..29e2d4a569 100644
--- a/src/test/script_standard_tests.cpp
+++ b/src/test/script_standard_tests.cpp
@@ -136,10 +136,8 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_success)
BOOST_AUTO_TEST_CASE(script_standard_Solver_failure)
{
- CKey key;
- CPubKey pubkey;
- key.MakeNewKey(true);
- pubkey = key.GetPubKey();
+ CKey key = GenerateRandomKey();
+ CPubKey pubkey = key.GetPubKey();
CScript s;
std::vector<std::vector<unsigned char> > solutions;
@@ -192,10 +190,8 @@ BOOST_AUTO_TEST_CASE(script_standard_Solver_failure)
BOOST_AUTO_TEST_CASE(script_standard_ExtractDestination)
{
- CKey key;
- CPubKey pubkey;
- key.MakeNewKey(true);
- pubkey = key.GetPubKey();
+ CKey key = GenerateRandomKey();
+ CPubKey pubkey = key.GetPubKey();
CScript s;
CTxDestination address;
diff --git a/src/test/script_tests.cpp b/src/test/script_tests.cpp
index e988ce2194..ac457d9c77 100644
--- a/src/test/script_tests.cpp
+++ b/src/test/script_tests.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <test/data/script_tests.json.h>
#include <test/data/bip341_wallet_vectors.json.h>
@@ -1051,10 +1055,9 @@ sign_multisig(const CScript& scriptPubKey, const CKey& key, const CTransaction&
BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12)
{
ScriptError err;
- CKey key1, key2, key3;
- key1.MakeNewKey(true);
- key2.MakeNewKey(false);
- key3.MakeNewKey(true);
+ CKey key1 = GenerateRandomKey();
+ CKey key2 = GenerateRandomKey(/*compressed=*/false);
+ CKey key3 = GenerateRandomKey();
CScript scriptPubKey12;
scriptPubKey12 << OP_1 << ToByteVector(key1.GetPubKey()) << ToByteVector(key2.GetPubKey()) << OP_2 << OP_CHECKMULTISIG;
@@ -1081,11 +1084,10 @@ BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG12)
BOOST_AUTO_TEST_CASE(script_CHECKMULTISIG23)
{
ScriptError err;
- CKey key1, key2, key3, key4;
- key1.MakeNewKey(true);
- key2.MakeNewKey(false);
- key3.MakeNewKey(true);
- key4.MakeNewKey(false);
+ CKey key1 = GenerateRandomKey();
+ CKey key2 = GenerateRandomKey(/*compressed=*/false);
+ CKey key3 = GenerateRandomKey();
+ CKey key4 = GenerateRandomKey(/*compressed=*/false);
CScript scriptPubKey23;
scriptPubKey23 << OP_2 << ToByteVector(key1.GetPubKey()) << ToByteVector(key2.GetPubKey()) << ToByteVector(key3.GetPubKey()) << OP_3 << OP_CHECKMULTISIG;
@@ -1165,8 +1167,7 @@ BOOST_AUTO_TEST_CASE(script_combineSigs)
std::vector<CPubKey> pubkeys;
for (int i = 0; i < 3; i++)
{
- CKey key;
- key.MakeNewKey(i%2 == 1);
+ CKey key = GenerateRandomKey(/*compressed=*/i%2 == 1);
keys.push_back(key);
pubkeys.push_back(key.GetPubKey());
BOOST_CHECK(keystore.AddKey(key));
diff --git a/src/test/settings_tests.cpp b/src/test/settings_tests.cpp
index fa8ceb8dd6..41190b3579 100644
--- a/src/test/settings_tests.cpp
+++ b/src/test/settings_tests.cpp
@@ -99,7 +99,9 @@ BOOST_AUTO_TEST_CASE(ReadWrite)
// Check invalid json not allowed
WriteText(path, R"(invalid json)");
BOOST_CHECK(!common::ReadSettings(path, values, errors));
- std::vector<std::string> fail_parse = {strprintf("Unable to parse settings file %s", fs::PathToString(path))};
+ std::vector<std::string> fail_parse = {strprintf("Settings file %s does not contain valid JSON. This is probably caused by disk corruption or a crash, "
+ "and can be fixed by removing the file, which will reset settings to default values.",
+ fs::PathToString(path))};
BOOST_CHECK_EQUAL_COLLECTIONS(errors.begin(), errors.end(), fail_parse.begin(), fail_parse.end());
}
diff --git a/src/test/sigopcount_tests.cpp b/src/test/sigopcount_tests.cpp
index c0bed50e1d..2081acdf4d 100644
--- a/src/test/sigopcount_tests.cpp
+++ b/src/test/sigopcount_tests.cpp
@@ -50,8 +50,7 @@ BOOST_AUTO_TEST_CASE(GetSigOpCount)
std::vector<CPubKey> keys;
for (int i = 0; i < 3; i++)
{
- CKey k;
- k.MakeNewKey(true);
+ CKey k = GenerateRandomKey();
keys.push_back(k.GetPubKey());
}
CScript s2 = GetScriptForMultisig(1, keys);
@@ -120,8 +119,7 @@ BOOST_AUTO_TEST_CASE(GetTxSigOpCost)
CCoinsView coinsDummy;
CCoinsViewCache coins(&coinsDummy);
// Create key
- CKey key;
- key.MakeNewKey(true);
+ CKey key = GenerateRandomKey();
CPubKey pubkey = key.GetPubKey();
// Default flags
const uint32_t flags{SCRIPT_VERIFY_WITNESS | SCRIPT_VERIFY_P2SH};
diff --git a/src/test/span_tests.cpp b/src/test/span_tests.cpp
index f6cac10b09..aae61990f7 100644
--- a/src/test/span_tests.cpp
+++ b/src/test/span_tests.cpp
@@ -53,7 +53,7 @@ BOOST_AUTO_TEST_SUITE(span_tests)
// aren't compatible with Spans at compile time.
//
// Previously there was a bug where writing a SFINAE check for vector<bool> was
-// not possible, because in libstdc++ vector<bool> has a data() memeber
+// not possible, because in libstdc++ vector<bool> has a data() member
// returning void*, and the Span template guide ignored the data() return value,
// so the template substitution would succeed, but the constructor would fail,
// resulting in a fatal compile error, rather than a SFINAE error that could be
diff --git a/src/test/streams_tests.cpp b/src/test/streams_tests.cpp
index 7d1ac5a19a..0903f987f6 100644
--- a/src/test/streams_tests.cpp
+++ b/src/test/streams_tests.cpp
@@ -29,7 +29,14 @@ BOOST_AUTO_TEST_CASE(xor_file)
BOOST_CHECK_EXCEPTION(xor_file.ignore(1), std::ios_base::failure, HasReason{"AutoFile::ignore: file handle is nullpt"});
}
{
- AutoFile xor_file{raw_file("wbx"), xor_pat};
+#ifdef __MINGW64__
+ // Our usage of mingw-w64 and the msvcrt runtime does not support
+ // the x modifier for the _wfopen().
+ const char* mode = "wb";
+#else
+ const char* mode = "wbx";
+#endif
+ AutoFile xor_file{raw_file(mode), xor_pat};
xor_file << test1 << test2;
}
{
diff --git a/src/test/system_tests.cpp b/src/test/system_tests.cpp
index 6a96b60db0..90fce9adf9 100644
--- a/src/test/system_tests.cpp
+++ b/src/test/system_tests.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
//
+
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
#include <test/util/setup_common.h>
#include <common/run_command.h>
#include <univalue.h>
@@ -25,23 +29,12 @@ BOOST_AUTO_TEST_CASE(dummy)
BOOST_AUTO_TEST_CASE(run_command)
{
-#ifdef WIN32
- // https://www.winehq.org/pipermail/wine-devel/2008-September/069387.html
- auto hntdll = GetModuleHandleA("ntdll.dll");
- assert(hntdll);
- const bool wine_runtime = GetProcAddress(hntdll, "wine_get_version");
-#endif
-
{
const UniValue result = RunCommandParseJSON("");
BOOST_CHECK(result.isNull());
}
{
-#ifdef WIN32
- const UniValue result = RunCommandParseJSON("cmd.exe /c echo {\"success\": true}");
-#else
const UniValue result = RunCommandParseJSON("echo \"{\"success\": true}\"");
-#endif
BOOST_CHECK(result.isObject());
const UniValue& success = result.find_value("success");
BOOST_CHECK(!success.isNull());
@@ -49,11 +42,7 @@ BOOST_AUTO_TEST_CASE(run_command)
}
{
// An invalid command is handled by Boost
-#ifdef WIN32
- const int expected_error{wine_runtime ? 6 : 2};
-#else
const int expected_error{2};
-#endif
BOOST_CHECK_EXCEPTION(RunCommandParseJSON("invalid_command"), boost::process::process_error, [&](const boost::process::process_error& e) {
BOOST_CHECK(std::string(e.what()).find("RunCommandParseJSON error:") == std::string::npos);
BOOST_CHECK_EQUAL(e.code().value(), expected_error);
@@ -62,11 +51,7 @@ BOOST_AUTO_TEST_CASE(run_command)
}
{
// Return non-zero exit code, no output to stderr
-#ifdef WIN32
- const std::string command{"cmd.exe /c exit 1"};
-#else
const std::string command{"false"};
-#endif
BOOST_CHECK_EXCEPTION(RunCommandParseJSON(command), std::runtime_error, [&](const std::runtime_error& e) {
const std::string what{e.what()};
BOOST_CHECK(what.find(strprintf("RunCommandParseJSON error: process(%s) returned 1: \n", command)) != std::string::npos);
@@ -75,13 +60,8 @@ BOOST_AUTO_TEST_CASE(run_command)
}
{
// Return non-zero exit code, with error message for stderr
-#ifdef WIN32
- const std::string command{"cmd.exe /c dir nosuchfile"};
- const std::string expected{wine_runtime ? "File not found." : "File Not Found"};
-#else
const std::string command{"ls nosuchfile"};
const std::string expected{"No such file or directory"};
-#endif
BOOST_CHECK_EXCEPTION(RunCommandParseJSON(command), std::runtime_error, [&](const std::runtime_error& e) {
const std::string what(e.what());
BOOST_CHECK(what.find(strprintf("RunCommandParseJSON error: process(%s) returned", command)) != std::string::npos);
@@ -91,15 +71,10 @@ BOOST_AUTO_TEST_CASE(run_command)
}
{
// Unable to parse JSON
-#ifdef WIN32
- const std::string command{"cmd.exe /c echo {"};
-#else
const std::string command{"echo {"};
-#endif
BOOST_CHECK_EXCEPTION(RunCommandParseJSON(command), std::runtime_error, HasReason("Unable to parse JSON: {"));
}
- // Test std::in, except for Windows
-#ifndef WIN32
+ // Test std::in
{
const UniValue result = RunCommandParseJSON("cat", "{\"success\": true}");
BOOST_CHECK(result.isObject());
@@ -107,7 +82,6 @@ BOOST_AUTO_TEST_CASE(run_command)
BOOST_CHECK(!success.isNull());
BOOST_CHECK_EQUAL(success.get_bool(), true);
}
-#endif
}
#endif // ENABLE_EXTERNAL_SIGNER
diff --git a/src/test/transaction_tests.cpp b/src/test/transaction_tests.cpp
index 5329c6ac99..e6cf64611e 100644
--- a/src/test/transaction_tests.cpp
+++ b/src/test/transaction_tests.cpp
@@ -487,8 +487,7 @@ BOOST_AUTO_TEST_CASE(test_big_witness_transaction)
CMutableTransaction mtx;
mtx.nVersion = 1;
- CKey key;
- key.MakeNewKey(true); // Need to use compressed keys in segwit or the signing will fail
+ CKey key = GenerateRandomKey(); // Need to use compressed keys in segwit or the signing will fail
FillableSigningProvider keystore;
BOOST_CHECK(keystore.AddKeyPubKey(key, key.GetPubKey()));
CKeyID hash = key.GetPubKey().GetID();
@@ -564,18 +563,16 @@ SignatureData CombineSignatures(const CMutableTransaction& input1, const CMutabl
BOOST_AUTO_TEST_CASE(test_witness)
{
FillableSigningProvider keystore, keystore2;
- CKey key1, key2, key3, key1L, key2L;
- CPubKey pubkey1, pubkey2, pubkey3, pubkey1L, pubkey2L;
- key1.MakeNewKey(true);
- key2.MakeNewKey(true);
- key3.MakeNewKey(true);
- key1L.MakeNewKey(false);
- key2L.MakeNewKey(false);
- pubkey1 = key1.GetPubKey();
- pubkey2 = key2.GetPubKey();
- pubkey3 = key3.GetPubKey();
- pubkey1L = key1L.GetPubKey();
- pubkey2L = key2L.GetPubKey();
+ CKey key1 = GenerateRandomKey();
+ CKey key2 = GenerateRandomKey();
+ CKey key3 = GenerateRandomKey();
+ CKey key1L = GenerateRandomKey(/*compressed=*/false);
+ CKey key2L = GenerateRandomKey(/*compressed=*/false);
+ CPubKey pubkey1 = key1.GetPubKey();
+ CPubKey pubkey2 = key2.GetPubKey();
+ CPubKey pubkey3 = key3.GetPubKey();
+ CPubKey pubkey1L = key1L.GetPubKey();
+ CPubKey pubkey2L = key2L.GetPubKey();
BOOST_CHECK(keystore.AddKeyPubKey(key1, pubkey1));
BOOST_CHECK(keystore.AddKeyPubKey(key2, pubkey2));
BOOST_CHECK(keystore.AddKeyPubKey(key1L, pubkey1L));
@@ -756,8 +753,7 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
t.vin[0].scriptSig << std::vector<unsigned char>(65, 0);
t.vout.resize(1);
t.vout[0].nValue = 90*CENT;
- CKey key;
- key.MakeNewKey(true);
+ CKey key = GenerateRandomKey();
t.vout[0].scriptPubKey = GetScriptForDestination(PKHash(key.GetPubKey()));
constexpr auto CheckIsStandard = [](const auto& t) {
@@ -790,7 +786,7 @@ BOOST_AUTO_TEST_CASE(test_IsStandard)
t.nVersion = 0;
CheckIsNotStandard(t, "version");
- t.nVersion = 3;
+ t.nVersion = TX_MAX_STANDARD_VERSION + 1;
CheckIsNotStandard(t, "version");
// Allowed nVersion
diff --git a/src/test/txindex_tests.cpp b/src/test/txindex_tests.cpp
index e2432a4718..5a32b02ad9 100644
--- a/src/test/txindex_tests.cpp
+++ b/src/test/txindex_tests.cpp
@@ -71,7 +71,7 @@ BOOST_FIXTURE_TEST_CASE(txindex_initial_sync, TestChain100Setup)
// SyncWithValidationInterfaceQueue() call below is also needed to ensure
// TSAN always sees the test thread waiting for the notification thread, and
// avoid potential false positive reports.
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
// shutdown sequence (c.f. Shutdown() in init.cpp)
txindex.Stop();
diff --git a/src/test/txpackage_tests.cpp b/src/test/txpackage_tests.cpp
index 637f92bd0f..f6456526bb 100644
--- a/src/test/txpackage_tests.cpp
+++ b/src/test/txpackage_tests.cpp
@@ -116,8 +116,7 @@ BOOST_FIXTURE_TEST_CASE(package_validation_tests, TestChain100Setup)
unsigned int initialPoolSize = m_node.mempool->size();
// Parent and Child Package
- CKey parent_key;
- parent_key.MakeNewKey(true);
+ CKey parent_key = GenerateRandomKey();
CScript parent_locking_script = GetScriptForDestination(PKHash(parent_key.GetPubKey()));
auto mtx_parent = CreateValidMempoolTransaction(/*input_transaction=*/m_coinbase_txns[0], /*input_vout=*/0,
/*input_height=*/0, /*input_signing_key=*/coinbaseKey,
@@ -125,8 +124,7 @@ BOOST_FIXTURE_TEST_CASE(package_validation_tests, TestChain100Setup)
/*output_amount=*/CAmount(49 * COIN), /*submit=*/false);
CTransactionRef tx_parent = MakeTransactionRef(mtx_parent);
- CKey child_key;
- child_key.MakeNewKey(true);
+ CKey child_key = GenerateRandomKey();
CScript child_locking_script = GetScriptForDestination(PKHash(child_key.GetPubKey()));
auto mtx_child = CreateValidMempoolTransaction(/*input_transaction=*/tx_parent, /*input_vout=*/0,
/*input_height=*/101, /*input_signing_key=*/parent_key,
@@ -170,11 +168,9 @@ BOOST_FIXTURE_TEST_CASE(package_validation_tests, TestChain100Setup)
BOOST_FIXTURE_TEST_CASE(noncontextual_package_tests, TestChain100Setup)
{
// The signatures won't be verified so we can just use a placeholder
- CKey placeholder_key;
- placeholder_key.MakeNewKey(true);
+ CKey placeholder_key = GenerateRandomKey();
CScript spk = GetScriptForDestination(PKHash(placeholder_key.GetPubKey()));
- CKey placeholder_key_2;
- placeholder_key_2.MakeNewKey(true);
+ CKey placeholder_key_2 = GenerateRandomKey();
CScript spk2 = GetScriptForDestination(PKHash(placeholder_key_2.GetPubKey()));
// Parent and Child Package
@@ -266,8 +262,7 @@ BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
{
LOCK(cs_main);
unsigned int expected_pool_size = m_node.mempool->size();
- CKey parent_key;
- parent_key.MakeNewKey(true);
+ CKey parent_key = GenerateRandomKey();
CScript parent_locking_script = GetScriptForDestination(PKHash(parent_key.GetPubKey()));
// Unrelated transactions are not allowed in package submission.
@@ -298,8 +293,7 @@ BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
package_parent_child.push_back(tx_parent);
package_3gen.push_back(tx_parent);
- CKey child_key;
- child_key.MakeNewKey(true);
+ CKey child_key = GenerateRandomKey();
CScript child_locking_script = GetScriptForDestination(PKHash(child_key.GetPubKey()));
auto mtx_child = CreateValidMempoolTransaction(/*input_transaction=*/tx_parent, /*input_vout=*/0,
/*input_height=*/101, /*input_signing_key=*/parent_key,
@@ -309,8 +303,7 @@ BOOST_FIXTURE_TEST_CASE(package_submission_tests, TestChain100Setup)
package_parent_child.push_back(tx_child);
package_3gen.push_back(tx_child);
- CKey grandchild_key;
- grandchild_key.MakeNewKey(true);
+ CKey grandchild_key = GenerateRandomKey();
CScript grandchild_locking_script = GetScriptForDestination(PKHash(grandchild_key.GetPubKey()));
auto mtx_grandchild = CreateValidMempoolTransaction(/*input_transaction=*/tx_child, /*input_vout=*/0,
/*input_height=*/101, /*input_signing_key=*/child_key,
@@ -434,8 +427,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
witness2.stack.emplace_back(2);
witness2.stack.emplace_back(witnessScript.begin(), witnessScript.end());
- CKey child_key;
- child_key.MakeNewKey(true);
+ CKey child_key = GenerateRandomKey();
CScript child_locking_script = GetScriptForDestination(WitnessV0KeyHash(child_key.GetPubKey()));
CMutableTransaction mtx_child1;
mtx_child1.nVersion = 1;
@@ -504,8 +496,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
// This tests a potential censorship vector in which an attacker broadcasts a competing package
// where a parent's witness is mutated. The honest package should be accepted despite the fact
// that we don't allow witness replacement.
- CKey grandchild_key;
- grandchild_key.MakeNewKey(true);
+ CKey grandchild_key = GenerateRandomKey();
CScript grandchild_locking_script = GetScriptForDestination(WitnessV0KeyHash(grandchild_key.GetPubKey()));
auto mtx_grandchild = CreateValidMempoolTransaction(/*input_transaction=*/ptx_child2, /*input_vout=*/0,
/*input_height=*/0, /*input_signing_key=*/child_key,
@@ -595,8 +586,7 @@ BOOST_FIXTURE_TEST_CASE(package_witness_swap_tests, TestChain100Setup)
BOOST_CHECK(m_node.mempool->m_min_relay_feerate.GetFee(GetVirtualTransactionSize(*ptx_parent3)) <= low_fee_amt);
// child spends parent1, parent2, and parent3
- CKey mixed_grandchild_key;
- mixed_grandchild_key.MakeNewKey(true);
+ CKey mixed_grandchild_key = GenerateRandomKey();
CScript mixed_child_spk = GetScriptForDestination(WitnessV0KeyHash(mixed_grandchild_key.GetPubKey()));
CMutableTransaction mtx_mixed_child;
@@ -648,11 +638,9 @@ BOOST_FIXTURE_TEST_CASE(package_cpfp_tests, TestChain100Setup)
MockMempoolMinFee(CFeeRate(5000));
LOCK(::cs_main);
size_t expected_pool_size = m_node.mempool->size();
- CKey child_key;
- child_key.MakeNewKey(true);
+ CKey child_key = GenerateRandomKey();
CScript parent_spk = GetScriptForDestination(WitnessV0KeyHash(child_key.GetPubKey()));
- CKey grandchild_key;
- grandchild_key.MakeNewKey(true);
+ CKey grandchild_key = GenerateRandomKey();
CScript child_spk = GetScriptForDestination(WitnessV0KeyHash(grandchild_key.GetPubKey()));
// low-fee parent and high-fee child package
diff --git a/src/test/txvalidation_tests.cpp b/src/test/txvalidation_tests.cpp
index ecf0889711..e045949b43 100644
--- a/src/test/txvalidation_tests.cpp
+++ b/src/test/txvalidation_tests.cpp
@@ -4,11 +4,14 @@
#include <consensus/validation.h>
#include <key_io.h>
+#include <policy/v3_policy.h>
#include <policy/packages.h>
#include <policy/policy.h>
#include <primitives/transaction.h>
+#include <random.h>
#include <script/script.h>
#include <test/util/setup_common.h>
+#include <test/util/txmempool.h>
#include <validation.h>
#include <boost/test/unit_test.hpp>
@@ -48,4 +51,294 @@ BOOST_FIXTURE_TEST_CASE(tx_mempool_reject_coinbase, TestChain100Setup)
BOOST_CHECK_EQUAL(result.m_state.GetRejectReason(), "coinbase");
BOOST_CHECK(result.m_state.GetResult() == TxValidationResult::TX_CONSENSUS);
}
+
+// Generate a number of random, nonexistent outpoints.
+static inline std::vector<COutPoint> random_outpoints(size_t num_outpoints) {
+ std::vector<COutPoint> outpoints;
+ for (size_t i{0}; i < num_outpoints; ++i) {
+ outpoints.emplace_back(Txid::FromUint256(GetRandHash()), 0);
+ }
+ return outpoints;
+}
+
+static inline std::vector<CPubKey> random_keys(size_t num_keys) {
+ std::vector<CPubKey> keys;
+ keys.reserve(num_keys);
+ for (size_t i{0}; i < num_keys; ++i) {
+ CKey key;
+ key.MakeNewKey(true);
+ keys.emplace_back(key.GetPubKey());
+ }
+ return keys;
+}
+
+// Creates a placeholder tx (not valid) with 25 outputs. Specify the nVersion and the inputs.
+static inline CTransactionRef make_tx(const std::vector<COutPoint>& inputs, int32_t version)
+{
+ CMutableTransaction mtx = CMutableTransaction{};
+ mtx.nVersion = version;
+ mtx.vin.resize(inputs.size());
+ mtx.vout.resize(25);
+ for (size_t i{0}; i < inputs.size(); ++i) {
+ mtx.vin[i].prevout = inputs[i];
+ }
+ for (auto i{0}; i < 25; ++i) {
+ mtx.vout[i].scriptPubKey = CScript() << OP_TRUE;
+ mtx.vout[i].nValue = 10000;
+ }
+ return MakeTransactionRef(mtx);
+}
+
+BOOST_FIXTURE_TEST_CASE(version3_tests, RegTestingSetup)
+{
+ // Test V3 policy helper functions
+ CTxMemPool& pool = *Assert(m_node.mempool);
+ LOCK2(cs_main, pool.cs);
+ TestMemPoolEntryHelper entry;
+ std::set<Txid> empty_conflicts_set;
+ CTxMemPool::setEntries empty_ancestors;
+
+ auto mempool_tx_v3 = make_tx(random_outpoints(1), /*version=*/3);
+ pool.addUnchecked(entry.FromTx(mempool_tx_v3));
+ auto mempool_tx_v2 = make_tx(random_outpoints(1), /*version=*/2);
+ pool.addUnchecked(entry.FromTx(mempool_tx_v2));
+ // Default values.
+ CTxMemPool::Limits m_limits{};
+
+ // Cannot spend from an unconfirmed v3 transaction unless this tx is also v3.
+ {
+ // mempool_tx_v3
+ // ^
+ // tx_v2_from_v3
+ auto tx_v2_from_v3 = make_tx({COutPoint{mempool_tx_v3->GetHash(), 0}}, /*version=*/2);
+ auto ancestors_v2_from_v3{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v2_from_v3), m_limits)};
+ const auto expected_error_str{strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
+ tx_v2_from_v3->GetHash().ToString(), tx_v2_from_v3->GetWitnessHash().ToString(),
+ mempool_tx_v3->GetHash().ToString(), mempool_tx_v3->GetWitnessHash().ToString())};
+ BOOST_CHECK(*SingleV3Checks(tx_v2_from_v3, *ancestors_v2_from_v3, empty_conflicts_set, GetVirtualTransactionSize(*tx_v2_from_v3)) == expected_error_str);
+
+ Package package_v3_v2{mempool_tx_v3, tx_v2_from_v3};
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v2_from_v3, GetVirtualTransactionSize(*tx_v2_from_v3), package_v3_v2, empty_ancestors), expected_error_str);
+ CTxMemPool::setEntries entries_mempool_v3{pool.GetIter(mempool_tx_v3->GetHash().ToUint256()).value()};
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v2_from_v3, GetVirtualTransactionSize(*tx_v2_from_v3), {tx_v2_from_v3}, entries_mempool_v3), expected_error_str);
+
+ // mempool_tx_v3 mempool_tx_v2
+ // ^ ^
+ // tx_v2_from_v2_and_v3
+ auto tx_v2_from_v2_and_v3 = make_tx({COutPoint{mempool_tx_v3->GetHash(), 0}, COutPoint{mempool_tx_v2->GetHash(), 0}}, /*version=*/2);
+ auto ancestors_v2_from_both{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v2_from_v2_and_v3), m_limits)};
+ const auto expected_error_str_2{strprintf("non-v3 tx %s (wtxid=%s) cannot spend from v3 tx %s (wtxid=%s)",
+ tx_v2_from_v2_and_v3->GetHash().ToString(), tx_v2_from_v2_and_v3->GetWitnessHash().ToString(),
+ mempool_tx_v3->GetHash().ToString(), mempool_tx_v3->GetWitnessHash().ToString())};
+ BOOST_CHECK(*SingleV3Checks(tx_v2_from_v2_and_v3, *ancestors_v2_from_both, empty_conflicts_set, GetVirtualTransactionSize(*tx_v2_from_v2_and_v3))
+ == expected_error_str_2);
+
+ Package package_v3_v2_v2{mempool_tx_v3, mempool_tx_v2, tx_v2_from_v2_and_v3};
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v2_from_v2_and_v3, GetVirtualTransactionSize(*tx_v2_from_v2_and_v3), package_v3_v2_v2, empty_ancestors), expected_error_str_2);
+ }
+
+ // V3 cannot spend from an unconfirmed non-v3 transaction.
+ {
+ // mempool_tx_v2
+ // ^
+ // tx_v3_from_v2
+ auto tx_v3_from_v2 = make_tx({COutPoint{mempool_tx_v2->GetHash(), 0}}, /*version=*/3);
+ auto ancestors_v3_from_v2{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_from_v2), m_limits)};
+ const auto expected_error_str{strprintf("v3 tx %s (wtxid=%s) cannot spend from non-v3 tx %s (wtxid=%s)",
+ tx_v3_from_v2->GetHash().ToString(), tx_v3_from_v2->GetWitnessHash().ToString(),
+ mempool_tx_v2->GetHash().ToString(), mempool_tx_v2->GetWitnessHash().ToString())};
+ BOOST_CHECK(*SingleV3Checks(tx_v3_from_v2, *ancestors_v3_from_v2, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_from_v2)) == expected_error_str);
+
+ Package package_v2_v3{mempool_tx_v2, tx_v3_from_v2};
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_from_v2, GetVirtualTransactionSize(*tx_v3_from_v2), package_v2_v3, empty_ancestors), expected_error_str);
+ CTxMemPool::setEntries entries_mempool_v2{pool.GetIter(mempool_tx_v2->GetHash().ToUint256()).value()};
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_from_v2, GetVirtualTransactionSize(*tx_v3_from_v2), {tx_v3_from_v2}, entries_mempool_v2), expected_error_str);
+
+ // mempool_tx_v3 mempool_tx_v2
+ // ^ ^
+ // tx_v3_from_v2_and_v3
+ auto tx_v3_from_v2_and_v3 = make_tx({COutPoint{mempool_tx_v3->GetHash(), 0}, COutPoint{mempool_tx_v2->GetHash(), 0}}, /*version=*/3);
+ auto ancestors_v3_from_both{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_from_v2_and_v3), m_limits)};
+ const auto expected_error_str_2{strprintf("v3 tx %s (wtxid=%s) cannot spend from non-v3 tx %s (wtxid=%s)",
+ tx_v3_from_v2_and_v3->GetHash().ToString(), tx_v3_from_v2_and_v3->GetWitnessHash().ToString(),
+ mempool_tx_v2->GetHash().ToString(), mempool_tx_v2->GetWitnessHash().ToString())};
+ BOOST_CHECK(*SingleV3Checks(tx_v3_from_v2_and_v3, *ancestors_v3_from_both, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_from_v2_and_v3))
+ == expected_error_str_2);
+
+ // tx_v3_from_v2_and_v3 also violates V3_ANCESTOR_LIMIT.
+ const auto expected_error_str_3{strprintf("tx %s (wtxid=%s) would have too many ancestors",
+ tx_v3_from_v2_and_v3->GetHash().ToString(), tx_v3_from_v2_and_v3->GetWitnessHash().ToString())};
+ Package package_v3_v2_v3{mempool_tx_v3, mempool_tx_v2, tx_v3_from_v2_and_v3};
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_from_v2_and_v3, GetVirtualTransactionSize(*tx_v3_from_v2_and_v3), package_v3_v2_v3, empty_ancestors), expected_error_str_3);
+ }
+ // V3 from V3 is ok, and non-V3 from non-V3 is ok.
+ {
+ // mempool_tx_v3
+ // ^
+ // tx_v3_from_v3
+ auto tx_v3_from_v3 = make_tx({COutPoint{mempool_tx_v3->GetHash(), 0}}, /*version=*/3);
+ auto ancestors_v3{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_from_v3), m_limits)};
+ BOOST_CHECK(SingleV3Checks(tx_v3_from_v3, *ancestors_v3, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_from_v3))
+ == std::nullopt);
+
+ Package package_v3_v3{mempool_tx_v3, tx_v3_from_v3};
+ BOOST_CHECK(PackageV3Checks(tx_v3_from_v3, GetVirtualTransactionSize(*tx_v3_from_v3), package_v3_v3, empty_ancestors) == std::nullopt);
+
+ // mempool_tx_v2
+ // ^
+ // tx_v2_from_v2
+ auto tx_v2_from_v2 = make_tx({COutPoint{mempool_tx_v2->GetHash(), 0}}, /*version=*/2);
+ auto ancestors_v2{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v2_from_v2), m_limits)};
+ BOOST_CHECK(SingleV3Checks(tx_v2_from_v2, *ancestors_v2, empty_conflicts_set, GetVirtualTransactionSize(*tx_v2_from_v2))
+ == std::nullopt);
+
+ Package package_v2_v2{mempool_tx_v2, tx_v2_from_v2};
+ BOOST_CHECK(PackageV3Checks(tx_v2_from_v2, GetVirtualTransactionSize(*tx_v2_from_v2), package_v2_v2, empty_ancestors) == std::nullopt);
+ }
+
+ // Tx spending v3 cannot have too many mempool ancestors
+ // Configuration where the tx has multiple direct parents.
+ {
+ Package package_multi_parents;
+ std::vector<COutPoint> mempool_outpoints;
+ mempool_outpoints.emplace_back(mempool_tx_v3->GetHash(), 0);
+ package_multi_parents.emplace_back(mempool_tx_v3);
+ for (size_t i{0}; i < 2; ++i) {
+ auto mempool_tx = make_tx(random_outpoints(i + 1), /*version=*/3);
+ pool.addUnchecked(entry.FromTx(mempool_tx));
+ mempool_outpoints.emplace_back(mempool_tx->GetHash(), 0);
+ package_multi_parents.emplace_back(mempool_tx);
+ }
+ auto tx_v3_multi_parent = make_tx(mempool_outpoints, /*version=*/3);
+ package_multi_parents.emplace_back(tx_v3_multi_parent);
+ auto ancestors{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_multi_parent), m_limits)};
+ BOOST_CHECK_EQUAL(ancestors->size(), 3);
+ const auto expected_error_str{strprintf("tx %s (wtxid=%s) would have too many ancestors",
+ tx_v3_multi_parent->GetHash().ToString(), tx_v3_multi_parent->GetWitnessHash().ToString())};
+ BOOST_CHECK_EQUAL(*SingleV3Checks(tx_v3_multi_parent, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_multi_parent)),
+ expected_error_str);
+
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_multi_parent, GetVirtualTransactionSize(*tx_v3_multi_parent), package_multi_parents, empty_ancestors),
+ expected_error_str);
+ }
+
+ // Configuration where the tx is in a multi-generation chain.
+ {
+ Package package_multi_gen;
+ CTransactionRef middle_tx;
+ auto last_outpoint{random_outpoints(1)[0]};
+ for (size_t i{0}; i < 2; ++i) {
+ auto mempool_tx = make_tx({last_outpoint}, /*version=*/3);
+ pool.addUnchecked(entry.FromTx(mempool_tx));
+ last_outpoint = COutPoint{mempool_tx->GetHash(), 0};
+ package_multi_gen.emplace_back(mempool_tx);
+ if (i == 1) middle_tx = mempool_tx;
+ }
+ auto tx_v3_multi_gen = make_tx({last_outpoint}, /*version=*/3);
+ package_multi_gen.emplace_back(tx_v3_multi_gen);
+ auto ancestors{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_multi_gen), m_limits)};
+ const auto expected_error_str{strprintf("tx %s (wtxid=%s) would have too many ancestors",
+ tx_v3_multi_gen->GetHash().ToString(), tx_v3_multi_gen->GetWitnessHash().ToString())};
+ BOOST_CHECK_EQUAL(*SingleV3Checks(tx_v3_multi_gen, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_multi_gen)),
+ expected_error_str);
+
+ // Middle tx is what triggers a failure for the grandchild:
+ BOOST_CHECK_EQUAL(*PackageV3Checks(middle_tx, GetVirtualTransactionSize(*middle_tx), package_multi_gen, empty_ancestors), expected_error_str);
+ BOOST_CHECK(PackageV3Checks(tx_v3_multi_gen, GetVirtualTransactionSize(*tx_v3_multi_gen), package_multi_gen, empty_ancestors) == std::nullopt);
+ }
+
+ // Tx spending v3 cannot be too large in virtual size.
+ auto many_inputs{random_outpoints(100)};
+ many_inputs.emplace_back(mempool_tx_v3->GetHash(), 0);
+ {
+ auto tx_v3_child_big = make_tx(many_inputs, /*version=*/3);
+ const auto vsize{GetVirtualTransactionSize(*tx_v3_child_big)};
+ auto ancestors{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_child_big), m_limits)};
+ const auto expected_error_str{strprintf("v3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
+ tx_v3_child_big->GetHash().ToString(), tx_v3_child_big->GetWitnessHash().ToString(), vsize, V3_CHILD_MAX_VSIZE)};
+ BOOST_CHECK_EQUAL(*SingleV3Checks(tx_v3_child_big, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child_big)),
+ expected_error_str);
+
+ Package package_child_big{mempool_tx_v3, tx_v3_child_big};
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_child_big, GetVirtualTransactionSize(*tx_v3_child_big), package_child_big, empty_ancestors),
+ expected_error_str);
+ }
+
+ // Tx spending v3 cannot have too many sigops.
+ // This child has 10 P2WSH multisig inputs.
+ auto multisig_outpoints{random_outpoints(10)};
+ multisig_outpoints.emplace_back(mempool_tx_v3->GetHash(), 0);
+ auto keys{random_keys(2)};
+ CScript script_multisig;
+ script_multisig << OP_1;
+ for (const auto& key : keys) {
+ script_multisig << ToByteVector(key);
+ }
+ script_multisig << OP_2 << OP_CHECKMULTISIG;
+ {
+ CMutableTransaction mtx_many_sigops = CMutableTransaction{};
+ mtx_many_sigops.nVersion = 3;
+ for (const auto& outpoint : multisig_outpoints) {
+ mtx_many_sigops.vin.emplace_back(outpoint);
+ mtx_many_sigops.vin.back().scriptWitness.stack.emplace_back(script_multisig.begin(), script_multisig.end());
+ }
+ mtx_many_sigops.vout.resize(1);
+ mtx_many_sigops.vout.back().scriptPubKey = CScript() << OP_TRUE;
+ mtx_many_sigops.vout.back().nValue = 10000;
+ auto tx_many_sigops{MakeTransactionRef(mtx_many_sigops)};
+
+ auto ancestors{pool.CalculateMemPoolAncestors(entry.FromTx(tx_many_sigops), m_limits)};
+ // legacy uses fAccurate = false, and the maximum number of multisig keys is used
+ const int64_t total_sigops{static_cast<int64_t>(tx_many_sigops->vin.size()) * static_cast<int64_t>(script_multisig.GetSigOpCount(/*fAccurate=*/false))};
+ BOOST_CHECK_EQUAL(total_sigops, tx_many_sigops->vin.size() * MAX_PUBKEYS_PER_MULTISIG);
+ const int64_t bip141_vsize{GetVirtualTransactionSize(*tx_many_sigops)};
+ // Weight limit is not reached...
+ BOOST_CHECK(SingleV3Checks(tx_many_sigops, *ancestors, empty_conflicts_set, bip141_vsize) == std::nullopt);
+ // ...but sigop limit is.
+ const auto expected_error_str{strprintf("v3 child tx %s (wtxid=%s) is too big: %u > %u virtual bytes",
+ tx_many_sigops->GetHash().ToString(), tx_many_sigops->GetWitnessHash().ToString(),
+ total_sigops * DEFAULT_BYTES_PER_SIGOP / WITNESS_SCALE_FACTOR, V3_CHILD_MAX_VSIZE)};
+ BOOST_CHECK_EQUAL(*SingleV3Checks(tx_many_sigops, *ancestors, empty_conflicts_set,
+ GetVirtualTransactionSize(*tx_many_sigops, /*nSigOpCost=*/total_sigops, /*bytes_per_sigop=*/ DEFAULT_BYTES_PER_SIGOP)),
+ expected_error_str);
+
+ Package package_child_sigops{mempool_tx_v3, tx_many_sigops};
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_many_sigops, total_sigops * DEFAULT_BYTES_PER_SIGOP / WITNESS_SCALE_FACTOR, package_child_sigops, empty_ancestors),
+ expected_error_str);
+ }
+
+ // Parent + child with v3 in the mempool. Child is allowed as long as it is under V3_CHILD_MAX_VSIZE.
+ auto tx_mempool_v3_child = make_tx({COutPoint{mempool_tx_v3->GetHash(), 0}}, /*version=*/3);
+ {
+ BOOST_CHECK(GetTransactionWeight(*tx_mempool_v3_child) <= V3_CHILD_MAX_VSIZE * WITNESS_SCALE_FACTOR);
+ auto ancestors{pool.CalculateMemPoolAncestors(entry.FromTx(tx_mempool_v3_child), m_limits)};
+ BOOST_CHECK(SingleV3Checks(tx_mempool_v3_child, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_mempool_v3_child)) == std::nullopt);
+ pool.addUnchecked(entry.FromTx(tx_mempool_v3_child));
+
+ Package package_v3_1p1c{mempool_tx_v3, tx_mempool_v3_child};
+ BOOST_CHECK(PackageV3Checks(tx_mempool_v3_child, GetVirtualTransactionSize(*tx_mempool_v3_child), package_v3_1p1c, empty_ancestors) == std::nullopt);
+ }
+
+ // A v3 transaction cannot have more than 1 descendant.
+ // Configuration where tx has multiple direct children.
+ {
+ auto tx_v3_child2 = make_tx({COutPoint{mempool_tx_v3->GetHash(), 1}}, /*version=*/3);
+ auto ancestors{pool.CalculateMemPoolAncestors(entry.FromTx(tx_v3_child2), m_limits)};
+ const auto expected_error_str{strprintf("tx %s (wtxid=%s) would exceed descendant count limit",
+ mempool_tx_v3->GetHash().ToString(), mempool_tx_v3->GetWitnessHash().ToString())};
+ BOOST_CHECK_EQUAL(*SingleV3Checks(tx_v3_child2, *ancestors, empty_conflicts_set, GetVirtualTransactionSize(*tx_v3_child2)),
+ expected_error_str);
+ // If replacing the child, make sure there is no double-counting.
+ BOOST_CHECK(SingleV3Checks(tx_v3_child2, *ancestors, {tx_mempool_v3_child->GetHash()}, GetVirtualTransactionSize(*tx_v3_child2))
+ == std::nullopt);
+
+ Package package_v3_1p2c{mempool_tx_v3, tx_mempool_v3_child, tx_v3_child2};
+ BOOST_CHECK_EQUAL(*PackageV3Checks(tx_v3_child2, GetVirtualTransactionSize(*tx_v3_child2), package_v3_1p2c, empty_ancestors),
+ expected_error_str);
+ }
+
+ // Configuration where tx has multiple generations of descendants is not tested because that is
+ // equivalent to the tx with multiple generations of ancestors.
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/util/mining.cpp b/src/test/util/mining.cpp
index 08d1b4c902..ad7a38d3fe 100644
--- a/src/test/util/mining.cpp
+++ b/src/test/util/mining.cpp
@@ -95,12 +95,12 @@ COutPoint MineBlock(const NodeContext& node, std::shared_ptr<CBlock>& block)
const auto old_height = WITH_LOCK(chainman.GetMutex(), return chainman.ActiveHeight());
bool new_block;
BlockValidationStateCatcher bvsc{block->GetHash()};
- RegisterValidationInterface(&bvsc);
+ node.validation_signals->RegisterValidationInterface(&bvsc);
const bool processed{chainman.ProcessNewBlock(block, true, true, &new_block)};
const bool duplicate{!new_block && processed};
assert(!duplicate);
- UnregisterValidationInterface(&bvsc);
- SyncWithValidationInterfaceQueue();
+ node.validation_signals->UnregisterValidationInterface(&bvsc);
+ node.validation_signals->SyncWithValidationInterfaceQueue();
const bool was_valid{bvsc.m_state && bvsc.m_state->IsValid()};
assert(old_height + was_valid == WITH_LOCK(chainman.GetMutex(), return chainman.ActiveHeight()));
diff --git a/src/test/util/setup_common.cpp b/src/test/util/setup_common.cpp
index 86a3342353..2c18184261 100644
--- a/src/test/util/setup_common.cpp
+++ b/src/test/util/setup_common.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <test/util/setup_common.h>
#include <kernel/validation_cache_sizes.h>
@@ -44,7 +48,6 @@
#include <test/util/net.h>
#include <test/util/random.h>
#include <test/util/txmempool.h>
-#include <timedata.h>
#include <txdb.h>
#include <txmempool.h>
#include <util/chaintype.h>
@@ -223,7 +226,7 @@ ChainTestingSetup::ChainTestingSetup(const ChainType chainType, const std::vecto
// from blocking due to queue overrun.
m_node.scheduler = std::make_unique<CScheduler>();
m_node.scheduler->m_service_thread = std::thread(util::TraceThread, "scheduler", [&] { m_node.scheduler->serviceQueue(); });
- GetMainSignals().RegisterBackgroundSignalScheduler(*m_node.scheduler);
+ m_node.validation_signals = std::make_unique<ValidationSignals>(std::make_unique<SerialTaskRunner>(*m_node.scheduler));
m_node.fee_estimator = std::make_unique<CBlockPolicyEstimator>(FeeestPath(*m_node.args), DEFAULT_ACCEPT_STALE_FEE_ESTIMATES);
m_node.mempool = std::make_unique<CTxMemPool>(MemPoolOptionsForTest(m_node));
@@ -235,9 +238,9 @@ ChainTestingSetup::ChainTestingSetup(const ChainType chainType, const std::vecto
const ChainstateManager::Options chainman_opts{
.chainparams = chainparams,
.datadir = m_args.GetDataDirNet(),
- .adjusted_time_callback = GetAdjustedTime,
.check_block_index = true,
.notifications = *m_node.notifications,
+ .signals = m_node.validation_signals.get(),
.worker_threads_num = 2,
};
const BlockManager::Options blockman_opts{
@@ -255,8 +258,7 @@ ChainTestingSetup::ChainTestingSetup(const ChainType chainType, const std::vecto
ChainTestingSetup::~ChainTestingSetup()
{
if (m_node.scheduler) m_node.scheduler->stop();
- GetMainSignals().FlushBackgroundCallbacks();
- GetMainSignals().UnregisterBackgroundSignalScheduler();
+ m_node.validation_signals->FlushBackgroundCallbacks();
m_node.connman.reset();
m_node.banman.reset();
m_node.addrman.reset();
@@ -265,6 +267,7 @@ ChainTestingSetup::~ChainTestingSetup()
m_node.mempool.reset();
m_node.fee_estimator.reset();
m_node.chainman.reset();
+ m_node.validation_signals.reset();
m_node.scheduler.reset();
}
diff --git a/src/test/util/txmempool.cpp b/src/test/util/txmempool.cpp
index 379c3c9329..71cf8aca60 100644
--- a/src/test/util/txmempool.cpp
+++ b/src/test/util/txmempool.cpp
@@ -7,6 +7,7 @@
#include <chainparams.h>
#include <node/context.h>
#include <node/mempool_args.h>
+#include <policy/v3_policy.h>
#include <txmempool.h>
#include <util/check.h>
#include <util/time.h>
@@ -21,6 +22,7 @@ CTxMemPool::Options MemPoolOptionsForTest(const NodeContext& node)
// Default to always checking mempool regardless of
// chainparams.DefaultConsistencyChecks for tests
.check_ratio = 1,
+ .signals = node.validation_signals.get(),
};
const auto result{ApplyArgsManOptions(*node.args, ::Params(), mempool_opts)};
Assert(result);
@@ -116,3 +118,28 @@ std::optional<std::string> CheckPackageMempoolAcceptResult(const Package& txns,
}
return std::nullopt;
}
+
+void CheckMempoolV3Invariants(const CTxMemPool& tx_pool)
+{
+ LOCK(tx_pool.cs);
+ for (const auto& tx_info : tx_pool.infoAll()) {
+ const auto& entry = *Assert(tx_pool.GetEntry(tx_info.tx->GetHash()));
+ if (tx_info.tx->nVersion == 3) {
+ // Check that special v3 ancestor/descendant limits and rules are always respected
+ Assert(entry.GetCountWithDescendants() <= V3_DESCENDANT_LIMIT);
+ Assert(entry.GetCountWithAncestors() <= V3_ANCESTOR_LIMIT);
+ // If this transaction has at least 1 ancestor, it's a "child" and has restricted weight.
+ if (entry.GetCountWithAncestors() > 1) {
+ Assert(entry.GetTxSize() <= V3_CHILD_MAX_VSIZE);
+ // All v3 transactions must only have v3 unconfirmed parents.
+ const auto& parents = entry.GetMemPoolParentsConst();
+ Assert(parents.begin()->get().GetSharedTx()->nVersion == 3);
+ }
+ } else if (entry.GetCountWithAncestors() > 1) {
+ // All non-v3 transactions must only have non-v3 unconfirmed parents.
+ for (const auto& parent : entry.GetMemPoolParentsConst()) {
+ Assert(parent.get().GetSharedTx()->nVersion != 3);
+ }
+ }
+ }
+}
diff --git a/src/test/util/txmempool.h b/src/test/util/txmempool.h
index a866d1ce74..b3022af7df 100644
--- a/src/test/util/txmempool.h
+++ b/src/test/util/txmempool.h
@@ -46,4 +46,14 @@ std::optional<std::string> CheckPackageMempoolAcceptResult(const Package& txns,
const PackageMempoolAcceptResult& result,
bool expect_valid,
const CTxMemPool* mempool);
+
+/** For every transaction in tx_pool, check v3 invariants:
+ * - a v3 tx's ancestor count must be within V3_ANCESTOR_LIMIT
+ * - a v3 tx's descendant count must be within V3_DESCENDANT_LIMIT
+ * - if a v3 tx has ancestors, its sigop-adjusted vsize must be within V3_CHILD_MAX_VSIZE
+ * - any non-v3 tx must only have non-v3 parents
+ * - any v3 tx must only have v3 parents
+ * */
+void CheckMempoolV3Invariants(const CTxMemPool& tx_pool);
+
#endif // BITCOIN_TEST_UTIL_TXMEMPOOL_H
diff --git a/src/test/validation_block_tests.cpp b/src/test/validation_block_tests.cpp
index 35e5c6a037..316ab86c2b 100644
--- a/src/test/validation_block_tests.cpp
+++ b/src/test/validation_block_tests.cpp
@@ -158,7 +158,7 @@ BOOST_AUTO_TEST_CASE(processnewblock_signals_ordering)
bool ignored;
// Connect the genesis block and drain any outstanding events
BOOST_CHECK(Assert(m_node.chainman)->ProcessNewBlock(std::make_shared<CBlock>(Params().GenesisBlock()), true, true, &ignored));
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
// subscribe to events (this subscriber will validate event ordering)
const CBlockIndex* initial_tip = nullptr;
@@ -167,7 +167,7 @@ BOOST_AUTO_TEST_CASE(processnewblock_signals_ordering)
initial_tip = m_node.chainman->ActiveChain().Tip();
}
auto sub = std::make_shared<TestSubscriber>(initial_tip->GetBlockHash());
- RegisterSharedValidationInterface(sub);
+ m_node.validation_signals->RegisterSharedValidationInterface(sub);
// create a bunch of threads that repeatedly process a block generated above at random
// this will create parallelism and randomness inside validation - the ValidationInterface
@@ -196,9 +196,9 @@ BOOST_AUTO_TEST_CASE(processnewblock_signals_ordering)
for (auto& t : threads) {
t.join();
}
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
- UnregisterSharedValidationInterface(sub);
+ m_node.validation_signals->UnregisterSharedValidationInterface(sub);
LOCK(cs_main);
BOOST_CHECK_EQUAL(sub->m_expected_tip, m_node.chainman->ActiveChain().Tip()->GetBlockHash());
diff --git a/src/test/validation_chainstatemanager_tests.cpp b/src/test/validation_chainstatemanager_tests.cpp
index 368ba8bee4..4bbab1cdcd 100644
--- a/src/test/validation_chainstatemanager_tests.cpp
+++ b/src/test/validation_chainstatemanager_tests.cpp
@@ -15,7 +15,6 @@
#include <test/util/random.h>
#include <test/util/setup_common.h>
#include <test/util/validation.h>
-#include <timedata.h>
#include <uint256.h>
#include <validation.h>
#include <validationinterface.h>
@@ -103,7 +102,7 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager, TestChain100Setup)
BOOST_CHECK_EQUAL(active_tip2, c2.m_chain.Tip());
// Let scheduler events finish running to avoid accessing memory that is going to be unloaded
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
}
//! Test rebalancing the caches associated with each chainstate.
@@ -375,7 +374,7 @@ struct SnapshotTestSetup : TestChain100Setup {
cs->ForceFlushStateToDisk();
}
// Process all callbacks referring to the old manager before wiping it.
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
LOCK(::cs_main);
chainman.ResetChainstates();
BOOST_CHECK_EQUAL(chainman.GetAll().size(), 0);
@@ -383,8 +382,8 @@ struct SnapshotTestSetup : TestChain100Setup {
const ChainstateManager::Options chainman_opts{
.chainparams = ::Params(),
.datadir = chainman.m_options.datadir,
- .adjusted_time_callback = GetAdjustedTime,
.notifications = *m_node.notifications,
+ .signals = m_node.validation_signals.get(),
};
const BlockManager::Options blockman_opts{
.chainparams = chainman_opts.chainparams,
diff --git a/src/test/validation_tests.cpp b/src/test/validation_tests.cpp
index 14440571eb..93a884be6d 100644
--- a/src/test/validation_tests.cpp
+++ b/src/test/validation_tests.cpp
@@ -4,12 +4,17 @@
#include <chainparams.h>
#include <consensus/amount.h>
+#include <consensus/merkle.h>
+#include <core_io.h>
+#include <hash.h>
#include <net.h>
#include <signet.h>
#include <uint256.h>
#include <util/chaintype.h>
#include <validation.h>
+#include <string>
+
#include <test/util/setup_common.h>
#include <boost/test/unit_test.hpp>
@@ -145,4 +150,214 @@ BOOST_AUTO_TEST_CASE(test_assumeutxo)
BOOST_CHECK_EQUAL(out110_2.nChainTx, 111U);
}
+BOOST_AUTO_TEST_CASE(block_malleation)
+{
+ // Test utilities that calls `IsBlockMutated` and then clears the validity
+ // cache flags on `CBlock`.
+ auto is_mutated = [](CBlock& block, bool check_witness_root) {
+ bool mutated{IsBlockMutated(block, check_witness_root)};
+ block.fChecked = false;
+ block.m_checked_witness_commitment = false;
+ block.m_checked_merkle_root = false;
+ return mutated;
+ };
+ auto is_not_mutated = [&is_mutated](CBlock& block, bool check_witness_root) {
+ return !is_mutated(block, check_witness_root);
+ };
+
+ // Test utilities to create coinbase transactions and insert witness
+ // commitments.
+ //
+ // Note: this will not include the witness stack by default to avoid
+ // triggering the "no witnesses allowed for blocks that don't commit to
+ // witnesses" rule when testing other malleation vectors.
+ auto create_coinbase_tx = [](bool include_witness = false) {
+ CMutableTransaction coinbase;
+ coinbase.vin.resize(1);
+ if (include_witness) {
+ coinbase.vin[0].scriptWitness.stack.resize(1);
+ coinbase.vin[0].scriptWitness.stack[0] = std::vector<unsigned char>(32, 0x00);
+ }
+
+ coinbase.vout.resize(1);
+ coinbase.vout[0].scriptPubKey.resize(MINIMUM_WITNESS_COMMITMENT);
+ coinbase.vout[0].scriptPubKey[0] = OP_RETURN;
+ coinbase.vout[0].scriptPubKey[1] = 0x24;
+ coinbase.vout[0].scriptPubKey[2] = 0xaa;
+ coinbase.vout[0].scriptPubKey[3] = 0x21;
+ coinbase.vout[0].scriptPubKey[4] = 0xa9;
+ coinbase.vout[0].scriptPubKey[5] = 0xed;
+
+ auto tx = MakeTransactionRef(coinbase);
+ assert(tx->IsCoinBase());
+ return tx;
+ };
+ auto insert_witness_commitment = [](CBlock& block, uint256 commitment) {
+ assert(!block.vtx.empty() && block.vtx[0]->IsCoinBase() && !block.vtx[0]->vout.empty());
+
+ CMutableTransaction mtx{*block.vtx[0]};
+ CHash256().Write(commitment).Write(std::vector<unsigned char>(32, 0x00)).Finalize(commitment);
+ memcpy(&mtx.vout[0].scriptPubKey[6], commitment.begin(), 32);
+ block.vtx[0] = MakeTransactionRef(mtx);
+ };
+
+ {
+ CBlock block;
+
+ // Empty block is expected to have merkle root of 0x0.
+ BOOST_CHECK(block.vtx.empty());
+ block.hashMerkleRoot = uint256{1};
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ block.hashMerkleRoot = uint256{};
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/false));
+
+ // Block with a single coinbase tx is mutated if the merkle root is not
+ // equal to the coinbase tx's hash.
+ block.vtx.push_back(create_coinbase_tx());
+ BOOST_CHECK(block.vtx[0]->GetHash() != block.hashMerkleRoot);
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ block.hashMerkleRoot = block.vtx[0]->GetHash();
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/false));
+
+ // Block with two transactions is mutated if the merkle root does not
+ // match the double sha256 of the concatenation of the two transaction
+ // hashes.
+ block.vtx.push_back(MakeTransactionRef(CMutableTransaction{}));
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ HashWriter hasher;
+ hasher.write(block.vtx[0]->GetHash());
+ hasher.write(block.vtx[1]->GetHash());
+ block.hashMerkleRoot = hasher.GetHash();
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/false));
+
+ // Block with two transactions is mutated if any node is duplicate.
+ {
+ block.vtx[1] = block.vtx[0];
+ HashWriter hasher;
+ hasher.write(block.vtx[0]->GetHash());
+ hasher.write(block.vtx[1]->GetHash());
+ block.hashMerkleRoot = hasher.GetHash();
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ }
+
+ // Blocks with 64-byte coinbase transactions are not considered mutated
+ block.vtx.clear();
+ {
+ CMutableTransaction mtx;
+ mtx.vin.resize(1);
+ mtx.vout.resize(1);
+ mtx.vout[0].scriptPubKey.resize(4);
+ block.vtx.push_back(MakeTransactionRef(mtx));
+ block.hashMerkleRoot = block.vtx.back()->GetHash();
+ assert(block.vtx.back()->IsCoinBase());
+ assert(GetSerializeSize(TX_NO_WITNESS(block.vtx.back())) == 64);
+ }
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/false));
+ }
+
+ {
+ // Test merkle root malleation
+
+ // Pseudo code to mine transactions tx{1,2,3}:
+ //
+ // ```
+ // loop {
+ // tx1 = random_tx()
+ // tx2 = random_tx()
+ // tx3 = deserialize_tx(txid(tx1) || txid(tx2));
+ // if serialized_size_without_witness(tx3) == 64 {
+ // print(hex(tx3))
+ // break
+ // }
+ // }
+ // ```
+ //
+ // The `random_tx` function used to mine the txs below simply created
+ // empty transactions with a random version field.
+ CMutableTransaction tx1;
+ BOOST_CHECK(DecodeHexTx(tx1, "ff204bd0000000000000", /*try_no_witness=*/true, /*try_witness=*/false));
+ CMutableTransaction tx2;
+ BOOST_CHECK(DecodeHexTx(tx2, "8ae53c92000000000000", /*try_no_witness=*/true, /*try_witness=*/false));
+ CMutableTransaction tx3;
+ BOOST_CHECK(DecodeHexTx(tx3, "cdaf22d00002c6a7f848f8ae4d30054e61dcf3303d6fe01d282163341f06feecc10032b3160fcab87bdfe3ecfb769206ef2d991b92f8a268e423a6ef4d485f06", /*try_no_witness=*/true, /*try_witness=*/false));
+ {
+ // Verify that double_sha256(txid1||txid2) == txid3
+ HashWriter hasher;
+ hasher.write(tx1.GetHash());
+ hasher.write(tx2.GetHash());
+ assert(hasher.GetHash() == tx3.GetHash());
+ // Verify that tx3 is 64 bytes in size (without witness).
+ assert(GetSerializeSize(TX_NO_WITNESS(tx3)) == 64);
+ }
+
+ CBlock block;
+ block.vtx.push_back(MakeTransactionRef(tx1));
+ block.vtx.push_back(MakeTransactionRef(tx2));
+ uint256 merkle_root = block.hashMerkleRoot = BlockMerkleRoot(block);
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/false));
+
+ // Mutate the block by replacing the two transactions with one 64-byte
+ // transaction that serializes into the concatenation of the txids of
+ // the transactions in the unmutated block.
+ block.vtx.clear();
+ block.vtx.push_back(MakeTransactionRef(tx3));
+ BOOST_CHECK(!block.vtx.back()->IsCoinBase());
+ BOOST_CHECK(BlockMerkleRoot(block) == merkle_root);
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ }
+
+ {
+ CBlock block;
+ block.vtx.push_back(create_coinbase_tx(/*include_witness=*/true));
+ {
+ CMutableTransaction mtx;
+ mtx.vin.resize(1);
+ mtx.vin[0].scriptWitness.stack.resize(1);
+ mtx.vin[0].scriptWitness.stack[0] = {0};
+ block.vtx.push_back(MakeTransactionRef(mtx));
+ }
+ block.hashMerkleRoot = BlockMerkleRoot(block);
+ // Block with witnesses is considered mutated if the witness commitment
+ // is not validated.
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/false));
+ // Block with invalid witness commitment is considered mutated.
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/true));
+
+ // Block with valid commitment is not mutated
+ {
+ auto commitment{BlockWitnessMerkleRoot(block)};
+ insert_witness_commitment(block, commitment);
+ block.hashMerkleRoot = BlockMerkleRoot(block);
+ }
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/true));
+
+ // Malleating witnesses should be caught by `IsBlockMutated`.
+ {
+ CMutableTransaction mtx{*block.vtx[1]};
+ assert(!mtx.vin[0].scriptWitness.stack[0].empty());
+ ++mtx.vin[0].scriptWitness.stack[0][0];
+ block.vtx[1] = MakeTransactionRef(mtx);
+ }
+ // Without also updating the witness commitment, the merkle root should
+ // not change when changing one of the witnesses.
+ BOOST_CHECK(block.hashMerkleRoot == BlockMerkleRoot(block));
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/true));
+ {
+ auto commitment{BlockWitnessMerkleRoot(block)};
+ insert_witness_commitment(block, commitment);
+ block.hashMerkleRoot = BlockMerkleRoot(block);
+ }
+ BOOST_CHECK(is_not_mutated(block, /*check_witness_root=*/true));
+
+ // Test malleating the coinbase witness reserved value
+ {
+ CMutableTransaction mtx{*block.vtx[0]};
+ mtx.vin[0].scriptWitness.stack.resize(0);
+ block.vtx[0] = MakeTransactionRef(mtx);
+ block.hashMerkleRoot = BlockMerkleRoot(block);
+ }
+ BOOST_CHECK(is_mutated(block, /*check_witness_root=*/true));
+ }
+}
+
BOOST_AUTO_TEST_SUITE_END()
diff --git a/src/test/validationinterface_tests.cpp b/src/test/validationinterface_tests.cpp
index 5979441057..a46cfc3029 100644
--- a/src/test/validationinterface_tests.cpp
+++ b/src/test/validationinterface_tests.cpp
@@ -28,7 +28,7 @@ BOOST_AUTO_TEST_CASE(unregister_validation_interface_race)
const CBlock block_dummy;
BlockValidationState state_dummy;
while (generate) {
- GetMainSignals().BlockChecked(block_dummy, state_dummy);
+ m_node.validation_signals->BlockChecked(block_dummy, state_dummy);
}
}};
@@ -37,8 +37,8 @@ BOOST_AUTO_TEST_CASE(unregister_validation_interface_race)
// keep going for about 1 sec, which is 250k iterations
for (int i = 0; i < 250000; i++) {
auto sub = std::make_shared<TestSubscriberNoop>();
- RegisterSharedValidationInterface(sub);
- UnregisterSharedValidationInterface(sub);
+ m_node.validation_signals->RegisterSharedValidationInterface(sub);
+ m_node.validation_signals->UnregisterSharedValidationInterface(sub);
}
// tell the other thread we are done
generate = false;
@@ -52,8 +52,8 @@ BOOST_AUTO_TEST_CASE(unregister_validation_interface_race)
class TestInterface : public CValidationInterface
{
public:
- TestInterface(std::function<void()> on_call = nullptr, std::function<void()> on_destroy = nullptr)
- : m_on_call(std::move(on_call)), m_on_destroy(std::move(on_destroy))
+ TestInterface(ValidationSignals& signals, std::function<void()> on_call = nullptr, std::function<void()> on_destroy = nullptr)
+ : m_on_call(std::move(on_call)), m_on_destroy(std::move(on_destroy)), m_signals{signals}
{
}
virtual ~TestInterface()
@@ -64,14 +64,15 @@ public:
{
if (m_on_call) m_on_call();
}
- static void Call()
+ void Call()
{
CBlock block;
BlockValidationState state;
- GetMainSignals().BlockChecked(block, state);
+ m_signals.BlockChecked(block, state);
}
std::function<void()> m_on_call;
std::function<void()> m_on_destroy;
+ ValidationSignals& m_signals;
};
// Regression test to ensure UnregisterAllValidationInterfaces calls don't
@@ -80,17 +81,23 @@ public:
BOOST_AUTO_TEST_CASE(unregister_all_during_call)
{
bool destroyed = false;
- RegisterSharedValidationInterface(std::make_shared<TestInterface>(
+ auto shared{std::make_shared<TestInterface>(
+ *m_node.validation_signals,
[&] {
// First call should decrements reference count 2 -> 1
- UnregisterAllValidationInterfaces();
+ m_node.validation_signals->UnregisterAllValidationInterfaces();
BOOST_CHECK(!destroyed);
// Second call should not decrement reference count 1 -> 0
- UnregisterAllValidationInterfaces();
+ m_node.validation_signals->UnregisterAllValidationInterfaces();
BOOST_CHECK(!destroyed);
},
- [&] { destroyed = true; }));
- TestInterface::Call();
+ [&] { destroyed = true; })};
+ m_node.validation_signals->RegisterSharedValidationInterface(shared);
+ BOOST_CHECK(shared.use_count() == 2);
+ shared->Call();
+ BOOST_CHECK(shared.use_count() == 1);
+ BOOST_CHECK(!destroyed);
+ shared.reset();
BOOST_CHECK(destroyed);
}
diff --git a/src/timedata.cpp b/src/timedata.cpp
index 15ca90ee6a..d948de976f 100644
--- a/src/timedata.cpp
+++ b/src/timedata.cpp
@@ -33,11 +33,6 @@ int64_t GetTimeOffset()
return nTimeOffset;
}
-NodeClock::time_point GetAdjustedTime()
-{
- return NodeClock::now() + std::chrono::seconds{GetTimeOffset()};
-}
-
#define BITCOIN_TIMEDATA_MAX_SAMPLES 200
static std::set<CNetAddr> g_sources;
diff --git a/src/timedata.h b/src/timedata.h
index c6c36d9a39..3e76f80452 100644
--- a/src/timedata.h
+++ b/src/timedata.h
@@ -5,11 +5,8 @@
#ifndef BITCOIN_TIMEDATA_H
#define BITCOIN_TIMEDATA_H
-#include <util/time.h>
-
#include <algorithm>
#include <cassert>
-#include <chrono>
#include <cstdint>
#include <vector>
@@ -75,11 +72,10 @@ public:
/** Functions to keep track of adjusted P2P time */
int64_t GetTimeOffset();
-NodeClock::time_point GetAdjustedTime();
void AddTimeData(const CNetAddr& ip, int64_t nTime);
/**
- * Reset the internal state of GetTimeOffset(), GetAdjustedTime() and AddTimeData().
+ * Reset the internal state of GetTimeOffset() and AddTimeData().
*/
void TestOnlyResetTimeData();
diff --git a/src/torcontrol.cpp b/src/torcontrol.cpp
index 11d13d050a..442c1c4d42 100644
--- a/src/torcontrol.cpp
+++ b/src/torcontrol.cpp
@@ -433,7 +433,7 @@ void TorController::add_onion_cb(TorControlConnection& _conn, const TorControlRe
return;
}
service = LookupNumeric(std::string(service_id+".onion"), Params().GetDefaultPort());
- LogPrintfCategory(BCLog::TOR, "Got service ID %s, advertising service %s\n", service_id, service.ToStringAddrPort());
+ LogInfo("Got tor service ID %s, advertising service %s\n", service_id, service.ToStringAddrPort());
if (WriteBinaryFile(GetPrivateKeyFile(), private_key)) {
LogPrint(BCLog::TOR, "Cached service private key to %s\n", fs::PathToString(GetPrivateKeyFile()));
} else {
diff --git a/src/txmempool.cpp b/src/txmempool.cpp
index acee56fe78..0bee27c2b2 100644
--- a/src/txmempool.cpp
+++ b/src/txmempool.cpp
@@ -406,7 +406,8 @@ CTxMemPool::CTxMemPool(const Options& opts)
m_require_standard{opts.require_standard},
m_full_rbf{opts.full_rbf},
m_persist_v1_dat{opts.persist_v1_dat},
- m_limits{opts.limits}
+ m_limits{opts.limits},
+ m_signals{opts.signals}
{
}
@@ -448,7 +449,7 @@ void CTxMemPool::addUnchecked(const CTxMemPoolEntry &entry, setEntries &setAnces
cachedInnerUsage += entry.DynamicMemoryUsage();
const CTransaction& tx = newit->GetTx();
- std::set<uint256> setParentTransactions;
+ std::set<Txid> setParentTransactions;
for (unsigned int i = 0; i < tx.vin.size(); i++) {
mapNextTx.insert(std::make_pair(&tx.vin[i].prevout, &tx));
setParentTransactions.insert(tx.vin[i].prevout.hash);
@@ -487,12 +488,12 @@ void CTxMemPool::removeUnchecked(txiter it, MemPoolRemovalReason reason)
// even if not directly reported below.
uint64_t mempool_sequence = GetAndIncrementSequence();
- if (reason != MemPoolRemovalReason::BLOCK) {
+ if (reason != MemPoolRemovalReason::BLOCK && m_signals) {
// Notify clients that a transaction has been removed from the mempool
// for any reason except being included in a block. Clients interested
// in transactions included in blocks can subscribe to the BlockConnected
// notification.
- GetMainSignals().TransactionRemovedFromMempool(it->GetSharedTx(), reason, mempool_sequence);
+ m_signals->TransactionRemovedFromMempool(it->GetSharedTx(), reason, mempool_sequence);
}
TRACE5(mempool, removed,
it->GetTx().GetHash().data(),
@@ -643,7 +644,9 @@ void CTxMemPool::removeForBlock(const std::vector<CTransactionRef>& vtx, unsigne
removeConflicts(*tx);
ClearPrioritisation(tx->GetHash());
}
- GetMainSignals().MempoolTransactionsRemovedForBlock(txs_removed_for_block, nBlockHeight);
+ if (m_signals) {
+ m_signals->MempoolTransactionsRemovedForBlock(txs_removed_for_block, nBlockHeight);
+ }
lastRollingFeeUpdate = GetTime();
blockSinceLastRollingFeeBump = true;
}
@@ -803,19 +806,6 @@ std::vector<CTxMemPool::indexed_transaction_set::const_iterator> CTxMemPool::Get
return iters;
}
-void CTxMemPool::queryHashes(std::vector<uint256>& vtxid) const
-{
- LOCK(cs);
- auto iters = GetSortedDepthAndScore();
-
- vtxid.clear();
- vtxid.reserve(mapTx.size());
-
- for (auto it : iters) {
- vtxid.push_back(it->GetTx().GetHash());
- }
-}
-
static TxMempoolInfo GetInfo(CTxMemPool::indexed_transaction_set::const_iterator it) {
return TxMempoolInfo{it->GetSharedTx(), it->GetTime(), it->GetFee(), it->GetTxSize(), it->GetModifiedFee() - it->GetFee()};
}
@@ -963,7 +953,7 @@ std::optional<CTxMemPool::txiter> CTxMemPool::GetIter(const uint256& txid) const
return std::nullopt;
}
-CTxMemPool::setEntries CTxMemPool::GetIterSet(const std::set<uint256>& hashes) const
+CTxMemPool::setEntries CTxMemPool::GetIterSet(const std::set<Txid>& hashes) const
{
CTxMemPool::setEntries ret;
for (const auto& h : hashes) {
diff --git a/src/txmempool.h b/src/txmempool.h
index 9da51756e6..32f2c024f7 100644
--- a/src/txmempool.h
+++ b/src/txmempool.h
@@ -40,6 +40,7 @@
#include <vector>
class CChain;
+class ValidationSignals;
/** Fake height value used in Coin to signify they are only in the memory pool (since 0.8) */
static const uint32_t MEMPOOL_HEIGHT = 0x7FFFFFFF;
@@ -447,6 +448,8 @@ public:
const Limits m_limits;
+ ValidationSignals* const m_signals;
+
/** Create a new CTxMemPool.
* Sanity checks will be off by default for performance, because otherwise
* accepting transactions becomes O(N^2) where N is the number of transactions
@@ -485,7 +488,6 @@ public:
void removeForBlock(const std::vector<CTransactionRef>& vtx, unsigned int nBlockHeight) EXCLUSIVE_LOCKS_REQUIRED(cs);
bool CompareDepthAndScore(const uint256& hasha, const uint256& hashb, bool wtxid=false);
- void queryHashes(std::vector<uint256>& vtxid) const;
bool isSpent(const COutPoint& outpoint) const;
unsigned int GetTransactionsUpdated() const;
void AddTransactionsUpdated(unsigned int n);
@@ -522,7 +524,7 @@ public:
/** Translate a set of hashes into a set of pool iterators to avoid repeated lookups.
* Does not require that all of the hashes correspond to actual transactions in the mempool,
* only returns the ones that exist. */
- setEntries GetIterSet(const std::set<uint256>& hashes) const EXCLUSIVE_LOCKS_REQUIRED(cs);
+ setEntries GetIterSet(const std::set<Txid>& hashes) const EXCLUSIVE_LOCKS_REQUIRED(cs);
/** Translate a list of hashes into a list of mempool iterators to avoid repeated lookups.
* The nth element in txids becomes the nth element in the returned vector. If any of the txids
diff --git a/src/util/asmap.cpp b/src/util/asmap.cpp
index 360573cbae..f50cd8a28c 100644
--- a/src/util/asmap.cpp
+++ b/src/util/asmap.cpp
@@ -5,13 +5,13 @@
#include <util/asmap.h>
#include <clientversion.h>
-#include <crypto/common.h>
#include <logging.h>
#include <serialize.h>
#include <streams.h>
#include <util/fs.h>
#include <algorithm>
+#include <bit>
#include <cassert>
#include <cstdio>
#include <utility>
@@ -111,7 +111,7 @@ uint32_t Interpret(const std::vector<bool> &asmap, const std::vector<bool> &ip)
} else if (opcode == Instruction::MATCH) {
match = DecodeMatch(pos, endpos);
if (match == INVALID) break; // Match bits straddle EOF
- matchlen = CountBits(match) - 1;
+ matchlen = std::bit_width(match) - 1;
if (bits < matchlen) break; // Not enough input bits
for (uint32_t bit = 0; bit < matchlen; bit++) {
if ((ip[ip.size() - bits]) != ((match >> (matchlen - 1 - bit)) & 1)) {
@@ -175,7 +175,7 @@ bool SanityCheckASMap(const std::vector<bool>& asmap, int bits)
} else if (opcode == Instruction::MATCH) {
uint32_t match = DecodeMatch(pos, endpos);
if (match == INVALID) return false; // Match bits straddle EOF
- int matchlen = CountBits(match) - 1;
+ int matchlen = std::bit_width(match) - 1;
if (prevopcode != Instruction::MATCH) had_incomplete_match = false;
if (matchlen < 8 && had_incomplete_match) return false; // Within a sequence of matches only at most one should be incomplete
had_incomplete_match = (matchlen < 8);
diff --git a/src/util/overloaded.h b/src/util/overloaded.h
index 6be7453f81..5bb4b4e563 100644
--- a/src/util/overloaded.h
+++ b/src/util/overloaded.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2021 The Bitcoin Core developers
+// Copyright (c) 2021-present The Bitcoin Core developers
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
@@ -15,7 +15,7 @@ namespace util {
//! https://en.cppreference.com/w/cpp/utility/variant/visit#Example
template<class... Ts> struct Overloaded : Ts... { using Ts::operator()...; };
-//! Explicit deduction guide (not needed as of C++20)
+//! Explicit deduction guide (not needed after clang-17)
template<class... Ts> Overloaded(Ts...) -> Overloaded<Ts...>;
} // namespace util
diff --git a/src/util/task_runner.h b/src/util/task_runner.h
new file mode 100644
index 0000000000..d3cd8007de
--- /dev/null
+++ b/src/util/task_runner.h
@@ -0,0 +1,52 @@
+// Copyright (c) 2024-present The Bitcoin Core developers
+// Distributed under the MIT software license, see the accompanying
+// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+#ifndef BITCOIN_UTIL_TASK_RUNNER_H
+#define BITCOIN_UTIL_TASK_RUNNER_H
+
+#include <cstddef>
+#include <functional>
+
+namespace util {
+
+/** @file
+ * This header provides an interface and simple implementation for a task
+ * runner. Another threaded, serial implementation using a queue is available in
+ * the scheduler module's SerialTaskRunner.
+ */
+
+class TaskRunnerInterface
+{
+public:
+ virtual ~TaskRunnerInterface() {}
+
+ /**
+ * The callback can either be queued for later/asynchronous/threaded
+ * processing, or be executed immediately for synchronous processing.
+ */
+
+ virtual void insert(std::function<void()> func) = 0;
+
+ /**
+ * Forces the processing of all pending events.
+ */
+ virtual void flush() = 0;
+
+ /**
+ * Returns the number of currently pending events.
+ */
+ virtual size_t size() = 0;
+};
+
+class ImmediateTaskRunner : public TaskRunnerInterface
+{
+public:
+ void insert(std::function<void()> func) override { func(); }
+ void flush() override {}
+ size_t size() override { return 0; }
+};
+
+} // namespace util
+
+#endif // BITCOIN_UTIL_TASK_RUNNER_H
diff --git a/src/util/transaction_identifier.h b/src/util/transaction_identifier.h
index 89e10dee01..d4a0ede25a 100644
--- a/src/util/transaction_identifier.h
+++ b/src/util/transaction_identifier.h
@@ -44,6 +44,7 @@ public:
constexpr void SetNull() { m_wrapped.SetNull(); }
std::string GetHex() const { return m_wrapped.GetHex(); }
std::string ToString() const { return m_wrapped.ToString(); }
+ static constexpr auto size() { return decltype(m_wrapped)::size(); }
constexpr const std::byte* data() const { return reinterpret_cast<const std::byte*>(m_wrapped.data()); }
constexpr const std::byte* begin() const { return reinterpret_cast<const std::byte*>(m_wrapped.begin()); }
constexpr const std::byte* end() const { return reinterpret_cast<const std::byte*>(m_wrapped.end()); }
diff --git a/src/util/types.h b/src/util/types.h
index 0047b00026..e930216aea 100644
--- a/src/util/types.h
+++ b/src/util/types.h
@@ -5,6 +5,7 @@
#ifndef BITCOIN_UTIL_TYPES_H
#define BITCOIN_UTIL_TYPES_H
+// Not needed after C++23 (DR, https://cplusplus.github.io/CWG/issues/2518.html)
template <class>
inline constexpr bool ALWAYS_FALSE{false};
diff --git a/src/validation.cpp b/src/validation.cpp
index 0f3d5d1454..c15e660499 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <validation.h>
#include <arith_uint256.h>
@@ -29,6 +33,7 @@
#include <logging/timer.h>
#include <node/blockstorage.h>
#include <node/utxo_snapshot.h>
+#include <policy/v3_policy.h>
#include <policy/policy.h>
#include <policy/rbf.h>
#include <policy/settings.h>
@@ -333,7 +338,9 @@ void Chainstate::MaybeUpdateMempoolForReorg(
// Also updates valid entries' cached LockPoints if needed.
// If false, the tx is still valid and its lockpoints are updated.
// If true, the tx would be invalid in the next block; remove this entry and all of its descendants.
- const auto filter_final_and_mature = [this](CTxMemPool::txiter it)
+ // Note that v3 rules are not applied here, so reorgs may cause violations of v3 inheritance or
+ // topology restrictions.
+ const auto filter_final_and_mature = [&](CTxMemPool::txiter it)
EXCLUSIVE_LOCKS_REQUIRED(m_mempool->cs, ::cs_main) {
AssertLockHeld(m_mempool->cs);
AssertLockHeld(::cs_main);
@@ -583,7 +590,7 @@ private:
struct Workspace {
explicit Workspace(const CTransactionRef& ptx) : m_ptx(ptx), m_hash(ptx->GetHash()) {}
/** Txids of mempool transactions that this transaction directly conflicts with. */
- std::set<uint256> m_conflicts;
+ std::set<Txid> m_conflicts;
/** Iterators to mempool entries that this transaction directly conflicts with. */
CTxMemPool::setEntries m_iters_conflicting;
/** Iterators to all mempool entries that would be replaced by this transaction, including
@@ -761,9 +768,12 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
// check all unconfirmed ancestors; otherwise an opt-in ancestor
// might be replaced, causing removal of this descendant.
//
- // If replaceability signaling is ignored due to node setting,
- // replacement is always allowed.
- if (!m_pool.m_full_rbf && !SignalsOptInRBF(*ptxConflicting)) {
+ // All V3 transactions are considered replaceable.
+ //
+ // Replaceability signaling of the original transactions may be
+ // ignored due to node setting.
+ const bool allow_rbf{m_pool.m_full_rbf || SignalsOptInRBF(*ptxConflicting) || ptxConflicting->nVersion == 3};
+ if (!allow_rbf) {
return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "txn-mempool-conflict");
}
@@ -865,7 +875,8 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
// while a tx could be package CPFP'd when entering the mempool, we do not have a DoS-resistant
// method of ensuring the tx remains bumped. For example, the fee-bumping child could disappear
// due to a replacement.
- if (!bypass_limits && ws.m_modified_fees < m_pool.m_min_relay_feerate.GetFee(ws.m_vsize)) {
+ // The only exception is v3 transactions.
+ if (!bypass_limits && ws.m_ptx->nVersion != 3 && ws.m_modified_fees < m_pool.m_min_relay_feerate.GetFee(ws.m_vsize)) {
// Even though this is a fee-related failure, this result is TX_MEMPOOL_POLICY, not
// TX_RECONSIDERABLE, because it cannot be bypassed using package validation.
return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "min relay fee not met",
@@ -947,6 +958,9 @@ bool MemPoolAccept::PreChecks(ATMPArgs& args, Workspace& ws)
}
ws.m_ancestors = *ancestors;
+ if (const auto err_string{SingleV3Checks(ws.m_ptx, ws.m_ancestors, ws.m_conflicts, ws.m_vsize)}) {
+ return state.Invalid(TxValidationResult::TX_MEMPOOL_POLICY, "v3-rule-violation", *err_string);
+ }
// A transaction that spends outputs that would be replaced by it is invalid. Now
// that we have the set of all ancestors we can detect this
@@ -1214,13 +1228,14 @@ bool MemPoolAccept::SubmitPackage(const ATMPArgs& args, std::vector<Workspace>&
results.emplace(ws.m_ptx->GetWitnessHash(),
MempoolAcceptResult::Success(std::move(ws.m_replaced_transactions), ws.m_vsize,
ws.m_base_fees, effective_feerate, effective_feerate_wtxids));
+ if (!m_pool.m_signals) continue;
const CTransaction& tx = *ws.m_ptx;
const auto tx_info = NewMempoolTransactionInfo(ws.m_ptx, ws.m_base_fees,
ws.m_vsize, ws.m_entry->GetHeight(),
args.m_bypass_limits, args.m_package_submission,
IsCurrentForFeeEstimation(m_active_chainstate),
m_pool.HasNoInputsOf(tx));
- GetMainSignals().TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
+ m_pool.m_signals->TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
}
return all_submitted;
}
@@ -1228,7 +1243,7 @@ bool MemPoolAccept::SubmitPackage(const ATMPArgs& args, std::vector<Workspace>&
MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef& ptx, ATMPArgs& args)
{
AssertLockHeld(cs_main);
- LOCK(m_pool.cs); // mempool "read lock" (held through GetMainSignals().TransactionAddedToMempool())
+ LOCK(m_pool.cs); // mempool "read lock" (held through m_pool.m_signals->TransactionAddedToMempool())
Workspace ws(ptx);
const std::vector<Wtxid> single_wtxid{ws.m_ptx->GetWitnessHash()};
@@ -1263,13 +1278,15 @@ MempoolAcceptResult MemPoolAccept::AcceptSingleTransaction(const CTransactionRef
return MempoolAcceptResult::FeeFailure(ws.m_state, CFeeRate(ws.m_modified_fees, ws.m_vsize), {ws.m_ptx->GetWitnessHash()});
}
- const CTransaction& tx = *ws.m_ptx;
- const auto tx_info = NewMempoolTransactionInfo(ws.m_ptx, ws.m_base_fees,
- ws.m_vsize, ws.m_entry->GetHeight(),
- args.m_bypass_limits, args.m_package_submission,
- IsCurrentForFeeEstimation(m_active_chainstate),
- m_pool.HasNoInputsOf(tx));
- GetMainSignals().TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
+ if (m_pool.m_signals) {
+ const CTransaction& tx = *ws.m_ptx;
+ const auto tx_info = NewMempoolTransactionInfo(ws.m_ptx, ws.m_base_fees,
+ ws.m_vsize, ws.m_entry->GetHeight(),
+ args.m_bypass_limits, args.m_package_submission,
+ IsCurrentForFeeEstimation(m_active_chainstate),
+ m_pool.HasNoInputsOf(tx));
+ m_pool.m_signals->TransactionAddedToMempool(tx_info, m_pool.GetAndIncrementSequence());
+ }
return MempoolAcceptResult::Success(std::move(ws.m_replaced_transactions), ws.m_vsize, ws.m_base_fees,
effective_feerate, single_wtxid);
@@ -1307,6 +1324,15 @@ PackageMempoolAcceptResult MemPoolAccept::AcceptMultipleTransactions(const std::
m_viewmempool.PackageAddTransaction(ws.m_ptx);
}
+ // At this point we have all in-mempool ancestors, and we know every transaction's vsize.
+ // Run the v3 checks on the package.
+ for (Workspace& ws : workspaces) {
+ if (auto err{PackageV3Checks(ws.m_ptx, ws.m_vsize, txns, ws.m_ancestors)}) {
+ package_state.Invalid(PackageValidationResult::PCKG_POLICY, "v3-violation", err.value());
+ return PackageMempoolAcceptResult(package_state, {});
+ }
+ }
+
// Transactions must meet two minimum feerates: the mempool minimum fee and min relay fee.
// For transactions consisting of exactly one child and its parents, it suffices to use the
// package feerate (total modified fees / total virtual size) to check this requirement.
@@ -2188,7 +2214,7 @@ bool Chainstate::ConnectBlock(const CBlock& block, BlockValidationState& state,
// Also, currently the rule against blocks more than 2 hours in the future
// is enforced in ContextualCheckBlockHeader(); we wouldn't want to
// re-enforce that rule here (at least until we make it impossible for
- // m_adjusted_time_callback() to go backward).
+ // the clock to go backward).
if (!CheckBlock(block, state, params.GetConsensus(), !fJustCheck, !fJustCheck)) {
if (state.GetResult() == BlockValidationResult::BLOCK_MUTATED) {
// We don't write down blocks to disk if they may have been
@@ -2672,9 +2698,9 @@ bool Chainstate::FlushStateToDisk(
(bool)fFlushForPrune);
}
}
- if (full_flush_completed) {
+ if (full_flush_completed && m_chainman.m_options.signals) {
// Update best block in wallet (so we can detect restored wallets).
- GetMainSignals().ChainStateFlushed(this->GetRole(), m_chain.GetLocator());
+ m_chainman.m_options.signals->ChainStateFlushed(this->GetRole(), m_chain.GetLocator());
}
} catch (const std::runtime_error& e) {
return FatalError(m_chainman.GetNotifications(), state, std::string("System error while flushing: ") + e.what());
@@ -2841,7 +2867,9 @@ bool Chainstate::DisconnectTip(BlockValidationState& state, DisconnectedBlockTra
UpdateTip(pindexDelete->pprev);
// Let wallets know transactions went from 1-confirmed to
// 0-confirmed or conflicted:
- GetMainSignals().BlockDisconnected(pblock, pindexDelete);
+ if (m_chainman.m_options.signals) {
+ m_chainman.m_options.signals->BlockDisconnected(pblock, pindexDelete);
+ }
return true;
}
@@ -2926,7 +2954,9 @@ bool Chainstate::ConnectTip(BlockValidationState& state, CBlockIndex* pindexNew,
{
CCoinsViewCache view(&CoinsTip());
bool rv = ConnectBlock(blockConnecting, state, pindexNew, view);
- GetMainSignals().BlockChecked(blockConnecting, state);
+ if (m_chainman.m_options.signals) {
+ m_chainman.m_options.signals->BlockChecked(blockConnecting, state);
+ }
if (!rv) {
if (state.IsInvalid())
InvalidBlockFound(pindexNew, state);
@@ -3187,11 +3217,11 @@ static bool NotifyHeaderTip(ChainstateManager& chainman) LOCKS_EXCLUDED(cs_main)
return fNotify;
}
-static void LimitValidationInterfaceQueue() LOCKS_EXCLUDED(cs_main) {
+static void LimitValidationInterfaceQueue(ValidationSignals& signals) LOCKS_EXCLUDED(cs_main) {
AssertLockNotHeld(cs_main);
- if (GetMainSignals().CallbacksPending() > 10) {
- SyncWithValidationInterfaceQueue();
+ if (signals.CallbacksPending() > 10) {
+ signals.SyncWithValidationInterfaceQueue();
}
}
@@ -3229,7 +3259,7 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
// Note that if a validationinterface callback ends up calling
// ActivateBestChain this may lead to a deadlock! We should
// probably have a DEBUG_LOCKORDER test for this in the future.
- LimitValidationInterfaceQueue();
+ if (m_chainman.m_options.signals) LimitValidationInterfaceQueue(*m_chainman.m_options.signals);
{
LOCK(cs_main);
@@ -3268,7 +3298,9 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
for (const PerBlockConnectTrace& trace : connectTrace.GetBlocksConnected()) {
assert(trace.pblock && trace.pindex);
- GetMainSignals().BlockConnected(this->GetRole(), trace.pblock, trace.pindex);
+ if (m_chainman.m_options.signals) {
+ m_chainman.m_options.signals->BlockConnected(this->GetRole(), trace.pblock, trace.pindex);
+ }
}
// This will have been toggled in
@@ -3294,7 +3326,9 @@ bool Chainstate::ActivateBestChain(BlockValidationState& state, std::shared_ptr<
// Enqueue while holding cs_main to ensure that UpdatedBlockTip is called in the order in which blocks are connected
if (this == &m_chainman.ActiveChainstate() && pindexFork != pindexNewTip) {
// Notify ValidationInterface subscribers
- GetMainSignals().UpdatedBlockTip(pindexNewTip, pindexFork, still_in_ibd);
+ if (m_chainman.m_options.signals) {
+ m_chainman.m_options.signals->UpdatedBlockTip(pindexNewTip, pindexFork, still_in_ibd);
+ }
// Always notify the UI if a new block tip was connected
if (kernel::IsInterrupted(m_chainman.GetNotifications().blockTip(GetSynchronizationState(still_in_ibd), *pindexNewTip))) {
@@ -3428,7 +3462,7 @@ bool Chainstate::InvalidateBlock(BlockValidationState& state, CBlockIndex* pinde
if (m_chainman.m_interrupt) break;
// Make sure the queue of validation callbacks doesn't grow unboundedly.
- LimitValidationInterfaceQueue();
+ if (m_chainman.m_options.signals) LimitValidationInterfaceQueue(*m_chainman.m_options.signals);
LOCK(cs_main);
// Lock for as long as disconnectpool is in scope to make sure MaybeUpdateMempoolForReorg is
@@ -3639,6 +3673,87 @@ static bool CheckBlockHeader(const CBlockHeader& block, BlockValidationState& st
return true;
}
+static bool CheckMerkleRoot(const CBlock& block, BlockValidationState& state)
+{
+ if (block.m_checked_merkle_root) return true;
+
+ bool mutated;
+ uint256 merkle_root = BlockMerkleRoot(block, &mutated);
+ if (block.hashMerkleRoot != merkle_root) {
+ return state.Invalid(
+ /*result=*/BlockValidationResult::BLOCK_MUTATED,
+ /*reject_reason=*/"bad-txnmrklroot",
+ /*debug_message=*/"hashMerkleRoot mismatch");
+ }
+
+ // Check for merkle tree malleability (CVE-2012-2459): repeating sequences
+ // of transactions in a block without affecting the merkle root of a block,
+ // while still invalidating it.
+ if (mutated) {
+ return state.Invalid(
+ /*result=*/BlockValidationResult::BLOCK_MUTATED,
+ /*reject_reason=*/"bad-txns-duplicate",
+ /*debug_message=*/"duplicate transaction");
+ }
+
+ block.m_checked_merkle_root = true;
+ return true;
+}
+
+/** CheckWitnessMalleation performs checks for block malleation with regard to
+ * its witnesses.
+ *
+ * Note: If the witness commitment is expected (i.e. `expect_witness_commitment
+ * = true`), then the block is required to have at least one transaction and the
+ * first transaction needs to have at least one input. */
+static bool CheckWitnessMalleation(const CBlock& block, bool expect_witness_commitment, BlockValidationState& state)
+{
+ if (expect_witness_commitment) {
+ if (block.m_checked_witness_commitment) return true;
+
+ int commitpos = GetWitnessCommitmentIndex(block);
+ if (commitpos != NO_WITNESS_COMMITMENT) {
+ assert(!block.vtx.empty() && !block.vtx[0]->vin.empty());
+ const auto& witness_stack{block.vtx[0]->vin[0].scriptWitness.stack};
+
+ if (witness_stack.size() != 1 || witness_stack[0].size() != 32) {
+ return state.Invalid(
+ /*result=*/BlockValidationResult::BLOCK_MUTATED,
+ /*reject_reason=*/"bad-witness-nonce-size",
+ /*debug_message=*/strprintf("%s : invalid witness reserved value size", __func__));
+ }
+
+ // The malleation check is ignored; as the transaction tree itself
+ // already does not permit it, it is impossible to trigger in the
+ // witness tree.
+ uint256 hash_witness = BlockWitnessMerkleRoot(block, /*mutated=*/nullptr);
+
+ CHash256().Write(hash_witness).Write(witness_stack[0]).Finalize(hash_witness);
+ if (memcmp(hash_witness.begin(), &block.vtx[0]->vout[commitpos].scriptPubKey[6], 32)) {
+ return state.Invalid(
+ /*result=*/BlockValidationResult::BLOCK_MUTATED,
+ /*reject_reason=*/"bad-witness-merkle-match",
+ /*debug_message=*/strprintf("%s : witness merkle commitment mismatch", __func__));
+ }
+
+ block.m_checked_witness_commitment = true;
+ return true;
+ }
+ }
+
+ // No witness data is allowed in blocks that don't commit to witness data, as this would otherwise leave room for spam
+ for (const auto& tx : block.vtx) {
+ if (tx->HasWitness()) {
+ return state.Invalid(
+ /*result=*/BlockValidationResult::BLOCK_MUTATED,
+ /*reject_reason=*/"unexpected-witness",
+ /*debug_message=*/strprintf("%s : unexpected witness data found", __func__));
+ }
+ }
+
+ return true;
+}
+
bool CheckBlock(const CBlock& block, BlockValidationState& state, const Consensus::Params& consensusParams, bool fCheckPOW, bool fCheckMerkleRoot)
{
// These are checks that are independent of context.
@@ -3657,17 +3772,8 @@ bool CheckBlock(const CBlock& block, BlockValidationState& state, const Consensu
}
// Check the merkle root.
- if (fCheckMerkleRoot) {
- bool mutated;
- uint256 hashMerkleRoot2 = BlockMerkleRoot(block, &mutated);
- if (block.hashMerkleRoot != hashMerkleRoot2)
- return state.Invalid(BlockValidationResult::BLOCK_MUTATED, "bad-txnmrklroot", "hashMerkleRoot mismatch");
-
- // Check for merkle tree malleability (CVE-2012-2459): repeating sequences
- // of transactions in a block without affecting the merkle root of a block,
- // while still invalidating it.
- if (mutated)
- return state.Invalid(BlockValidationResult::BLOCK_MUTATED, "bad-txns-duplicate", "duplicate transaction");
+ if (fCheckMerkleRoot && !CheckMerkleRoot(block, state)) {
+ return false;
}
// All potential-corruption validation must be done before we do any
@@ -3758,7 +3864,38 @@ bool HasValidProofOfWork(const std::vector<CBlockHeader>& headers, const Consens
[&](const auto& header) { return CheckProofOfWork(header.GetHash(), header.nBits, consensusParams);});
}
-arith_uint256 CalculateHeadersWork(const std::vector<CBlockHeader>& headers)
+bool IsBlockMutated(const CBlock& block, bool check_witness_root)
+{
+ BlockValidationState state;
+ if (!CheckMerkleRoot(block, state)) {
+ LogDebug(BCLog::VALIDATION, "Block mutated: %s\n", state.ToString());
+ return true;
+ }
+
+ if (block.vtx.empty() || !block.vtx[0]->IsCoinBase()) {
+ // Consider the block mutated if any transaction is 64 bytes in size (see 3.1
+ // in "Weaknesses in Bitcoin’s Merkle Root Construction":
+ // https://lists.linuxfoundation.org/pipermail/bitcoin-dev/attachments/20190225/a27d8837/attachment-0001.pdf).
+ //
+ // Note: This is not a consensus change as this only applies to blocks that
+ // don't have a coinbase transaction and would therefore already be invalid.
+ return std::any_of(block.vtx.begin(), block.vtx.end(),
+ [](auto& tx) { return GetSerializeSize(TX_NO_WITNESS(tx)) == 64; });
+ } else {
+ // Theoretically it is still possible for a block with a 64 byte
+ // coinbase transaction to be mutated but we neglect that possibility
+ // here as it requires at least 224 bits of work.
+ }
+
+ if (!CheckWitnessMalleation(block, check_witness_root, state)) {
+ LogDebug(BCLog::VALIDATION, "Block mutated: %s\n", state.ToString());
+ return true;
+ }
+
+ return false;
+}
+
+arith_uint256 CalculateClaimedHeadersWork(const std::vector<CBlockHeader>& headers)
{
arith_uint256 total_work{0};
for (const CBlockHeader& header : headers) {
@@ -3777,7 +3914,7 @@ arith_uint256 CalculateHeadersWork(const std::vector<CBlockHeader>& headers)
* in ConnectBlock().
* Note that -reindex-chainstate skips the validation that happens here!
*/
-static bool ContextualCheckBlockHeader(const CBlockHeader& block, BlockValidationState& state, BlockManager& blockman, const ChainstateManager& chainman, const CBlockIndex* pindexPrev, NodeClock::time_point now) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
+static bool ContextualCheckBlockHeader(const CBlockHeader& block, BlockValidationState& state, BlockManager& blockman, const ChainstateManager& chainman, const CBlockIndex* pindexPrev) EXCLUSIVE_LOCKS_REQUIRED(::cs_main)
{
AssertLockHeld(::cs_main);
assert(pindexPrev != nullptr);
@@ -3805,7 +3942,7 @@ static bool ContextualCheckBlockHeader(const CBlockHeader& block, BlockValidatio
return state.Invalid(BlockValidationResult::BLOCK_INVALID_HEADER, "time-too-old", "block's timestamp is too early");
// Check timestamp
- if (block.Time() > now + std::chrono::seconds{MAX_FUTURE_BLOCK_TIME}) {
+ if (block.Time() > NodeClock::now() + std::chrono::seconds{MAX_FUTURE_BLOCK_TIME}) {
return state.Invalid(BlockValidationResult::BLOCK_TIME_FUTURE, "time-too-new", "block timestamp too far in the future");
}
@@ -3866,33 +4003,8 @@ static bool ContextualCheckBlock(const CBlock& block, BlockValidationState& stat
// * There must be at least one output whose scriptPubKey is a single 36-byte push, the first 4 bytes of which are
// {0xaa, 0x21, 0xa9, 0xed}, and the following 32 bytes are SHA256^2(witness root, witness reserved value). In case there are
// multiple, the last one is used.
- bool fHaveWitness = false;
- if (DeploymentActiveAfter(pindexPrev, chainman, Consensus::DEPLOYMENT_SEGWIT)) {
- int commitpos = GetWitnessCommitmentIndex(block);
- if (commitpos != NO_WITNESS_COMMITMENT) {
- bool malleated = false;
- uint256 hashWitness = BlockWitnessMerkleRoot(block, &malleated);
- // The malleation check is ignored; as the transaction tree itself
- // already does not permit it, it is impossible to trigger in the
- // witness tree.
- if (block.vtx[0]->vin[0].scriptWitness.stack.size() != 1 || block.vtx[0]->vin[0].scriptWitness.stack[0].size() != 32) {
- return state.Invalid(BlockValidationResult::BLOCK_MUTATED, "bad-witness-nonce-size", strprintf("%s : invalid witness reserved value size", __func__));
- }
- CHash256().Write(hashWitness).Write(block.vtx[0]->vin[0].scriptWitness.stack[0]).Finalize(hashWitness);
- if (memcmp(hashWitness.begin(), &block.vtx[0]->vout[commitpos].scriptPubKey[6], 32)) {
- return state.Invalid(BlockValidationResult::BLOCK_MUTATED, "bad-witness-merkle-match", strprintf("%s : witness merkle commitment mismatch", __func__));
- }
- fHaveWitness = true;
- }
- }
-
- // No witness data is allowed in blocks that don't commit to witness data, as this would otherwise leave room for spam
- if (!fHaveWitness) {
- for (const auto& tx : block.vtx) {
- if (tx->HasWitness()) {
- return state.Invalid(BlockValidationResult::BLOCK_MUTATED, "unexpected-witness", strprintf("%s : unexpected witness data found", __func__));
- }
- }
+ if (!CheckWitnessMalleation(block, DeploymentActiveAfter(pindexPrev, chainman, Consensus::DEPLOYMENT_SEGWIT), state)) {
+ return false;
}
// After the coinbase witness reserved value and commitment are verified,
@@ -3945,7 +4057,7 @@ bool ChainstateManager::AcceptBlockHeader(const CBlockHeader& block, BlockValida
LogPrint(BCLog::VALIDATION, "header %s has prev block invalid: %s\n", hash.ToString(), block.hashPrevBlock.ToString());
return state.Invalid(BlockValidationResult::BLOCK_INVALID_PREV, "bad-prevblk");
}
- if (!ContextualCheckBlockHeader(block, state, m_blockman, *this, pindexPrev, m_options.adjusted_time_callback())) {
+ if (!ContextualCheckBlockHeader(block, state, m_blockman, *this, pindexPrev)) {
LogPrint(BCLog::VALIDATION, "%s: Consensus::ContextualCheckBlockHeader: %s, %s\n", __func__, hash.ToString(), state.ToString());
return false;
}
@@ -4136,8 +4248,9 @@ bool ChainstateManager::AcceptBlock(const std::shared_ptr<const CBlock>& pblock,
// Header is valid/has work, merkle tree and segwit merkle tree are good...RELAY NOW
// (but if it does not build on our best tip, let the SendMessages loop relay it)
- if (!IsInitialBlockDownload() && ActiveTip() == pindex->pprev)
- GetMainSignals().NewPoWValidBlock(pindex, pblock);
+ if (!IsInitialBlockDownload() && ActiveTip() == pindex->pprev && m_options.signals) {
+ m_options.signals->NewPoWValidBlock(pindex, pblock);
+ }
// Write block to history file
if (fNewBlock) *fNewBlock = true;
@@ -4190,7 +4303,9 @@ bool ChainstateManager::ProcessNewBlock(const std::shared_ptr<const CBlock>& blo
ret = AcceptBlock(block, state, &pindex, force_processing, nullptr, new_block, min_pow_checked);
}
if (!ret) {
- GetMainSignals().BlockChecked(*block, state);
+ if (m_options.signals) {
+ m_options.signals->BlockChecked(*block, state);
+ }
return error("%s: AcceptBlock FAILED (%s)", __func__, state.ToString());
}
}
@@ -4230,7 +4345,6 @@ bool TestBlockValidity(BlockValidationState& state,
Chainstate& chainstate,
const CBlock& block,
CBlockIndex* pindexPrev,
- const std::function<NodeClock::time_point()>& adjusted_time_callback,
bool fCheckPOW,
bool fCheckMerkleRoot)
{
@@ -4244,7 +4358,7 @@ bool TestBlockValidity(BlockValidationState& state,
indexDummy.phashBlock = &block_hash;
// NOTE: CheckBlockHeader is called by CheckBlock
- if (!ContextualCheckBlockHeader(block, state, chainstate.m_blockman, chainstate.m_chainman, pindexPrev, adjusted_time_callback()))
+ if (!ContextualCheckBlockHeader(block, state, chainstate.m_blockman, chainstate.m_chainman, pindexPrev))
return error("%s: Consensus::ContextualCheckBlockHeader: %s", __func__, state.ToString());
if (!CheckBlock(block, state, chainparams.GetConsensus(), fCheckPOW, fCheckMerkleRoot))
return error("%s: Consensus::CheckBlock: %s", __func__, state.ToString());
@@ -4862,14 +4976,6 @@ void ChainstateManager::CheckBlockIndex()
CBlockIndex* pindexFirstAssumeValid = nullptr; // Oldest ancestor of pindex which has BLOCK_ASSUMED_VALID
while (pindex != nullptr) {
nNodes++;
- // Make sure nChainTx sum is correctly computed.
- unsigned int prev_chain_tx = pindex->pprev ? pindex->pprev->nChainTx : 0;
- assert((pindex->nChainTx == pindex->nTx + prev_chain_tx)
- // For testing, allow transaction counts to be completely unset.
- || (pindex->nChainTx == 0 && pindex->nTx == 0)
- // For testing, allow this nChainTx to be unset if previous is also unset.
- || (pindex->nChainTx == 0 && prev_chain_tx == 0 && pindex->pprev));
-
if (pindexFirstAssumeValid == nullptr && pindex->nStatus & BLOCK_ASSUMED_VALID) pindexFirstAssumeValid = pindex;
if (pindexFirstInvalid == nullptr && pindex->nStatus & BLOCK_FAILED_VALID) pindexFirstInvalid = pindex;
if (pindexFirstMissing == nullptr && !(pindex->nStatus & BLOCK_HAVE_DATA)) {
@@ -4952,6 +5058,15 @@ void ChainstateManager::CheckBlockIndex()
// Checks for not-invalid blocks.
assert((pindex->nStatus & BLOCK_FAILED_MASK) == 0); // The failed mask cannot be set for blocks without invalid parents.
}
+ // Make sure nChainTx sum is correctly computed.
+ unsigned int prev_chain_tx = pindex->pprev ? pindex->pprev->nChainTx : 0;
+ assert((pindex->nChainTx == pindex->nTx + prev_chain_tx)
+ // Transaction may be completely unset - happens if only the header was accepted but the block hasn't been processed.
+ || (pindex->nChainTx == 0 && pindex->nTx == 0)
+ // nChainTx may be unset, but nTx set (if a block has been accepted, but one of its predecessors hasn't been processed yet)
+ || (pindex->nChainTx == 0 && prev_chain_tx == 0 && pindex->pprev)
+ // Transaction counts prior to snapshot are unknown.
+ || pindex->IsAssumedValid());
// Chainstate-specific checks on setBlockIndexCandidates
for (auto c : GetAll()) {
if (c->m_chain.Tip() == nullptr) continue;
@@ -5779,7 +5894,6 @@ static ChainstateManager::Options&& Flatten(ChainstateManager::Options&& opts)
if (!opts.check_block_index.has_value()) opts.check_block_index = opts.chainparams.DefaultConsistencyChecks();
if (!opts.minimum_chain_work.has_value()) opts.minimum_chain_work = UintToArith256(opts.chainparams.GetConsensus().nMinimumChainWork);
if (!opts.assumed_valid_block.has_value()) opts.assumed_valid_block = opts.chainparams.GetConsensus().defaultAssumeValid;
- Assert(opts.adjusted_time_callback);
return std::move(opts);
}
diff --git a/src/validation.h b/src/validation.h
index 093cecfcd1..71aac46f81 100644
--- a/src/validation.h
+++ b/src/validation.h
@@ -6,10 +6,6 @@
#ifndef BITCOIN_VALIDATION_H
#define BITCOIN_VALIDATION_H
-#if defined(HAVE_CONFIG_H)
-#include <config/bitcoin-config.h>
-#endif
-
#include <arith_uint256.h>
#include <attributes.h>
#include <chain.h>
@@ -377,15 +373,17 @@ bool TestBlockValidity(BlockValidationState& state,
Chainstate& chainstate,
const CBlock& block,
CBlockIndex* pindexPrev,
- const std::function<NodeClock::time_point()>& adjusted_time_callback,
bool fCheckPOW = true,
bool fCheckMerkleRoot = true) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
/** Check with the proof of work on each blockheader matches the value in nBits */
bool HasValidProofOfWork(const std::vector<CBlockHeader>& headers, const Consensus::Params& consensusParams);
-/** Return the sum of the work on a given set of headers */
-arith_uint256 CalculateHeadersWork(const std::vector<CBlockHeader>& headers);
+/** Check if a block has been mutated (with respect to its merkle root and witness commitments). */
+bool IsBlockMutated(const CBlock& block, bool check_witness_root);
+
+/** Return the sum of the claimed work on a given set of headers. No verification of PoW is done. */
+arith_uint256 CalculateClaimedHeadersWork(const std::vector<CBlockHeader>& headers);
enum class VerifyDBResult {
SUCCESS,
diff --git a/src/validationinterface.cpp b/src/validationinterface.cpp
index 5e944a7c47..813fde109c 100644
--- a/src/validationinterface.cpp
+++ b/src/validationinterface.cpp
@@ -5,7 +5,6 @@
#include <validationinterface.h>
-#include <attributes.h>
#include <chain.h>
#include <consensus/validation.h>
#include <kernel/chain.h>
@@ -13,7 +12,8 @@
#include <logging.h>
#include <primitives/block.h>
#include <primitives/transaction.h>
-#include <scheduler.h>
+#include <util/check.h>
+#include <util/task_runner.h>
#include <future>
#include <unordered_map>
@@ -22,14 +22,14 @@
std::string RemovalReasonToString(const MemPoolRemovalReason& r) noexcept;
/**
- * MainSignalsImpl manages a list of shared_ptr<CValidationInterface> callbacks.
+ * ValidationSignalsImpl manages a list of shared_ptr<CValidationInterface> callbacks.
*
* A std::unordered_map is used to track what callbacks are currently
* registered, and a std::list is used to store the callbacks that are
* currently registered as well as any callbacks that are just unregistered
* and about to be deleted when they are done executing.
*/
-class MainSignalsImpl
+class ValidationSignalsImpl
{
private:
Mutex m_mutex;
@@ -42,12 +42,10 @@ private:
std::unordered_map<CValidationInterface*, std::list<ListEntry>::iterator> m_map GUARDED_BY(m_mutex);
public:
- // We are not allowed to assume the scheduler only runs in one thread,
- // but must ensure all callbacks happen in-order, so we end up creating
- // our own queue here :(
- SingleThreadedSchedulerClient m_schedulerClient;
+ std::unique_ptr<util::TaskRunnerInterface> m_task_runner;
- explicit MainSignalsImpl(CScheduler& scheduler LIFETIMEBOUND) : m_schedulerClient(scheduler) {}
+ explicit ValidationSignalsImpl(std::unique_ptr<util::TaskRunnerInterface> task_runner)
+ : m_task_runner{std::move(Assert(task_runner))} {}
void Register(std::shared_ptr<CValidationInterface> callbacks) EXCLUSIVE_LOCKS_REQUIRED(!m_mutex)
{
@@ -94,77 +92,56 @@ public:
}
};
-static CMainSignals g_signals;
+ValidationSignals::ValidationSignals(std::unique_ptr<util::TaskRunnerInterface> task_runner)
+ : m_internals{std::make_unique<ValidationSignalsImpl>(std::move(task_runner))} {}
-void CMainSignals::RegisterBackgroundSignalScheduler(CScheduler& scheduler)
-{
- assert(!m_internals);
- m_internals = std::make_unique<MainSignalsImpl>(scheduler);
-}
-
-void CMainSignals::UnregisterBackgroundSignalScheduler()
-{
- m_internals.reset(nullptr);
-}
+ValidationSignals::~ValidationSignals() {}
-void CMainSignals::FlushBackgroundCallbacks()
+void ValidationSignals::FlushBackgroundCallbacks()
{
- if (m_internals) {
- m_internals->m_schedulerClient.EmptyQueue();
- }
+ m_internals->m_task_runner->flush();
}
-size_t CMainSignals::CallbacksPending()
+size_t ValidationSignals::CallbacksPending()
{
- if (!m_internals) return 0;
- return m_internals->m_schedulerClient.CallbacksPending();
+ return m_internals->m_task_runner->size();
}
-CMainSignals& GetMainSignals()
-{
- return g_signals;
-}
-
-void RegisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks)
+void ValidationSignals::RegisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks)
{
// Each connection captures the shared_ptr to ensure that each callback is
// executed before the subscriber is destroyed. For more details see #18338.
- g_signals.m_internals->Register(std::move(callbacks));
+ m_internals->Register(std::move(callbacks));
}
-void RegisterValidationInterface(CValidationInterface* callbacks)
+void ValidationSignals::RegisterValidationInterface(CValidationInterface* callbacks)
{
// Create a shared_ptr with a no-op deleter - CValidationInterface lifecycle
// is managed by the caller.
RegisterSharedValidationInterface({callbacks, [](CValidationInterface*){}});
}
-void UnregisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks)
+void ValidationSignals::UnregisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks)
{
UnregisterValidationInterface(callbacks.get());
}
-void UnregisterValidationInterface(CValidationInterface* callbacks)
+void ValidationSignals::UnregisterValidationInterface(CValidationInterface* callbacks)
{
- if (g_signals.m_internals) {
- g_signals.m_internals->Unregister(callbacks);
- }
+ m_internals->Unregister(callbacks);
}
-void UnregisterAllValidationInterfaces()
+void ValidationSignals::UnregisterAllValidationInterfaces()
{
- if (!g_signals.m_internals) {
- return;
- }
- g_signals.m_internals->Clear();
+ m_internals->Clear();
}
-void CallFunctionInValidationInterfaceQueue(std::function<void()> func)
+void ValidationSignals::CallFunctionInValidationInterfaceQueue(std::function<void()> func)
{
- g_signals.m_internals->m_schedulerClient.AddToProcessQueue(std::move(func));
+ m_internals->m_task_runner->insert(std::move(func));
}
-void SyncWithValidationInterfaceQueue()
+void ValidationSignals::SyncWithValidationInterfaceQueue()
{
AssertLockNotHeld(cs_main);
// Block until the validation queue drains
@@ -183,7 +160,7 @@ void SyncWithValidationInterfaceQueue()
do { \
auto local_name = (name); \
LOG_EVENT("Enqueuing " fmt, local_name, __VA_ARGS__); \
- m_internals->m_schedulerClient.AddToProcessQueue([=] { \
+ m_internals->m_task_runner->insert([=] { \
LOG_EVENT(fmt, local_name, __VA_ARGS__); \
event(); \
}); \
@@ -192,7 +169,7 @@ void SyncWithValidationInterfaceQueue()
#define LOG_EVENT(fmt, ...) \
LogPrint(BCLog::VALIDATION, fmt "\n", __VA_ARGS__)
-void CMainSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
+void ValidationSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {
// Dependencies exist that require UpdatedBlockTip events to be delivered in the order in which
// the chain actually updates. One way to ensure this is for the caller to invoke this signal
// in the same critical section where the chain is updated
@@ -206,7 +183,7 @@ void CMainSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockInd
fInitialDownload);
}
-void CMainSignals::TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t mempool_sequence)
+void ValidationSignals::TransactionAddedToMempool(const NewMempoolTransactionInfo& tx, uint64_t mempool_sequence)
{
auto event = [tx, mempool_sequence, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.TransactionAddedToMempool(tx, mempool_sequence); });
@@ -216,7 +193,7 @@ void CMainSignals::TransactionAddedToMempool(const NewMempoolTransactionInfo& tx
tx.info.m_tx->GetWitnessHash().ToString());
}
-void CMainSignals::TransactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason, uint64_t mempool_sequence) {
+void ValidationSignals::TransactionRemovedFromMempool(const CTransactionRef& tx, MemPoolRemovalReason reason, uint64_t mempool_sequence) {
auto event = [tx, reason, mempool_sequence, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.TransactionRemovedFromMempool(tx, reason, mempool_sequence); });
};
@@ -226,7 +203,7 @@ void CMainSignals::TransactionRemovedFromMempool(const CTransactionRef& tx, MemP
RemovalReasonToString(reason));
}
-void CMainSignals::BlockConnected(ChainstateRole role, const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex) {
+void ValidationSignals::BlockConnected(ChainstateRole role, const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex) {
auto event = [role, pblock, pindex, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.BlockConnected(role, pblock, pindex); });
};
@@ -235,7 +212,7 @@ void CMainSignals::BlockConnected(ChainstateRole role, const std::shared_ptr<con
pindex->nHeight);
}
-void CMainSignals::MempoolTransactionsRemovedForBlock(const std::vector<RemovedMempoolTransactionInfo>& txs_removed_for_block, unsigned int nBlockHeight)
+void ValidationSignals::MempoolTransactionsRemovedForBlock(const std::vector<RemovedMempoolTransactionInfo>& txs_removed_for_block, unsigned int nBlockHeight)
{
auto event = [txs_removed_for_block, nBlockHeight, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.MempoolTransactionsRemovedForBlock(txs_removed_for_block, nBlockHeight); });
@@ -245,7 +222,7 @@ void CMainSignals::MempoolTransactionsRemovedForBlock(const std::vector<RemovedM
txs_removed_for_block.size());
}
-void CMainSignals::BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex)
+void ValidationSignals::BlockDisconnected(const std::shared_ptr<const CBlock>& pblock, const CBlockIndex* pindex)
{
auto event = [pblock, pindex, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.BlockDisconnected(pblock, pindex); });
@@ -255,7 +232,7 @@ void CMainSignals::BlockDisconnected(const std::shared_ptr<const CBlock>& pblock
pindex->nHeight);
}
-void CMainSignals::ChainStateFlushed(ChainstateRole role, const CBlockLocator &locator) {
+void ValidationSignals::ChainStateFlushed(ChainstateRole role, const CBlockLocator &locator) {
auto event = [role, locator, this] {
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.ChainStateFlushed(role, locator); });
};
@@ -263,13 +240,13 @@ void CMainSignals::ChainStateFlushed(ChainstateRole role, const CBlockLocator &l
locator.IsNull() ? "null" : locator.vHave.front().ToString());
}
-void CMainSignals::BlockChecked(const CBlock& block, const BlockValidationState& state) {
+void ValidationSignals::BlockChecked(const CBlock& block, const BlockValidationState& state) {
LOG_EVENT("%s: block hash=%s state=%s", __func__,
block.GetHash().ToString(), state.ToString());
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.BlockChecked(block, state); });
}
-void CMainSignals::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock> &block) {
+void ValidationSignals::NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock> &block) {
LOG_EVENT("%s: block hash=%s", __func__, block->GetHash().ToString());
m_internals->Iterate([&](CValidationInterface& callbacks) { callbacks.NewPoWValidBlock(pindex, block); });
}
diff --git a/src/validationinterface.h b/src/validationinterface.h
index e1d6869fab..6f49a73c93 100644
--- a/src/validationinterface.h
+++ b/src/validationinterface.h
@@ -6,61 +6,29 @@
#ifndef BITCOIN_VALIDATIONINTERFACE_H
#define BITCOIN_VALIDATIONINTERFACE_H
-#include <kernel/cs_main.h>
#include <kernel/chain.h>
+#include <kernel/cs_main.h>
#include <primitives/transaction.h> // CTransaction(Ref)
#include <sync.h>
+#include <cstddef>
+#include <cstdint>
#include <functional>
#include <memory>
+#include <vector>
+
+namespace util {
+class TaskRunnerInterface;
+} // namespace util
class BlockValidationState;
class CBlock;
class CBlockIndex;
struct CBlockLocator;
-class CValidationInterface;
-class CScheduler;
enum class MemPoolRemovalReason;
struct RemovedMempoolTransactionInfo;
struct NewMempoolTransactionInfo;
-/** Register subscriber */
-void RegisterValidationInterface(CValidationInterface* callbacks);
-/** Unregister subscriber. DEPRECATED. This is not safe to use when the RPC server or main message handler thread is running. */
-void UnregisterValidationInterface(CValidationInterface* callbacks);
-/** Unregister all subscribers */
-void UnregisterAllValidationInterfaces();
-
-// Alternate registration functions that release a shared_ptr after the last
-// notification is sent. These are useful for race-free cleanup, since
-// unregistration is nonblocking and can return before the last notification is
-// processed.
-/** Register subscriber */
-void RegisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks);
-/** Unregister subscriber */
-void UnregisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks);
-
-/**
- * Pushes a function to callback onto the notification queue, guaranteeing any
- * callbacks generated prior to now are finished when the function is called.
- *
- * Be very careful blocking on func to be called if any locks are held -
- * validation interface clients may not be able to make progress as they often
- * wait for things like cs_main, so blocking until func is called with cs_main
- * will result in a deadlock (that DEBUG_LOCKORDER will miss).
- */
-void CallFunctionInValidationInterfaceQueue(std::function<void ()> func);
-/**
- * This is a synonym for the following, which asserts certain locks are not
- * held:
- * std::promise<void> promise;
- * CallFunctionInValidationInterfaceQueue([&promise] {
- * promise.set_value();
- * });
- * promise.get_future().wait();
- */
-void SyncWithValidationInterfaceQueue() LOCKS_EXCLUDED(cs_main);
-
/**
* Implement this to subscribe to events generated in validation and mempool
*
@@ -150,7 +118,7 @@ protected:
virtual void BlockConnected(ChainstateRole role, const std::shared_ptr<const CBlock> &block, const CBlockIndex *pindex) {}
/**
* Notifies listeners of a block being disconnected
- * Provides the block that was connected.
+ * Provides the block that was disconnected.
*
* Called on a background thread. Only called for the active chainstate, since
* background chainstates should never disconnect blocks.
@@ -185,30 +153,65 @@ protected:
* has been received and connected to the headers tree, though not validated yet.
*/
virtual void NewPoWValidBlock(const CBlockIndex *pindex, const std::shared_ptr<const CBlock>& block) {};
- friend class CMainSignals;
+ friend class ValidationSignals;
friend class ValidationInterfaceTest;
};
-class MainSignalsImpl;
-class CMainSignals {
+class ValidationSignalsImpl;
+class ValidationSignals {
private:
- std::unique_ptr<MainSignalsImpl> m_internals;
-
- friend void ::RegisterSharedValidationInterface(std::shared_ptr<CValidationInterface>);
- friend void ::UnregisterValidationInterface(CValidationInterface*);
- friend void ::UnregisterAllValidationInterfaces();
- friend void ::CallFunctionInValidationInterfaceQueue(std::function<void ()> func);
+ std::unique_ptr<ValidationSignalsImpl> m_internals;
public:
- /** Register a CScheduler to give callbacks which should run in the background (may only be called once) */
- void RegisterBackgroundSignalScheduler(CScheduler& scheduler);
- /** Unregister a CScheduler to give callbacks which should run in the background - these callbacks will now be dropped! */
- void UnregisterBackgroundSignalScheduler();
+ // The task runner will block validation if it calls its insert method's
+ // func argument synchronously. In this class func contains a loop that
+ // dispatches a single validation event to all subscribers sequentially.
+ explicit ValidationSignals(std::unique_ptr<util::TaskRunnerInterface> task_runner);
+
+ ~ValidationSignals();
+
/** Call any remaining callbacks on the calling thread */
void FlushBackgroundCallbacks();
size_t CallbacksPending();
+ /** Register subscriber */
+ void RegisterValidationInterface(CValidationInterface* callbacks);
+ /** Unregister subscriber. DEPRECATED. This is not safe to use when the RPC server or main message handler thread is running. */
+ void UnregisterValidationInterface(CValidationInterface* callbacks);
+ /** Unregister all subscribers */
+ void UnregisterAllValidationInterfaces();
+
+ // Alternate registration functions that release a shared_ptr after the last
+ // notification is sent. These are useful for race-free cleanup, since
+ // unregistration is nonblocking and can return before the last notification is
+ // processed.
+ /** Register subscriber */
+ void RegisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks);
+ /** Unregister subscriber */
+ void UnregisterSharedValidationInterface(std::shared_ptr<CValidationInterface> callbacks);
+
+ /**
+ * Pushes a function to callback onto the notification queue, guaranteeing any
+ * callbacks generated prior to now are finished when the function is called.
+ *
+ * Be very careful blocking on func to be called if any locks are held -
+ * validation interface clients may not be able to make progress as they often
+ * wait for things like cs_main, so blocking until func is called with cs_main
+ * will result in a deadlock (that DEBUG_LOCKORDER will miss).
+ */
+ void CallFunctionInValidationInterfaceQueue(std::function<void ()> func);
+
+ /**
+ * This is a synonym for the following, which asserts certain locks are not
+ * held:
+ * std::promise<void> promise;
+ * CallFunctionInValidationInterfaceQueue([&promise] {
+ * promise.set_value();
+ * });
+ * promise.get_future().wait();
+ */
+ void SyncWithValidationInterfaceQueue() LOCKS_EXCLUDED(cs_main);
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload);
void TransactionAddedToMempool(const NewMempoolTransactionInfo&, uint64_t mempool_sequence);
@@ -221,6 +224,4 @@ public:
void NewPoWValidBlock(const CBlockIndex *, const std::shared_ptr<const CBlock>&);
};
-CMainSignals& GetMainSignals();
-
#endif // BITCOIN_VALIDATIONINTERFACE_H
diff --git a/src/wallet/bdb.cpp b/src/wallet/bdb.cpp
index cbf6c9b1ea..38cca32f80 100644
--- a/src/wallet/bdb.cpp
+++ b/src/wallet/bdb.cpp
@@ -887,7 +887,12 @@ bool BerkeleyBatch::HasKey(DataStream&& key)
bool BerkeleyBatch::ErasePrefix(Span<const std::byte> prefix)
{
- if (!TxnBegin()) return false;
+ // Because this function erases records one by one, ensure that it is executed within a txn context.
+ // Otherwise, consistency is at risk; it's possible that certain records are removed while others
+ // remain due to an internal failure during the procedure.
+ // Additionally, the Dbc::del() cursor delete call below would fail without an active transaction.
+ if (!Assume(activeTxn)) return false;
+
auto cursor{std::make_unique<BerkeleyCursor>(m_database, *this)};
// const_cast is safe below even though prefix_key is an in/out parameter,
// because we are not using the DB_DBT_USERMEM flag, so BDB will allocate
@@ -901,7 +906,7 @@ bool BerkeleyBatch::ErasePrefix(Span<const std::byte> prefix)
ret = cursor->dbc()->del(0);
}
cursor.reset();
- return TxnCommit() && (ret == 0 || ret == DB_NOTFOUND);
+ return ret == 0 || ret == DB_NOTFOUND;
}
void BerkeleyDatabase::AddRef()
diff --git a/src/wallet/coinselection.cpp b/src/wallet/coinselection.cpp
index 391e120932..42615b5d42 100644
--- a/src/wallet/coinselection.cpp
+++ b/src/wallet/coinselection.cpp
@@ -25,14 +25,30 @@ static util::Result<SelectionResult> ErrorMaxWeightExceeded()
"Please try sending a smaller amount or manually consolidating your wallet's UTXOs")};
}
-// Descending order comparator
+// Sort by descending (effective) value prefer lower waste on tie
struct {
bool operator()(const OutputGroup& a, const OutputGroup& b) const
{
+ if (a.GetSelectionAmount() == b.GetSelectionAmount()) {
+ // Lower waste is better when effective_values are tied
+ return (a.fee - a.long_term_fee) < (b.fee - b.long_term_fee);
+ }
return a.GetSelectionAmount() > b.GetSelectionAmount();
}
} descending;
+// Sort by descending (effective) value prefer lower weight on tie
+struct {
+ bool operator()(const OutputGroup& a, const OutputGroup& b) const
+ {
+ if (a.GetSelectionAmount() == b.GetSelectionAmount()) {
+ // Sort lower weight to front on tied effective_value
+ return a.m_weight < b.m_weight;
+ }
+ return a.GetSelectionAmount() > b.GetSelectionAmount();
+ }
+} descending_effval_weight;
+
/*
* This is the Branch and Bound Coin Selection algorithm designed by Murch. It searches for an input
* set that can pay for the spending target and does not exceed the spending target by more than the
@@ -68,6 +84,7 @@ struct {
* bound of the range.
* @param const CAmount& cost_of_change This is the cost of creating and spending a change output.
* This plus selection_target is the upper bound of the range.
+ * @param int max_weight The maximum weight available for the input set.
* @returns The result of this coin selection algorithm, or std::nullopt
*/
@@ -183,6 +200,331 @@ util::Result<SelectionResult> SelectCoinsBnB(std::vector<OutputGroup>& utxo_pool
return result;
}
+/*
+ * TL;DR: Coin Grinder is a DFS-based algorithm that deterministically searches for the minimum-weight input set to fund
+ * the transaction. The algorithm is similar to the Branch and Bound algorithm, but will produce a transaction _with_ a
+ * change output instead of a changeless transaction.
+ *
+ * Full description: CoinGrinder can be thought of as a graph walking algorithm. It explores a binary tree
+ * representation of the powerset of the UTXO pool. Each node in the tree represents a candidate input set. The tree’s
+ * root is the empty set. Each node in the tree has two children which are formed by either adding or skipping the next
+ * UTXO ("inclusion/omission branch"). Each level in the tree after the root corresponds to a decision about one UTXO in
+ * the UTXO pool.
+ *
+ * Example:
+ * We represent UTXOs as _alias=[effective_value/weight]_ and indicate omitted UTXOs with an underscore. Given a UTXO
+ * pool {A=[10/2], B=[7/1], C=[5/1], D=[4/2]} sorted by descending effective value, our search tree looks as follows:
+ *
+ * _______________________ {} ________________________
+ * / \
+ * A=[10/2] __________ {A} _________ __________ {_} _________
+ * / \ / \
+ * B=[7/1] {AB} _ {A_} _ {_B} _ {__} _
+ * / \ / \ / \ / \
+ * C=[5/1] {ABC} {AB_} {A_C} {A__} {_BC} {_B_} {__C} {___}
+ * / \ / \ / \ / \ / \ / \ / \ / \
+ * D=[4/2] {ABCD} {ABC_} {AB_D} {AB__} {A_CD} {A_C_} {A__D} {A___} {_BCD} {_BC_} {_B_D} {_B__} {__CD} {__C_} {___D} {____}
+ *
+ *
+ * CoinGrinder uses a depth-first search to walk this tree. It first tries inclusion branches, then omission branches. A
+ * naive exploration of a tree with four UTXOs requires visiting all 31 nodes:
+ *
+ * {} {A} {AB} {ABC} {ABCD} {ABC_} {AB_} {AB_D} {AB__} {A_} {A_C} {A_CD} {A_C_} {A__} {A__D} {A___} {_} {_B} {_BC}
+ * {_BCD} {_BC_} {_B_} {_B_D} {_B__} {__} {__C} {__CD} {__C} {___} {___D} {____}
+ *
+ * As powersets grow exponentially with the set size, walking the entire tree would quickly get computationally
+ * infeasible with growing UTXO pools. Thanks to traversing the tree in a deterministic order, we can keep track of the
+ * progress of the search solely on basis of the current selection (and the best selection so far). We visit as few
+ * nodes as possible by recognizing and skipping any branches that can only contain solutions worse than the best
+ * solution so far. This makes CoinGrinder a branch-and-bound algorithm
+ * (https://en.wikipedia.org/wiki/Branch_and_bound).
+ * CoinGrinder is searching for the input set with lowest weight that can fund a transaction, so for example we can only
+ * ever find a _better_ candidate input set in a node that adds a UTXO, but never in a node that skips a UTXO. After
+ * visiting {A} and exploring the inclusion branch {AB} and its descendants, the candidate input set in the omission
+ * branch {A_} is equivalent to the parent {A} in effective value and weight. While CoinGrinder does need to visit the
+ * descendants of the omission branch {A_}, it is unnecessary to evaluate the candidate input set in the omission branch
+ * itself. By skipping evaluation of all nodes on an omission branch we reduce the visited nodes to 15:
+ *
+ * {A} {AB} {ABC} {ABCD} {AB_D} {A_C} {A_CD} {A__D} {_B} {_BC} {_BCD} {_B_D} {__C} {__CD} {___D}
+ *
+ * _______________________ {} ________________________
+ * / \
+ * A=[10/2] __________ {A} _________ ___________\____________
+ * / \ / \
+ * B=[7/1] {AB} __ __\_____ {_B} __ __\_____
+ * / \ / \ / \ / \
+ * C=[5/1] {ABC} \ {A_C} \ {_BC} \ {__C} \
+ * / / / / / / / /
+ * D=[4/2] {ABCD} {AB_D} {A_CD} {A__D} {_BCD} {_B_D} {__CD} {___D}
+ *
+ *
+ * We refer to the move from the inclusion branch {AB} via the omission branch {A_} to its inclusion-branch child {A_C}
+ * as _shifting to the omission branch_ or just _SHIFT_. (The index of the ultimate element in the candidate input set
+ * shifts right by one: {AB} ⇒ {A_C}.)
+ * When we reach a leaf node in the last level of the tree, shifting to the omission branch is not possible. Instead we
+ * go to the omission branch of the node’s last ancestor on an inclusion branch: from {ABCD}, we go to {AB_D}. From
+ * {AB_D}, we go to {A_C}. We refer to this operation as a _CUT_. (The ultimate element in
+ * the input set is deselected, and the penultimate element is shifted right by one: {AB_D} ⇒ {A_C}.)
+ * If a candidate input set in a node has not selected sufficient funds to build the transaction, we continue directly
+ * along the next inclusion branch. We call this operation _EXPLORE_. (We go from one inclusion branch to the next
+ * inclusion branch: {_B} ⇒ {_BC}.)
+ * Further, any prefix that already has selected sufficient effective value to fund the transaction cannot be improved
+ * by adding more UTXOs. If for example the candidate input set in {AB} is a valid solution, all potential descendant
+ * solutions {ABC}, {ABCD}, and {AB_D} must have a higher weight, thus instead of exploring the descendants of {AB}, we
+ * can SHIFT from {AB} to {A_C}.
+ *
+ * Given the above UTXO set, using a target of 11, and following these initial observations, the basic implementation of
+ * CoinGrinder visits the following 10 nodes:
+ *
+ * Node [eff_val/weight] Evaluation
+ * ---------------------------------------------------------------
+ * {A} [10/2] Insufficient funds: EXPLORE
+ * {AB} [17/3] Solution: SHIFT to omission branch
+ * {A_C} [15/3] Better solution: SHIFT to omission branch
+ * {A__D} [14/4] Worse solution, shift impossible due to leaf node: CUT to omission branch of {A__D},
+ * i.e. SHIFT to omission branch of {A}
+ * {_B} [7/1] Insufficient funds: EXPLORE
+ * {_BC} [12/2] Better solution: SHIFT to omission branch
+ * {_B_D} [11/3] Worse solution, shift impossible due to leaf node: CUT to omission branch of {_B_D},
+ * i.e. SHIFT to omission branch of {_B}
+ * {__C} [5/1] Insufficient funds: EXPLORE
+ * {__CD} [9/3] Insufficient funds, leaf node: CUT
+ * {___D} [4/2] Insufficient funds, leaf node, cannot CUT since only one UTXO selected: done.
+ *
+ * _______________________ {} ________________________
+ * / \
+ * A=[10/2] __________ {A} _________ ___________\____________
+ * / \ / \
+ * B=[7/1] {AB} __\_____ {_B} __ __\_____
+ * / \ / \ / \
+ * C=[5/1] {A_C} \ {_BC} \ {__C} \
+ * / / / /
+ * D=[4/2] {A__D} {_B_D} {__CD} {___D}
+ *
+ *
+ * We implement this tree walk in the following algorithm:
+ * 1. Add `next_utxo`
+ * 2. Evaluate candidate input set
+ * 3. Determine `next_utxo` by deciding whether to
+ * a) EXPLORE: Add next inclusion branch, e.g. {_B} ⇒ {_B} + `next_uxto`: C
+ * b) SHIFT: Replace last selected UTXO by next higher index, e.g. {A_C} ⇒ {A__} + `next_utxo`: D
+ * c) CUT: deselect last selected UTXO and shift to omission branch of penultimate UTXO, e.g. {AB_D} ⇒ {A_} + `next_utxo: C
+ *
+ * The implementation then adds further optimizations by discovering further situations in which either the inclusion
+ * branch can be skipped, or both the inclusion and omission branch can be skipped after evaluating the candidate input
+ * set in the node.
+ *
+ * @param std::vector<OutputGroup>& utxo_pool The UTXOs that we are choosing from. These UTXOs will be sorted in
+ * descending order by effective value, with lower weight preferred as a tie-breaker. (We can think of an output
+ * group with multiple as a heavier UTXO with the combined amount here.)
+ * @param const CAmount& selection_target This is the minimum amount that we need for the transaction without considering change.
+ * @param const CAmount& change_target The minimum budget for creating a change output, by which we increase the selection_target.
+ * @param int max_weight The maximum permitted weight for the input set.
+ * @returns The result of this coin selection algorithm, or std::nullopt
+ */
+util::Result<SelectionResult> CoinGrinder(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, CAmount change_target, int max_weight)
+{
+ std::sort(utxo_pool.begin(), utxo_pool.end(), descending_effval_weight);
+ // The sum of UTXO amounts after this UTXO index, e.g. lookahead[5] = Σ(UTXO[6+].amount)
+ std::vector<CAmount> lookahead(utxo_pool.size());
+ // The minimum UTXO weight among the remaining UTXOs after this UTXO index, e.g. min_tail_weight[5] = min(UTXO[6+].weight)
+ std::vector<int> min_tail_weight(utxo_pool.size());
+
+ // Calculate lookahead values, min_tail_weights, and check that there are sufficient funds
+ CAmount total_available = 0;
+ int min_group_weight = std::numeric_limits<int>::max();
+ for (size_t i = 0; i < utxo_pool.size(); ++i) {
+ size_t index = utxo_pool.size() - 1 - i; // Loop over every element in reverse order
+ lookahead[index] = total_available;
+ min_tail_weight[index] = min_group_weight;
+ // UTXOs with non-positive effective value must have been filtered
+ Assume(utxo_pool[index].GetSelectionAmount() > 0);
+ total_available += utxo_pool[index].GetSelectionAmount();
+ min_group_weight = std::min(min_group_weight, utxo_pool[index].m_weight);
+ }
+
+ const CAmount total_target = selection_target + change_target;
+ if (total_available < total_target) {
+ // Insufficient funds
+ return util::Error();
+ }
+
+ // The current selection and the best input set found so far, stored as the utxo_pool indices of the UTXOs forming them
+ std::vector<size_t> curr_selection;
+ std::vector<size_t> best_selection;
+
+ // The currently selected effective amount, and the effective amount of the best selection so far
+ CAmount curr_amount = 0;
+ CAmount best_selection_amount = MAX_MONEY;
+
+ // The weight of the currently selected input set, and the weight of the best selection
+ int curr_weight = 0;
+ int best_selection_weight = max_weight; // Tie is fine, because we prefer lower selection amount
+
+ // Whether the input sets generated during this search have exceeded the maximum transaction weight at any point
+ bool max_tx_weight_exceeded = false;
+
+ // Index of the next UTXO to consider in utxo_pool
+ size_t next_utxo = 0;
+
+ /*
+ * You can think of the current selection as a vector of booleans that has decided inclusion or exclusion of all
+ * UTXOs before `next_utxo`. When we consider the next UTXO, we extend this hypothetical boolean vector either with
+ * a true value if the UTXO is included or a false value if it is omitted. The equivalent state is stored more
+ * compactly as the list of indices of the included UTXOs and the `next_utxo` index.
+ *
+ * We can never find a new solution by deselecting a UTXO, because we then revisit a previously evaluated
+ * selection. Therefore, we only need to check whether we found a new solution _after adding_ a new UTXO.
+ *
+ * Each iteration of CoinGrinder starts by selecting the `next_utxo` and evaluating the current selection. We
+ * use three state transitions to progress from the current selection to the next promising selection:
+ *
+ * - EXPLORE inclusion branch: We do not have sufficient funds, yet. Add `next_utxo` to the current selection, then
+ * nominate the direct successor of the just selected UTXO as our `next_utxo` for the
+ * following iteration.
+ *
+ * Example:
+ * Current Selection: {0, 5, 7}
+ * Evaluation: EXPLORE, next_utxo: 8
+ * Next Selection: {0, 5, 7, 8}
+ *
+ * - SHIFT to omission branch: Adding more UTXOs to the current selection cannot produce a solution that is better
+ * than the current best, e.g. the current selection weight exceeds the max weight or
+ * the current selection amount is equal to or greater than the target.
+ * We designate our `next_utxo` the one after the tail of our current selection, then
+ * deselect the tail of our current selection.
+ *
+ * Example:
+ * Current Selection: {0, 5, 7}
+ * Evaluation: SHIFT, next_utxo: 8, omit last selected: {0, 5}
+ * Next Selection: {0, 5, 8}
+ *
+ * - CUT entire subtree: We have exhausted the inclusion branch for the penultimately selected UTXO, both the
+ * inclusion and the omission branch of the current prefix are barren. E.g. we have
+ * reached the end of the UTXO pool, so neither further EXPLORING nor SHIFTING can find
+ * any solutions. We designate our `next_utxo` the one after our penultimate selected,
+ * then deselect both the last and penultimate selected.
+ *
+ * Example:
+ * Current Selection: {0, 5, 7}
+ * Evaluation: CUT, next_utxo: 6, omit two last selected: {0}
+ * Next Selection: {0, 6}
+ */
+ auto deselect_last = [&]() {
+ OutputGroup& utxo = utxo_pool[curr_selection.back()];
+ curr_amount -= utxo.GetSelectionAmount();
+ curr_weight -= utxo.m_weight;
+ curr_selection.pop_back();
+ };
+
+ SelectionResult result(selection_target, SelectionAlgorithm::CG);
+ bool is_done = false;
+ size_t curr_try = 0;
+ while (!is_done) {
+ bool should_shift{false}, should_cut{false};
+ // Select `next_utxo`
+ OutputGroup& utxo = utxo_pool[next_utxo];
+ curr_amount += utxo.GetSelectionAmount();
+ curr_weight += utxo.m_weight;
+ curr_selection.push_back(next_utxo);
+ ++next_utxo;
+ ++curr_try;
+
+ // EVALUATE current selection: check for solutions and see whether we can CUT or SHIFT before EXPLORING further
+ auto curr_tail = curr_selection.back();
+ if (curr_amount + lookahead[curr_tail] < total_target) {
+ // Insufficient funds with lookahead: CUT
+ should_cut = true;
+ } else if (curr_weight > best_selection_weight) {
+ // best_selection_weight is initialized to max_weight
+ if (curr_weight > max_weight) max_tx_weight_exceeded = true;
+ // Worse weight than best solution. More UTXOs only increase weight:
+ // CUT if last selected group had minimal weight, else SHIFT
+ if (utxo_pool[curr_tail].m_weight <= min_tail_weight[curr_tail]) {
+ should_cut = true;
+ } else {
+ should_shift = true;
+ }
+ } else if (curr_amount >= total_target) {
+ // Success, adding more weight cannot be better: SHIFT
+ should_shift = true;
+ if (curr_weight < best_selection_weight || (curr_weight == best_selection_weight && curr_amount < best_selection_amount)) {
+ // New lowest weight, or same weight with fewer funds tied up
+ best_selection = curr_selection;
+ best_selection_weight = curr_weight;
+ best_selection_amount = curr_amount;
+ }
+ } else if (!best_selection.empty() && curr_weight + int64_t{min_tail_weight[curr_tail]} * ((total_target - curr_amount + utxo_pool[curr_tail].GetSelectionAmount() - 1) / utxo_pool[curr_tail].GetSelectionAmount()) > best_selection_weight) {
+ // Compare minimal tail weight and last selected amount with the amount missing to gauge whether a better weight is still possible.
+ if (utxo_pool[curr_tail].m_weight <= min_tail_weight[curr_tail]) {
+ should_cut = true;
+ } else {
+ should_shift = true;
+ }
+ }
+
+ if (curr_try >= TOTAL_TRIES) {
+ // Solution is not guaranteed to be optimal if `curr_try` hit TOTAL_TRIES
+ result.SetAlgoCompleted(false);
+ break;
+ }
+
+ if (next_utxo == utxo_pool.size()) {
+ // Last added UTXO was end of UTXO pool, nothing left to add on inclusion or omission branch: CUT
+ should_cut = true;
+ }
+
+ if (should_cut) {
+ // Neither adding to the current selection nor exploring the omission branch of the last selected UTXO can
+ // find any solutions. Redirect to exploring the Omission branch of the penultimate selected UTXO (i.e.
+ // set `next_utxo` to one after the penultimate selected, then deselect the last two selected UTXOs)
+ should_cut = false;
+ deselect_last();
+ should_shift = true;
+ }
+
+ while (should_shift) {
+ // Set `next_utxo` to one after last selected, then deselect last selected UTXO
+ if (curr_selection.empty()) {
+ // Exhausted search space before running into attempt limit
+ is_done = true;
+ result.SetAlgoCompleted(true);
+ break;
+ }
+ next_utxo = curr_selection.back() + 1;
+ deselect_last();
+ should_shift = false;
+
+ // After SHIFTing to an omission branch, the `next_utxo` might have the same effective value as the UTXO we
+ // just omitted. Since lower weight is our tiebreaker on UTXOs with equal effective value for sorting, if it
+ // ties on the effective value, it _must_ have the same weight (i.e. be a "clone" of the prior UTXO) or a
+ // higher weight. If so, selecting `next_utxo` would produce an equivalent or worse selection as one we
+ // previously evaluated. In that case, increment `next_utxo` until we find a UTXO with a differing amount.
+ while (utxo_pool[next_utxo - 1].GetSelectionAmount() == utxo_pool[next_utxo].GetSelectionAmount()) {
+ if (next_utxo >= utxo_pool.size() - 1) {
+ // Reached end of UTXO pool skipping clones: SHIFT instead
+ should_shift = true;
+ break;
+ }
+ // Skip clone: previous UTXO is equivalent and unselected
+ ++next_utxo;
+ }
+ }
+ }
+
+ result.SetSelectionsEvaluated(curr_try);
+
+ if (best_selection.empty()) {
+ return max_tx_weight_exceeded ? ErrorMaxWeightExceeded() : util::Error();
+ }
+
+ for (const size_t& i : best_selection) {
+ result.AddInput(utxo_pool[i]);
+ }
+
+ return result;
+}
+
class MinOutputGroupComparator
{
public:
@@ -509,6 +851,26 @@ void SelectionResult::ComputeAndSetWaste(const CAmount min_viable_change, const
}
}
+void SelectionResult::SetAlgoCompleted(bool algo_completed)
+{
+ m_algo_completed = algo_completed;
+}
+
+bool SelectionResult::GetAlgoCompleted() const
+{
+ return m_algo_completed;
+}
+
+void SelectionResult::SetSelectionsEvaluated(size_t attempts)
+{
+ m_selections_evaluated = attempts;
+}
+
+size_t SelectionResult::GetSelectionsEvaluated() const
+{
+ return m_selections_evaluated;
+}
+
CAmount SelectionResult::GetWaste() const
{
return *Assert(m_waste);
@@ -602,6 +964,7 @@ std::string GetAlgorithmName(const SelectionAlgorithm algo)
case SelectionAlgorithm::BNB: return "bnb";
case SelectionAlgorithm::KNAPSACK: return "knapsack";
case SelectionAlgorithm::SRD: return "srd";
+ case SelectionAlgorithm::CG: return "cg";
case SelectionAlgorithm::MANUAL: return "manual";
// No default case to allow for compiler to warn
}
diff --git a/src/wallet/coinselection.h b/src/wallet/coinselection.h
index 20b2461c04..80c92e1b0e 100644
--- a/src/wallet/coinselection.h
+++ b/src/wallet/coinselection.h
@@ -142,8 +142,8 @@ struct CoinSelectionParams {
size_t change_output_size = 0;
/** Size of the input to spend a change output in virtual bytes. */
size_t change_spend_size = 0;
- /** Mininmum change to target in Knapsack solver: select coins to cover the payment and
- * at least this value of change. */
+ /** Mininmum change to target in Knapsack solver and CoinGrinder:
+ * select coins to cover the payment and at least this value of change. */
CAmount m_min_change_target{0};
/** Minimum amount for creating a change output.
* If change budget is smaller than min_change then we forgo creation of change output.
@@ -311,7 +311,8 @@ enum class SelectionAlgorithm : uint8_t
BNB = 0,
KNAPSACK = 1,
SRD = 2,
- MANUAL = 3,
+ CG = 3,
+ MANUAL = 4,
};
std::string GetAlgorithmName(const SelectionAlgorithm algo);
@@ -329,6 +330,10 @@ private:
bool m_use_effective{false};
/** The computed waste */
std::optional<CAmount> m_waste;
+ /** False if algorithm was cut short by hitting limit of attempts and solution is non-optimal */
+ bool m_algo_completed{true};
+ /** The count of selections that were evaluated by this coin selection attempt */
+ size_t m_selections_evaluated;
/** Total weight of the selected inputs */
int m_weight{0};
/** How much individual inputs overestimated the bump fees for the shared ancestry */
@@ -386,6 +391,18 @@ public:
void ComputeAndSetWaste(const CAmount min_viable_change, const CAmount change_cost, const CAmount change_fee);
[[nodiscard]] CAmount GetWaste() const;
+ /** Tracks that algorithm was able to exhaustively search the entire combination space before hitting limit of tries */
+ void SetAlgoCompleted(bool algo_completed);
+
+ /** Get m_algo_completed */
+ bool GetAlgoCompleted() const;
+
+ /** Record the number of selections that were evaluated */
+ void SetSelectionsEvaluated(size_t attempts);
+
+ /** Get selections_evaluated */
+ size_t GetSelectionsEvaluated() const ;
+
/**
* Combines the @param[in] other selection result into 'this' selection result.
*
@@ -430,6 +447,8 @@ public:
util::Result<SelectionResult> SelectCoinsBnB(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, const CAmount& cost_of_change,
int max_weight);
+util::Result<SelectionResult> CoinGrinder(std::vector<OutputGroup>& utxo_pool, const CAmount& selection_target, CAmount change_target, int max_weight);
+
/** Select coins by Single Random Draw. OutputGroups are selected randomly from the eligible
* outputs until the target is satisfied
*
diff --git a/src/wallet/db.h b/src/wallet/db.h
index c263f54144..084fcadc24 100644
--- a/src/wallet/db.h
+++ b/src/wallet/db.h
@@ -20,7 +20,6 @@ class ArgsManager;
struct bilingual_str;
namespace wallet {
-void SplitWalletPath(const fs::path& wallet_path, fs::path& env_directory, std::string& database_filename);
class DatabaseCursor
{
diff --git a/src/wallet/dump.cpp b/src/wallet/dump.cpp
index 3ac5cf03b1..7a36910dc1 100644
--- a/src/wallet/dump.cpp
+++ b/src/wallet/dump.cpp
@@ -8,6 +8,7 @@
#include <util/fs.h>
#include <util/translation.h>
#include <wallet/wallet.h>
+#include <wallet/walletdb.h>
#include <algorithm>
#include <fstream>
@@ -20,7 +21,7 @@ namespace wallet {
static const std::string DUMP_MAGIC = "BITCOIN_CORE_WALLET_DUMP";
uint32_t DUMP_VERSION = 1;
-bool DumpWallet(const ArgsManager& args, CWallet& wallet, bilingual_str& error)
+bool DumpWallet(const ArgsManager& args, WalletDatabase& db, bilingual_str& error)
{
// Get the dumpfile
std::string dump_filename = args.GetArg("-dumpfile", "");
@@ -44,7 +45,6 @@ bool DumpWallet(const ArgsManager& args, CWallet& wallet, bilingual_str& error)
HashWriter hasher{};
- WalletDatabase& db = wallet.GetDatabase();
std::unique_ptr<DatabaseBatch> batch = db.MakeBatch();
bool ret = true;
@@ -90,9 +90,6 @@ bool DumpWallet(const ArgsManager& args, CWallet& wallet, bilingual_str& error)
cursor.reset();
batch.reset();
- // Close the wallet after we're done with it. The caller won't be doing this
- wallet.Close();
-
if (ret) {
// Write the hash
tfm::format(dump_file, "checksum,%s\n", HexStr(hasher.GetHash()));
diff --git a/src/wallet/dump.h b/src/wallet/dump.h
index 5034f95479..9b44af922e 100644
--- a/src/wallet/dump.h
+++ b/src/wallet/dump.h
@@ -14,8 +14,9 @@ struct bilingual_str;
class ArgsManager;
namespace wallet {
-class CWallet;
-bool DumpWallet(const ArgsManager& args, CWallet& wallet, bilingual_str& error);
+class WalletDatabase;
+
+bool DumpWallet(const ArgsManager& args, WalletDatabase& db, bilingual_str& error);
bool CreateFromDump(const ArgsManager& args, const std::string& name, const fs::path& wallet_path, bilingual_str& error, std::vector<bilingual_str>& warnings);
} // namespace wallet
diff --git a/src/wallet/init.cpp b/src/wallet/init.cpp
index 088343458c..f151fad740 100644
--- a/src/wallet/init.cpp
+++ b/src/wallet/init.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <common/args.h>
#include <init.h>
#include <interfaces/chain.h>
diff --git a/src/wallet/rpc/addresses.cpp b/src/wallet/rpc/addresses.cpp
index e9b93afc30..acaa2d8b15 100644
--- a/src/wallet/rpc/addresses.cpp
+++ b/src/wallet/rpc/addresses.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <core_io.h>
#include <key_io.h>
#include <rpc/util.h>
diff --git a/src/wallet/rpc/backup.cpp b/src/wallet/rpc/backup.cpp
index 99c548bf1d..5167e986b1 100644
--- a/src/wallet/rpc/backup.cpp
+++ b/src/wallet/rpc/backup.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <chain.h>
#include <clientversion.h>
#include <core_io.h>
@@ -394,14 +398,8 @@ RPCHelpMan removeprunedfunds()
uint256 hash(ParseHashV(request.params[0], "txid"));
std::vector<uint256> vHash;
vHash.push_back(hash);
- std::vector<uint256> vHashOut;
-
- if (pwallet->ZapSelectTx(vHash, vHashOut) != DBErrors::LOAD_OK) {
- throw JSONRPCError(RPC_WALLET_ERROR, "Could not properly delete the transaction.");
- }
-
- if(vHashOut.empty()) {
- throw JSONRPCError(RPC_INVALID_PARAMETER, "Transaction does not exist in wallet.");
+ if (auto res = pwallet->RemoveTxs(vHash); !res) {
+ throw JSONRPCError(RPC_WALLET_ERROR, util::ErrorString(res).original);
}
return UniValue::VNULL;
diff --git a/src/wallet/rpc/spend.cpp b/src/wallet/rpc/spend.cpp
index 5a13b5ac8e..6060f017ce 100644
--- a/src/wallet/rpc/spend.cpp
+++ b/src/wallet/rpc/spend.cpp
@@ -24,34 +24,15 @@
namespace wallet {
-static void ParseRecipients(const UniValue& address_amounts, const UniValue& subtract_fee_outputs, std::vector<CRecipient>& recipients)
+std::vector<CRecipient> CreateRecipients(const std::vector<std::pair<CTxDestination, CAmount>>& outputs, const std::set<int>& subtract_fee_outputs)
{
- std::set<CTxDestination> destinations;
- int i = 0;
- for (const std::string& address: address_amounts.getKeys()) {
- CTxDestination dest = DecodeDestination(address);
- if (!IsValidDestination(dest)) {
- throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, std::string("Invalid Bitcoin address: ") + address);
- }
-
- if (destinations.count(dest)) {
- throw JSONRPCError(RPC_INVALID_PARAMETER, std::string("Invalid parameter, duplicated address: ") + address);
- }
- destinations.insert(dest);
-
- CAmount amount = AmountFromValue(address_amounts[i++]);
-
- bool subtract_fee = false;
- for (unsigned int idx = 0; idx < subtract_fee_outputs.size(); idx++) {
- const UniValue& addr = subtract_fee_outputs[idx];
- if (addr.get_str() == address) {
- subtract_fee = true;
- }
- }
-
- CRecipient recipient = {dest, amount, subtract_fee};
+ std::vector<CRecipient> recipients;
+ for (size_t i = 0; i < outputs.size(); ++i) {
+ const auto& [destination, amount] = outputs.at(i);
+ CRecipient recipient{destination, amount, subtract_fee_outputs.contains(i)};
recipients.push_back(recipient);
}
+ return recipients;
}
static void InterpretFeeEstimationInstructions(const UniValue& conf_target, const UniValue& estimate_mode, const UniValue& fee_rate, UniValue& options)
@@ -76,6 +57,37 @@ static void InterpretFeeEstimationInstructions(const UniValue& conf_target, cons
}
}
+std::set<int> InterpretSubtractFeeFromOutputInstructions(const UniValue& sffo_instructions, const std::vector<std::string>& destinations)
+{
+ std::set<int> sffo_set;
+ if (sffo_instructions.isNull()) return sffo_set;
+ if (sffo_instructions.isBool()) {
+ if (sffo_instructions.get_bool()) sffo_set.insert(0);
+ return sffo_set;
+ }
+ for (const auto& sffo : sffo_instructions.getValues()) {
+ if (sffo.isStr()) {
+ for (size_t i = 0; i < destinations.size(); ++i) {
+ if (sffo.get_str() == destinations.at(i)) {
+ sffo_set.insert(i);
+ break;
+ }
+ }
+ }
+ if (sffo.isNum()) {
+ int pos = sffo.getInt<int>();
+ if (sffo_set.contains(pos))
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid parameter, duplicated position: %d", pos));
+ if (pos < 0)
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid parameter, negative position: %d", pos));
+ if (pos >= int(destinations.size()))
+ throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid parameter, position too large: %d", pos));
+ sffo_set.insert(pos);
+ }
+ }
+ return sffo_set;
+}
+
static UniValue FinishTransaction(const std::shared_ptr<CWallet> pwallet, const UniValue& options, const CMutableTransaction& rawTx)
{
// Make a blank psbt
@@ -275,11 +287,6 @@ RPCHelpMan sendtoaddress()
if (!request.params[3].isNull() && !request.params[3].get_str().empty())
mapValue["to"] = request.params[3].get_str();
- bool fSubtractFeeFromAmount = false;
- if (!request.params[4].isNull()) {
- fSubtractFeeFromAmount = request.params[4].get_bool();
- }
-
CCoinControl coin_control;
if (!request.params[5].isNull()) {
coin_control.m_signal_bip125_rbf = request.params[5].get_bool();
@@ -296,13 +303,10 @@ RPCHelpMan sendtoaddress()
UniValue address_amounts(UniValue::VOBJ);
const std::string address = request.params[0].get_str();
address_amounts.pushKV(address, request.params[1]);
- UniValue subtractFeeFromAmount(UniValue::VARR);
- if (fSubtractFeeFromAmount) {
- subtractFeeFromAmount.push_back(address);
- }
-
- std::vector<CRecipient> recipients;
- ParseRecipients(address_amounts, subtractFeeFromAmount, recipients);
+ std::vector<CRecipient> recipients = CreateRecipients(
+ ParseOutputs(address_amounts),
+ InterpretSubtractFeeFromOutputInstructions(request.params[4], address_amounts.getKeys())
+ );
const bool verbose{request.params[10].isNull() ? false : request.params[10].get_bool()};
return SendMoney(*pwallet, coin_control, recipients, mapValue, verbose);
@@ -386,10 +390,6 @@ RPCHelpMan sendmany()
if (!request.params[3].isNull() && !request.params[3].get_str().empty())
mapValue["comment"] = request.params[3].get_str();
- UniValue subtractFeeFromAmount(UniValue::VARR);
- if (!request.params[4].isNull())
- subtractFeeFromAmount = request.params[4].get_array();
-
CCoinControl coin_control;
if (!request.params[5].isNull()) {
coin_control.m_signal_bip125_rbf = request.params[5].get_bool();
@@ -397,8 +397,10 @@ RPCHelpMan sendmany()
SetFeeEstimateMode(*pwallet, coin_control, /*conf_target=*/request.params[6], /*estimate_mode=*/request.params[7], /*fee_rate=*/request.params[8], /*override_min_fee=*/false);
- std::vector<CRecipient> recipients;
- ParseRecipients(sendTo, subtractFeeFromAmount, recipients);
+ std::vector<CRecipient> recipients = CreateRecipients(
+ ParseOutputs(sendTo),
+ InterpretSubtractFeeFromOutputInstructions(request.params[4], sendTo.getKeys())
+ );
const bool verbose{request.params[9].isNull() ? false : request.params[9].get_bool()};
return SendMoney(*pwallet, coin_control, recipients, std::move(mapValue), verbose);
@@ -488,17 +490,17 @@ static std::vector<RPCArg> FundTxDoc(bool solving_data = true)
return args;
}
-CreatedTransactionResult FundTransaction(CWallet& wallet, const CMutableTransaction& tx, const UniValue& options, CCoinControl& coinControl, bool override_min_fee)
+CreatedTransactionResult FundTransaction(CWallet& wallet, const CMutableTransaction& tx, const std::vector<CRecipient>& recipients, const UniValue& options, CCoinControl& coinControl, bool override_min_fee)
{
+ // We want to make sure tx.vout is not used now that we are passing outputs as a vector of recipients.
+ // This sets us up to remove tx completely in a future PR in favor of passing the inputs directly.
+ CHECK_NONFATAL(tx.vout.empty());
// Make sure the results are valid at least up to the most recent block
// the user could have gotten from another RPC command prior to now
wallet.BlockUntilSyncedToCurrentChain();
std::optional<unsigned int> change_position;
bool lockUnspents = false;
- UniValue subtractFeeFromOutputs;
- std::set<int> setSubtractFeeFromOutputs;
-
if (!options.isNull()) {
if (options.type() == UniValue::VBOOL) {
// backward compatibility bool only fallback
@@ -553,7 +555,7 @@ CreatedTransactionResult FundTransaction(CWallet& wallet, const CMutableTransact
if (options.exists("changePosition") || options.exists("change_position")) {
int pos = (options.exists("change_position") ? options["change_position"] : options["changePosition"]).getInt<int>();
- if (pos < 0 || (unsigned int)pos > tx.vout.size()) {
+ if (pos < 0 || (unsigned int)pos > recipients.size()) {
throw JSONRPCError(RPC_INVALID_PARAMETER, "changePosition out of bounds");
}
change_position = (unsigned int)pos;
@@ -595,9 +597,6 @@ CreatedTransactionResult FundTransaction(CWallet& wallet, const CMutableTransact
coinControl.fOverrideFeeRate = true;
}
- if (options.exists("subtractFeeFromOutputs") || options.exists("subtract_fee_from_outputs") )
- subtractFeeFromOutputs = (options.exists("subtract_fee_from_outputs") ? options["subtract_fee_from_outputs"] : options["subtractFeeFromOutputs"]).get_array();
-
if (options.exists("replaceable")) {
coinControl.m_signal_bip125_rbf = options["replaceable"].get_bool();
}
@@ -703,21 +702,10 @@ CreatedTransactionResult FundTransaction(CWallet& wallet, const CMutableTransact
}
}
- if (tx.vout.size() == 0)
+ if (recipients.empty())
throw JSONRPCError(RPC_INVALID_PARAMETER, "TX must have at least one output");
- for (unsigned int idx = 0; idx < subtractFeeFromOutputs.size(); idx++) {
- int pos = subtractFeeFromOutputs[idx].getInt<int>();
- if (setSubtractFeeFromOutputs.count(pos))
- throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid parameter, duplicated position: %d", pos));
- if (pos < 0)
- throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid parameter, negative position: %d", pos));
- if (pos >= int(tx.vout.size()))
- throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("Invalid parameter, position too large: %d", pos));
- setSubtractFeeFromOutputs.insert(pos);
- }
-
- auto txr = FundTransaction(wallet, tx, change_position, lockUnspents, setSubtractFeeFromOutputs, coinControl);
+ auto txr = FundTransaction(wallet, tx, recipients, change_position, lockUnspents, coinControl);
if (!txr) {
throw JSONRPCError(RPC_WALLET_ERROR, ErrorString(txr).original);
}
@@ -843,11 +831,25 @@ RPCHelpMan fundrawtransaction()
if (!DecodeHexTx(tx, request.params[0].get_str(), try_no_witness, try_witness)) {
throw JSONRPCError(RPC_DESERIALIZATION_ERROR, "TX decode failed");
}
-
+ UniValue options = request.params[1];
+ std::vector<std::pair<CTxDestination, CAmount>> destinations;
+ for (const auto& tx_out : tx.vout) {
+ CTxDestination dest;
+ ExtractDestination(tx_out.scriptPubKey, dest);
+ destinations.emplace_back(dest, tx_out.nValue);
+ }
+ std::vector<std::string> dummy(destinations.size(), "dummy");
+ std::vector<CRecipient> recipients = CreateRecipients(
+ destinations,
+ InterpretSubtractFeeFromOutputInstructions(options["subtractFeeFromOutputs"], dummy)
+ );
CCoinControl coin_control;
// Automatically select (additional) coins. Can be overridden by options.add_inputs.
coin_control.m_allow_other_inputs = true;
- auto txr = FundTransaction(*pwallet, tx, request.params[1], coin_control, /*override_min_fee=*/true);
+ // Clear tx.vout since it is not meant to be used now that we are passing outputs directly.
+ // This sets us up for a future PR to completely remove tx from the function signature in favor of passing inputs directly
+ tx.vout.clear();
+ auto txr = FundTransaction(*pwallet, tx, recipients, options, coin_control, /*override_min_fee=*/true);
UniValue result(UniValue::VOBJ);
result.pushKV("hex", EncodeHexTx(*txr.tx));
@@ -1275,13 +1277,22 @@ RPCHelpMan send()
bool rbf{options.exists("replaceable") ? options["replaceable"].get_bool() : pwallet->m_signal_rbf};
+ UniValue outputs(UniValue::VOBJ);
+ outputs = NormalizeOutputs(request.params[0]);
+ std::vector<CRecipient> recipients = CreateRecipients(
+ ParseOutputs(outputs),
+ InterpretSubtractFeeFromOutputInstructions(options["subtract_fee_from_outputs"], outputs.getKeys())
+ );
CMutableTransaction rawTx = ConstructTransaction(options["inputs"], request.params[0], options["locktime"], rbf);
CCoinControl coin_control;
// Automatically select coins, unless at least one is manually selected. Can
// be overridden by options.add_inputs.
coin_control.m_allow_other_inputs = rawTx.vin.size() == 0;
SetOptionsInputWeights(options["inputs"], options);
- auto txr = FundTransaction(*pwallet, rawTx, options, coin_control, /*override_min_fee=*/false);
+ // Clear tx.vout since it is not meant to be used now that we are passing outputs directly.
+ // This sets us up for a future PR to completely remove tx from the function signature in favor of passing inputs directly
+ rawTx.vout.clear();
+ auto txr = FundTransaction(*pwallet, rawTx, recipients, options, coin_control, /*override_min_fee=*/false);
return FinishTransaction(pwallet, options, CMutableTransaction(*txr.tx));
}
@@ -1711,12 +1722,21 @@ RPCHelpMan walletcreatefundedpsbt()
const UniValue &replaceable_arg = options["replaceable"];
const bool rbf{replaceable_arg.isNull() ? wallet.m_signal_rbf : replaceable_arg.get_bool()};
CMutableTransaction rawTx = ConstructTransaction(request.params[0], request.params[1], request.params[2], rbf);
+ UniValue outputs(UniValue::VOBJ);
+ outputs = NormalizeOutputs(request.params[1]);
+ std::vector<CRecipient> recipients = CreateRecipients(
+ ParseOutputs(outputs),
+ InterpretSubtractFeeFromOutputInstructions(options["subtractFeeFromOutputs"], outputs.getKeys())
+ );
CCoinControl coin_control;
// Automatically select coins, unless at least one is manually selected. Can
// be overridden by options.add_inputs.
coin_control.m_allow_other_inputs = rawTx.vin.size() == 0;
SetOptionsInputWeights(request.params[0], options);
- auto txr = FundTransaction(wallet, rawTx, options, coin_control, /*override_min_fee=*/true);
+ // Clear tx.vout since it is not meant to be used now that we are passing outputs directly.
+ // This sets us up for a future PR to completely remove tx from the function signature in favor of passing inputs directly
+ rawTx.vout.clear();
+ auto txr = FundTransaction(wallet, rawTx, recipients, options, coin_control, /*override_min_fee=*/true);
// Make a blank psbt
PartiallySignedTransaction psbtx(CMutableTransaction(*txr.tx));
diff --git a/src/wallet/rpc/transactions.cpp b/src/wallet/rpc/transactions.cpp
index cd7ed461f0..e6c021d426 100644
--- a/src/wallet/rpc/transactions.cpp
+++ b/src/wallet/rpc/transactions.cpp
@@ -415,8 +415,8 @@ static std::vector<RPCResult> TransactionDescriptionString()
{
{RPCResult::Type::STR_HEX, "txid", "The transaction id."},
}},
- {RPCResult::Type::STR_HEX, "replaced_by_txid", /*optional=*/true, "The txid if this tx was replaced."},
- {RPCResult::Type::STR_HEX, "replaces_txid", /*optional=*/true, "The txid if the tx replaces one."},
+ {RPCResult::Type::STR_HEX, "replaced_by_txid", /*optional=*/true, "Only if 'category' is 'send'. The txid if this tx was replaced."},
+ {RPCResult::Type::STR_HEX, "replaces_txid", /*optional=*/true, "Only if 'category' is 'send'. The txid if this tx replaces another."},
{RPCResult::Type::STR, "to", /*optional=*/true, "If a comment to is associated with the transaction."},
{RPCResult::Type::NUM_TIME, "time", "The transaction time expressed in " + UNIX_EPOCH_TIME + "."},
{RPCResult::Type::NUM_TIME, "timereceived", "The time received expressed in " + UNIX_EPOCH_TIME + "."},
@@ -783,8 +783,7 @@ RPCHelpMan gettransaction()
ListTransactions(*pwallet, wtx, 0, false, details, filter, /*filter_label=*/std::nullopt);
entry.pushKV("details", details);
- std::string strHex = EncodeHexTx(*wtx.tx, pwallet->chain().rpcSerializationWithoutWitness());
- entry.pushKV("hex", strHex);
+ entry.pushKV("hex", EncodeHexTx(*wtx.tx));
if (verbose) {
UniValue decoded(UniValue::VOBJ);
diff --git a/src/wallet/rpc/wallet.cpp b/src/wallet/rpc/wallet.cpp
index 391153a2a1..6a8ce954fb 100644
--- a/src/wallet/rpc/wallet.cpp
+++ b/src/wallet/rpc/wallet.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <core_io.h>
#include <key_io.h>
#include <rpc/server.h>
@@ -748,13 +752,13 @@ RPCHelpMan simulaterawtransaction()
static RPCHelpMan migratewallet()
{
return RPCHelpMan{"migratewallet",
- "EXPERIMENTAL warning: This call may not work as expected and may be changed in future releases\n"
"\nMigrate the wallet to a descriptor wallet.\n"
"A new wallet backup will need to be made.\n"
"\nThe migration process will create a backup of the wallet before migrating. This backup\n"
"file will be named <wallet name>-<timestamp>.legacy.bak and can be found in the directory\n"
"for this wallet. In the event of an incorrect migration, the backup can be restored using restorewallet."
- "\nEncrypted wallets must have the passphrase provided as an argument to this call.",
+ "\nEncrypted wallets must have the passphrase provided as an argument to this call.\n"
+ "\nThis RPC may take a long time to complete. Increasing the RPC client timeout is recommended.",
{
{"wallet_name", RPCArg::Type::STR, RPCArg::DefaultHint{"the wallet name from the RPC endpoint"}, "The name of the wallet to migrate. If provided both here and in the RPC endpoint, the two must be identical."},
{"passphrase", RPCArg::Type::STR, RPCArg::Optional::OMITTED, "The wallet passphrase"},
diff --git a/src/wallet/scriptpubkeyman.cpp b/src/wallet/scriptpubkeyman.cpp
index 70705667b0..e10a17f003 100644
--- a/src/wallet/scriptpubkeyman.cpp
+++ b/src/wallet/scriptpubkeyman.cpp
@@ -225,7 +225,7 @@ isminetype LegacyScriptPubKeyMan::IsMine(const CScript& script) const
assert(false);
}
-bool LegacyScriptPubKeyMan::CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys)
+bool LegacyScriptPubKeyMan::CheckDecryptionKey(const CKeyingMaterial& master_key)
{
{
LOCK(cs_KeyStore);
@@ -258,7 +258,7 @@ bool LegacyScriptPubKeyMan::CheckDecryptionKey(const CKeyingMaterial& master_key
LogPrintf("The wallet is probably corrupted: Some keys decrypt but not all.\n");
throw std::runtime_error("Error unlocking wallet: some keys decrypt but not all. Your wallet file may be corrupt.");
}
- if (keyFail || (!keyPass && !accept_no_keys))
+ if (keyFail || !keyPass)
return false;
fDecryptionThoroughlyChecked = true;
}
@@ -280,7 +280,7 @@ bool LegacyScriptPubKeyMan::Encrypt(const CKeyingMaterial& master_key, WalletBat
{
const CKey &key = mKey.second;
CPubKey vchPubKey = key.GetPubKey();
- CKeyingMaterial vchSecret(key.begin(), key.end());
+ CKeyingMaterial vchSecret{UCharCast(key.begin()), UCharCast(key.end())};
std::vector<unsigned char> vchCryptedSecret;
if (!EncryptSecret(master_key, vchSecret, vchPubKey.GetHash(), vchCryptedSecret)) {
encrypted_batch = nullptr;
@@ -652,8 +652,6 @@ TransactionError LegacyScriptPubKeyMan::FillPSBT(PartiallySignedTransaction& psb
// There's no UTXO so we can just skip this now
continue;
}
- SignatureData sigdata;
- input.FillSignatureData(sigdata);
SignPSBTInput(HidingSigningProvider(this, !sign, !bip32derivs), psbtx, i, &txdata, sighash_type, nullptr, finalize);
bool signed_one = PSBTInputSigned(input);
@@ -810,8 +808,10 @@ bool LegacyScriptPubKeyMan::AddKeyPubKeyInner(const CKey& key, const CPubKey &pu
}
std::vector<unsigned char> vchCryptedSecret;
- CKeyingMaterial vchSecret(key.begin(), key.end());
- if (!EncryptSecret(m_storage.GetEncryptionKey(), vchSecret, pubkey.GetHash(), vchCryptedSecret)) {
+ CKeyingMaterial vchSecret{UCharCast(key.begin()), UCharCast(key.end())};
+ if (!m_storage.WithEncryptionKey([&](const CKeyingMaterial& encryption_key) {
+ return EncryptSecret(encryption_key, vchSecret, pubkey.GetHash(), vchCryptedSecret);
+ })) {
return false;
}
@@ -997,7 +997,9 @@ bool LegacyScriptPubKeyMan::GetKey(const CKeyID &address, CKey& keyOut) const
{
const CPubKey &vchPubKey = (*mi).second.first;
const std::vector<unsigned char> &vchCryptedSecret = (*mi).second.second;
- return DecryptKey(m_storage.GetEncryptionKey(), vchCryptedSecret, vchPubKey, keyOut);
+ return m_storage.WithEncryptionKey([&](const CKeyingMaterial& encryption_key) {
+ return DecryptKey(encryption_key, vchCryptedSecret, vchPubKey, keyOut);
+ });
}
return false;
}
@@ -1183,8 +1185,7 @@ bool LegacyScriptPubKeyMan::CanGenerateKeys() const
CPubKey LegacyScriptPubKeyMan::GenerateNewSeed()
{
assert(!m_storage.IsWalletFlagSet(WALLET_FLAG_DISABLE_PRIVATE_KEYS));
- CKey key;
- key.MakeNewKey(true);
+ CKey key = GenerateRandomKey();
return DeriveNewSeed(key);
}
@@ -1287,6 +1288,9 @@ bool LegacyScriptPubKeyMan::TopUp(unsigned int kpSize)
}
if (!batch.TxnCommit()) throw std::runtime_error(strprintf("Error during keypool top up. Cannot commit changes for wallet %s", m_storage.GetDisplayName()));
NotifyCanGetAddressesChanged();
+ // Note: Unlike with DescriptorSPKM, LegacySPKM does not need to call
+ // m_storage.TopUpCallback() as we do not know what new scripts the LegacySPKM is
+ // watching for. CWallet's scriptPubKey cache is not used for LegacySPKMs.
return true;
}
@@ -2046,7 +2050,7 @@ isminetype DescriptorScriptPubKeyMan::IsMine(const CScript& script) const
return ISMINE_NO;
}
-bool DescriptorScriptPubKeyMan::CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys)
+bool DescriptorScriptPubKeyMan::CheckDecryptionKey(const CKeyingMaterial& master_key)
{
LOCK(cs_desc_man);
if (!m_map_keys.empty()) {
@@ -2071,7 +2075,7 @@ bool DescriptorScriptPubKeyMan::CheckDecryptionKey(const CKeyingMaterial& master
LogPrintf("The wallet is probably corrupted: Some keys decrypt but not all.\n");
throw std::runtime_error("Error unlocking wallet: some keys decrypt but not all. Your wallet file may be corrupt.");
}
- if (keyFail || (!keyPass && !accept_no_keys)) {
+ if (keyFail || !keyPass) {
return false;
}
m_decryption_thoroughly_checked = true;
@@ -2089,7 +2093,7 @@ bool DescriptorScriptPubKeyMan::Encrypt(const CKeyingMaterial& master_key, Walle
{
const CKey &key = key_in.second;
CPubKey pubkey = key.GetPubKey();
- CKeyingMaterial secret(key.begin(), key.end());
+ CKeyingMaterial secret{UCharCast(key.begin()), UCharCast(key.end())};
std::vector<unsigned char> crypted_secret;
if (!EncryptSecret(master_key, secret, pubkey.GetHash(), crypted_secret)) {
return false;
@@ -2129,7 +2133,9 @@ std::map<CKeyID, CKey> DescriptorScriptPubKeyMan::GetKeys() const
const CPubKey& pubkey = key_pair.second.first;
const std::vector<unsigned char>& crypted_secret = key_pair.second.second;
CKey key;
- DecryptKey(m_storage.GetEncryptionKey(), crypted_secret, pubkey, key);
+ m_storage.WithEncryptionKey([&](const CKeyingMaterial& encryption_key) {
+ return DecryptKey(encryption_key, crypted_secret, pubkey, key);
+ });
keys[pubkey.GetID()] = key;
}
return keys;
@@ -2149,6 +2155,7 @@ bool DescriptorScriptPubKeyMan::TopUp(unsigned int size)
bool DescriptorScriptPubKeyMan::TopUpWithDB(WalletBatch& batch, unsigned int size)
{
LOCK(cs_desc_man);
+ std::set<CScript> new_spks;
unsigned int target_size;
if (size > 0) {
target_size = size;
@@ -2179,6 +2186,7 @@ bool DescriptorScriptPubKeyMan::TopUpWithDB(WalletBatch& batch, unsigned int siz
if (!m_wallet_descriptor.descriptor->Expand(i, provider, scripts_temp, out_keys, &temp_cache)) return false;
}
// Add all of the scriptPubKeys to the scriptPubKey set
+ new_spks.insert(scripts_temp.begin(), scripts_temp.end());
for (const CScript& script : scripts_temp) {
m_map_script_pub_keys[script] = i;
}
@@ -2204,6 +2212,7 @@ bool DescriptorScriptPubKeyMan::TopUpWithDB(WalletBatch& batch, unsigned int siz
// By this point, the cache size should be the size of the entire range
assert(m_wallet_descriptor.range_end - 1 == m_max_cached_index);
+ m_storage.TopUpCallback(new_spks, this);
NotifyCanGetAddressesChanged();
return true;
}
@@ -2262,8 +2271,10 @@ bool DescriptorScriptPubKeyMan::AddDescriptorKeyWithDB(WalletBatch& batch, const
}
std::vector<unsigned char> crypted_secret;
- CKeyingMaterial secret(key.begin(), key.end());
- if (!EncryptSecret(m_storage.GetEncryptionKey(), secret, pubkey.GetHash(), crypted_secret)) {
+ CKeyingMaterial secret{UCharCast(key.begin()), UCharCast(key.end())};
+ if (!m_storage.WithEncryptionKey([&](const CKeyingMaterial& encryption_key) {
+ return EncryptSecret(encryption_key, secret, pubkey.GetHash(), crypted_secret);
+ })) {
return false;
}
@@ -2521,8 +2532,6 @@ TransactionError DescriptorScriptPubKeyMan::FillPSBT(PartiallySignedTransaction&
// There's no UTXO so we can just skip this now
continue;
}
- SignatureData sigdata;
- input.FillSignatureData(sigdata);
std::unique_ptr<FlatSigningProvider> keys = std::make_unique<FlatSigningProvider>();
std::unique_ptr<FlatSigningProvider> script_keys = GetSigningProvider(script, /*include_private=*/sign);
@@ -2617,6 +2626,7 @@ uint256 DescriptorScriptPubKeyMan::GetID() const
void DescriptorScriptPubKeyMan::SetCache(const DescriptorCache& cache)
{
LOCK(cs_desc_man);
+ std::set<CScript> new_spks;
m_wallet_descriptor.cache = cache;
for (int32_t i = m_wallet_descriptor.range_start; i < m_wallet_descriptor.range_end; ++i) {
FlatSigningProvider out_keys;
@@ -2625,6 +2635,7 @@ void DescriptorScriptPubKeyMan::SetCache(const DescriptorCache& cache)
throw std::runtime_error("Error: Unable to expand wallet descriptor from cache");
}
// Add all of the scriptPubKeys to the scriptPubKey set
+ new_spks.insert(scripts_temp.begin(), scripts_temp.end());
for (const CScript& script : scripts_temp) {
if (m_map_script_pub_keys.count(script) != 0) {
throw std::runtime_error(strprintf("Error: Already loaded script at index %d as being at index %d", i, m_map_script_pub_keys[script]));
@@ -2642,6 +2653,8 @@ void DescriptorScriptPubKeyMan::SetCache(const DescriptorCache& cache)
}
m_max_cached_index++;
}
+ // Make sure the wallet knows about our new spks
+ m_storage.TopUpCallback(new_spks, this);
}
bool DescriptorScriptPubKeyMan::AddKey(const CKeyID& key_id, const CKey& key)
diff --git a/src/wallet/scriptpubkeyman.h b/src/wallet/scriptpubkeyman.h
index 449a75eb6b..2d83ae556f 100644
--- a/src/wallet/scriptpubkeyman.h
+++ b/src/wallet/scriptpubkeyman.h
@@ -22,6 +22,7 @@
#include <boost/signals2/signal.hpp>
+#include <functional>
#include <optional>
#include <unordered_map>
@@ -30,6 +31,7 @@ struct bilingual_str;
namespace wallet {
struct MigrationData;
+class ScriptPubKeyMan;
// Wallet storage things that ScriptPubKeyMans need in order to be able to store things to the wallet database.
// It provides access to things that are part of the entire wallet and not specific to a ScriptPubKeyMan such as
@@ -46,9 +48,12 @@ public:
virtual void UnsetBlankWalletFlag(WalletBatch&) = 0;
virtual bool CanSupportFeature(enum WalletFeature) const = 0;
virtual void SetMinVersion(enum WalletFeature, WalletBatch* = nullptr) = 0;
- virtual const CKeyingMaterial& GetEncryptionKey() const = 0;
+ //! Pass the encryption key to cb().
+ virtual bool WithEncryptionKey(std::function<bool (const CKeyingMaterial&)> cb) const = 0;
virtual bool HasEncryptionKeys() const = 0;
virtual bool IsLocked() const = 0;
+ //! Callback function for after TopUp completes containing any scripts that were added by a SPKMan
+ virtual void TopUpCallback(const std::set<CScript>&, ScriptPubKeyMan*) = 0;
};
//! Constant representing an unknown spkm creation time
@@ -177,7 +182,7 @@ public:
virtual isminetype IsMine(const CScript& script) const { return ISMINE_NO; }
//! Check that the given decryption key is valid for this ScriptPubKeyMan, i.e. it decrypts all of the keys handled by it.
- virtual bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) { return false; }
+ virtual bool CheckDecryptionKey(const CKeyingMaterial& master_key) { return false; }
virtual bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) { return false; }
virtual util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) { return util::Error{Untranslated("Not supported")}; }
@@ -377,7 +382,7 @@ public:
util::Result<CTxDestination> GetNewDestination(const OutputType type) override;
isminetype IsMine(const CScript& script) const override;
- bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
+ bool CheckDecryptionKey(const CKeyingMaterial& master_key) override;
bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) override;
@@ -608,7 +613,7 @@ public:
util::Result<CTxDestination> GetNewDestination(const OutputType type) override;
isminetype IsMine(const CScript& script) const override;
- bool CheckDecryptionKey(const CKeyingMaterial& master_key, bool accept_no_keys = false) override;
+ bool CheckDecryptionKey(const CKeyingMaterial& master_key) override;
bool Encrypt(const CKeyingMaterial& master_key, WalletBatch* batch) override;
util::Result<CTxDestination> GetReservedDestination(const OutputType type, bool internal, int64_t& index, CKeyPool& keypool) override;
diff --git a/src/wallet/spend.cpp b/src/wallet/spend.cpp
index b51cd6332f..5d23ebd35a 100644
--- a/src/wallet/spend.cpp
+++ b/src/wallet/spend.cpp
@@ -709,6 +709,15 @@ util::Result<SelectionResult> ChooseSelectionResult(interfaces::Chain& chain, co
results.push_back(*knapsack_result);
} else append_error(knapsack_result);
+ if (coin_selection_params.m_effective_feerate > CFeeRate{3 * coin_selection_params.m_long_term_feerate}) { // Minimize input set for feerates of at least 3×LTFRE (default: 30 ṩ/vB+)
+ if (auto cg_result{CoinGrinder(groups.positive_group, nTargetValue, coin_selection_params.m_min_change_target, max_inputs_weight)}) {
+ cg_result->ComputeAndSetWaste(coin_selection_params.min_viable_change, coin_selection_params.m_cost_of_change, coin_selection_params.m_change_fee);
+ results.push_back(*cg_result);
+ } else {
+ append_error(cg_result);
+ }
+ }
+
if (auto srd_result{SelectCoinsSRD(groups.positive_group, nTargetValue, coin_selection_params.m_change_fee, coin_selection_params.rng_fast, max_inputs_weight)}) {
results.push_back(*srd_result);
} else append_error(srd_result);
@@ -1127,7 +1136,12 @@ static util::Result<CreatedTransactionResult> CreateTransactionInternal(
return util::Error{err.empty() ?_("Insufficient funds") : err};
}
const SelectionResult& result = *select_coins_res;
- TRACE5(coin_selection, selected_coins, wallet.GetName().c_str(), GetAlgorithmName(result.GetAlgo()).c_str(), result.GetTarget(), result.GetWaste(), result.GetSelectedValue());
+ TRACE5(coin_selection, selected_coins,
+ wallet.GetName().c_str(),
+ GetAlgorithmName(result.GetAlgo()).c_str(),
+ result.GetTarget(),
+ result.GetWaste(),
+ result.GetSelectedValue());
const CAmount change_amount = result.GetChange(coin_selection_params.min_viable_change, coin_selection_params.m_change_fee);
if (change_amount > 0) {
@@ -1336,8 +1350,11 @@ util::Result<CreatedTransactionResult> CreateTransaction(
LOCK(wallet.cs_wallet);
auto res = CreateTransactionInternal(wallet, vecSend, change_pos, coin_control, sign);
- TRACE4(coin_selection, normal_create_tx_internal, wallet.GetName().c_str(), bool(res),
- res ? res->fee : 0, res && res->change_pos.has_value() ? *res->change_pos : 0);
+ TRACE4(coin_selection, normal_create_tx_internal,
+ wallet.GetName().c_str(),
+ bool(res),
+ res ? res->fee : 0,
+ res && res->change_pos.has_value() ? int32_t(*res->change_pos) : -1);
if (!res) return res;
const auto& txr_ungrouped = *res;
// try with avoidpartialspends unless it's enabled already
@@ -1354,8 +1371,12 @@ util::Result<CreatedTransactionResult> CreateTransaction(
auto txr_grouped = CreateTransactionInternal(wallet, vecSend, change_pos, tmp_cc, sign);
// if fee of this alternative one is within the range of the max fee, we use this one
const bool use_aps{txr_grouped.has_value() ? (txr_grouped->fee <= txr_ungrouped.fee + wallet.m_max_aps_fee) : false};
- TRACE5(coin_selection, aps_create_tx_internal, wallet.GetName().c_str(), use_aps, txr_grouped.has_value(),
- txr_grouped.has_value() ? txr_grouped->fee : 0, txr_grouped.has_value() && txr_grouped->change_pos.has_value() ? *txr_grouped->change_pos : 0);
+ TRACE5(coin_selection, aps_create_tx_internal,
+ wallet.GetName().c_str(),
+ use_aps,
+ txr_grouped.has_value(),
+ txr_grouped.has_value() ? txr_grouped->fee : 0,
+ txr_grouped.has_value() && txr_grouped->change_pos.has_value() ? int32_t(*txr_grouped->change_pos) : -1);
if (txr_grouped) {
wallet.WalletLogPrintf("Fee non-grouped = %lld, grouped = %lld, using %s\n",
txr_ungrouped.fee, txr_grouped->fee, use_aps ? "grouped" : "non-grouped");
@@ -1365,18 +1386,11 @@ util::Result<CreatedTransactionResult> CreateTransaction(
return res;
}
-util::Result<CreatedTransactionResult> FundTransaction(CWallet& wallet, const CMutableTransaction& tx, std::optional<unsigned int> change_pos, bool lockUnspents, const std::set<int>& setSubtractFeeFromOutputs, CCoinControl coinControl)
+util::Result<CreatedTransactionResult> FundTransaction(CWallet& wallet, const CMutableTransaction& tx, const std::vector<CRecipient>& vecSend, std::optional<unsigned int> change_pos, bool lockUnspents, CCoinControl coinControl)
{
- std::vector<CRecipient> vecSend;
-
- // Turn the txout set into a CRecipient vector.
- for (size_t idx = 0; idx < tx.vout.size(); idx++) {
- const CTxOut& txOut = tx.vout[idx];
- CTxDestination dest;
- ExtractDestination(txOut.scriptPubKey, dest);
- CRecipient recipient = {dest, txOut.nValue, setSubtractFeeFromOutputs.count(idx) == 1};
- vecSend.push_back(recipient);
- }
+ // We want to make sure tx.vout is not used now that we are passing outputs as a vector of recipients.
+ // This sets us up to remove tx completely in a future PR in favor of passing the inputs directly.
+ assert(tx.vout.empty());
// Set the user desired locktime
coinControl.m_locktime = tx.nLockTime;
diff --git a/src/wallet/spend.h b/src/wallet/spend.h
index 3bd37cfd0e..62a7b4e4c8 100644
--- a/src/wallet/spend.h
+++ b/src/wallet/spend.h
@@ -224,7 +224,7 @@ util::Result<CreatedTransactionResult> CreateTransaction(CWallet& wallet, const
* Insert additional inputs into the transaction by
* calling CreateTransaction();
*/
-util::Result<CreatedTransactionResult> FundTransaction(CWallet& wallet, const CMutableTransaction& tx, std::optional<unsigned int> change_pos, bool lockUnspents, const std::set<int>& setSubtractFeeFromOutputs, CCoinControl);
+util::Result<CreatedTransactionResult> FundTransaction(CWallet& wallet, const CMutableTransaction& tx, const std::vector<CRecipient>& recipients, std::optional<unsigned int> change_pos, bool lockUnspents, CCoinControl);
} // namespace wallet
#endif // BITCOIN_WALLET_SPEND_H
diff --git a/src/wallet/sqlite.cpp b/src/wallet/sqlite.cpp
index db9989163d..34f18bf0b1 100644
--- a/src/wallet/sqlite.cpp
+++ b/src/wallet/sqlite.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <wallet/sqlite.h>
#include <chainparams.h>
@@ -110,7 +114,7 @@ Mutex SQLiteDatabase::g_sqlite_mutex;
int SQLiteDatabase::g_sqlite_count = 0;
SQLiteDatabase::SQLiteDatabase(const fs::path& dir_path, const fs::path& file_path, const DatabaseOptions& options, bool mock)
- : WalletDatabase(), m_mock(mock), m_dir_path(fs::PathToString(dir_path)), m_file_path(fs::PathToString(file_path)), m_use_unsafe_sync(options.use_unsafe_sync)
+ : WalletDatabase(), m_mock(mock), m_dir_path(fs::PathToString(dir_path)), m_file_path(fs::PathToString(file_path)), m_write_semaphore(1), m_use_unsafe_sync(options.use_unsafe_sync)
{
{
LOCK(g_sqlite_mutex);
@@ -377,6 +381,17 @@ void SQLiteDatabase::Close()
m_db = nullptr;
}
+bool SQLiteDatabase::HasActiveTxn()
+{
+ // 'sqlite3_get_autocommit' returns true by default, and false if a transaction has begun and not been committed or rolled back.
+ return m_db && sqlite3_get_autocommit(m_db) == 0;
+}
+
+int SQliteExecHandler::Exec(SQLiteDatabase& database, const std::string& statement)
+{
+ return sqlite3_exec(database.m_db, statement.data(), nullptr, nullptr, nullptr);
+}
+
std::unique_ptr<DatabaseBatch> SQLiteDatabase::MakeBatch(bool flush_on_close)
{
// We ignore flush_on_close because we don't do manual flushing for SQLite
@@ -394,12 +409,18 @@ SQLiteBatch::SQLiteBatch(SQLiteDatabase& database)
void SQLiteBatch::Close()
{
- // If m_db is in a transaction (i.e. not in autocommit mode), then abort the transaction in progress
- if (m_database.m_db && sqlite3_get_autocommit(m_database.m_db) == 0) {
+ bool force_conn_refresh = false;
+
+ // If we began a transaction, and it wasn't committed, abort the transaction in progress
+ if (m_txn) {
if (TxnAbort()) {
LogPrintf("SQLiteBatch: Batch closed unexpectedly without the transaction being explicitly committed or aborted\n");
} else {
- LogPrintf("SQLiteBatch: Batch closed and failed to abort transaction\n");
+ // If transaction cannot be aborted, it means there is a bug or there has been data corruption. Try to recover in this case
+ // by closing and reopening the database. Closing the database should also ensure that any changes made since the transaction
+ // was opened will be rolled back and future transactions can succeed without committing old data.
+ force_conn_refresh = true;
+ LogPrintf("SQLiteBatch: Batch closed and failed to abort transaction, resetting db connection..\n");
}
}
@@ -420,6 +441,19 @@ void SQLiteBatch::Close()
}
*stmt_prepared = nullptr;
}
+
+ if (force_conn_refresh) {
+ m_database.Close();
+ try {
+ m_database.Open();
+ // If TxnAbort failed and we refreshed the connection, the semaphore was not released, so release it here to avoid deadlocks on future writes.
+ m_database.m_write_semaphore.post();
+ } catch (const std::runtime_error&) {
+ // If open fails, cleanup this object and rethrow the exception
+ m_database.Close();
+ throw;
+ }
+ }
}
bool SQLiteBatch::ReadKey(DataStream&& key, DataStream& value)
@@ -465,6 +499,9 @@ bool SQLiteBatch::WriteKey(DataStream&& key, DataStream&& value, bool overwrite)
if (!BindBlobToStatement(stmt, 1, key, "key")) return false;
if (!BindBlobToStatement(stmt, 2, value, "value")) return false;
+ // Acquire semaphore if not previously acquired when creating a transaction.
+ if (!m_txn) m_database.m_write_semaphore.wait();
+
// Execute
int res = sqlite3_step(stmt);
sqlite3_clear_bindings(stmt);
@@ -472,6 +509,9 @@ bool SQLiteBatch::WriteKey(DataStream&& key, DataStream&& value, bool overwrite)
if (res != SQLITE_DONE) {
LogPrintf("%s: Unable to execute statement: %s\n", __func__, sqlite3_errstr(res));
}
+
+ if (!m_txn) m_database.m_write_semaphore.post();
+
return res == SQLITE_DONE;
}
@@ -483,6 +523,9 @@ bool SQLiteBatch::ExecStatement(sqlite3_stmt* stmt, Span<const std::byte> blob)
// Bind: leftmost parameter in statement is index 1
if (!BindBlobToStatement(stmt, 1, blob, "key")) return false;
+ // Acquire semaphore if not previously acquired when creating a transaction.
+ if (!m_txn) m_database.m_write_semaphore.wait();
+
// Execute
int res = sqlite3_step(stmt);
sqlite3_clear_bindings(stmt);
@@ -490,6 +533,9 @@ bool SQLiteBatch::ExecStatement(sqlite3_stmt* stmt, Span<const std::byte> blob)
if (res != SQLITE_DONE) {
LogPrintf("%s: Unable to execute statement: %s\n", __func__, sqlite3_errstr(res));
}
+
+ if (!m_txn) m_database.m_write_semaphore.post();
+
return res == SQLITE_DONE;
}
@@ -606,30 +652,43 @@ std::unique_ptr<DatabaseCursor> SQLiteBatch::GetNewPrefixCursor(Span<const std::
bool SQLiteBatch::TxnBegin()
{
- if (!m_database.m_db || sqlite3_get_autocommit(m_database.m_db) == 0) return false;
- int res = sqlite3_exec(m_database.m_db, "BEGIN TRANSACTION", nullptr, nullptr, nullptr);
+ if (!m_database.m_db || m_txn) return false;
+ m_database.m_write_semaphore.wait();
+ Assert(!m_database.HasActiveTxn());
+ int res = Assert(m_exec_handler)->Exec(m_database, "BEGIN TRANSACTION");
if (res != SQLITE_OK) {
LogPrintf("SQLiteBatch: Failed to begin the transaction\n");
+ m_database.m_write_semaphore.post();
+ } else {
+ m_txn = true;
}
return res == SQLITE_OK;
}
bool SQLiteBatch::TxnCommit()
{
- if (!m_database.m_db || sqlite3_get_autocommit(m_database.m_db) != 0) return false;
- int res = sqlite3_exec(m_database.m_db, "COMMIT TRANSACTION", nullptr, nullptr, nullptr);
+ if (!m_database.m_db || !m_txn) return false;
+ Assert(m_database.HasActiveTxn());
+ int res = Assert(m_exec_handler)->Exec(m_database, "COMMIT TRANSACTION");
if (res != SQLITE_OK) {
LogPrintf("SQLiteBatch: Failed to commit the transaction\n");
+ } else {
+ m_txn = false;
+ m_database.m_write_semaphore.post();
}
return res == SQLITE_OK;
}
bool SQLiteBatch::TxnAbort()
{
- if (!m_database.m_db || sqlite3_get_autocommit(m_database.m_db) != 0) return false;
- int res = sqlite3_exec(m_database.m_db, "ROLLBACK TRANSACTION", nullptr, nullptr, nullptr);
+ if (!m_database.m_db || !m_txn) return false;
+ Assert(m_database.HasActiveTxn());
+ int res = Assert(m_exec_handler)->Exec(m_database, "ROLLBACK TRANSACTION");
if (res != SQLITE_OK) {
LogPrintf("SQLiteBatch: Failed to abort the transaction\n");
+ } else {
+ m_txn = false;
+ m_database.m_write_semaphore.post();
}
return res == SQLITE_OK;
}
diff --git a/src/wallet/sqlite.h b/src/wallet/sqlite.h
index f1ce0567e1..0a3243fe19 100644
--- a/src/wallet/sqlite.h
+++ b/src/wallet/sqlite.h
@@ -36,11 +36,21 @@ public:
Status Next(DataStream& key, DataStream& value) override;
};
+/** Class responsible for executing SQL statements in SQLite databases.
+ * Methods are virtual so they can be overridden by unit tests testing unusual database conditions. */
+class SQliteExecHandler
+{
+public:
+ virtual ~SQliteExecHandler() {}
+ virtual int Exec(SQLiteDatabase& database, const std::string& statement);
+};
+
/** RAII class that provides access to a WalletDatabase */
class SQLiteBatch : public DatabaseBatch
{
private:
SQLiteDatabase& m_database;
+ std::unique_ptr<SQliteExecHandler> m_exec_handler{std::make_unique<SQliteExecHandler>()};
sqlite3_stmt* m_read_stmt{nullptr};
sqlite3_stmt* m_insert_stmt{nullptr};
@@ -48,6 +58,18 @@ private:
sqlite3_stmt* m_delete_stmt{nullptr};
sqlite3_stmt* m_delete_prefix_stmt{nullptr};
+ /** Whether this batch has started a database transaction and whether it owns SQLiteDatabase::m_write_semaphore.
+ * If the batch starts a db tx, it acquires the semaphore and sets this to true, keeping the semaphore
+ * until the transaction ends to prevent other batch objects from writing to the database.
+ *
+ * If this batch did not start a transaction, the semaphore is acquired transiently when writing and m_txn
+ * is not set.
+ *
+ * m_txn is different from HasActiveTxn() as it is only true when this batch has started the transaction,
+ * not just when any batch has started a transaction.
+ */
+ bool m_txn{false};
+
void SetupSQLStatements();
bool ExecStatement(sqlite3_stmt* stmt, Span<const std::byte> blob);
@@ -61,6 +83,8 @@ public:
explicit SQLiteBatch(SQLiteDatabase& database);
~SQLiteBatch() override { Close(); }
+ void SetExecHandler(std::unique_ptr<SQliteExecHandler>&& handler) { m_exec_handler = std::move(handler); }
+
/* No-op. See comment on SQLiteDatabase::Flush */
void Flush() override {}
@@ -103,6 +127,10 @@ public:
~SQLiteDatabase();
+ // Batches must acquire this semaphore on writing, and release when done writing.
+ // This ensures that only one batch is modifying the database at a time.
+ CSemaphore m_write_semaphore;
+
bool Verify(bilingual_str& error);
/** Open the database if it is not already opened */
@@ -142,6 +170,9 @@ public:
/** Make a SQLiteBatch connected to this database */
std::unique_ptr<DatabaseBatch> MakeBatch(bool flush_on_close = true) override;
+ /** Return true if there is an on-going txn in this connection */
+ bool HasActiveTxn();
+
sqlite3* m_db{nullptr};
bool m_use_unsafe_sync;
};
diff --git a/src/wallet/test/coinselector_tests.cpp b/src/wallet/test/coinselector_tests.cpp
index 9fea14145f..9a349f0992 100644
--- a/src/wallet/test/coinselector_tests.cpp
+++ b/src/wallet/test/coinselector_tests.cpp
@@ -1090,6 +1090,216 @@ BOOST_AUTO_TEST_CASE(effective_value_test)
BOOST_CHECK_EQUAL(output5.GetEffectiveValue(), nValue); // The effective value should be equal to the absolute value if input_bytes is -1
}
+static util::Result<SelectionResult> CoinGrinder(const CAmount& target,
+ const CoinSelectionParams& cs_params,
+ const node::NodeContext& m_node,
+ int max_weight,
+ std::function<CoinsResult(CWallet&)> coin_setup)
+{
+ std::unique_ptr<CWallet> wallet = NewWallet(m_node);
+ CoinEligibilityFilter filter(0, 0, 0); // accept all coins without ancestors
+ Groups group = GroupOutputs(*wallet, coin_setup(*wallet), cs_params, {{filter}})[filter].all_groups;
+ return CoinGrinder(group.positive_group, target, cs_params.m_min_change_target, max_weight);
+}
+
+BOOST_AUTO_TEST_CASE(coin_grinder_tests)
+{
+ // Test Coin Grinder:
+ // 1) Insufficient funds, select all provided coins and fail.
+ // 2) Exceeded max weight, coin selection always surpasses the max allowed weight.
+ // 3) Select coins without surpassing the max weight (some coins surpasses the max allowed weight, some others not)
+ // 4) Test that two less valuable UTXOs with a combined lower weight are preferred over a more valuable heavier UTXO
+ // 5) Test finding a solution in a UTXO pool with mixed weights
+ // 6) Test that the lightest solution among many clones is found
+ // 7) Test that lots of tiny UTXOs can be skipped if they are too heavy while there are enough funds in lookahead
+
+ FastRandomContext rand;
+ CoinSelectionParams dummy_params{ // Only used to provide the 'avoid_partial' flag.
+ rand,
+ /*change_output_size=*/34,
+ /*change_spend_size=*/68,
+ /*min_change_target=*/CENT,
+ /*effective_feerate=*/CFeeRate(5000),
+ /*long_term_feerate=*/CFeeRate(2000),
+ /*discard_feerate=*/CFeeRate(1000),
+ /*tx_noinputs_size=*/10 + 34, // static header size + output size
+ /*avoid_partial=*/false,
+ };
+
+ {
+ // #########################################################
+ // 1) Insufficient funds, select all provided coins and fail
+ // #########################################################
+ CAmount target = 49.5L * COIN;
+ int max_weight = 10'000; // high enough to not fail for this reason.
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_weight, [&](CWallet& wallet) {
+ CoinsResult available_coins;
+ for (int j = 0; j < 10; ++j) {
+ add_coin(available_coins, wallet, CAmount(1 * COIN));
+ add_coin(available_coins, wallet, CAmount(2 * COIN));
+ }
+ return available_coins;
+ });
+ BOOST_CHECK(!res);
+ BOOST_CHECK(util::ErrorString(res).empty()); // empty means "insufficient funds"
+ }
+
+ {
+ // ###########################
+ // 2) Test max weight exceeded
+ // ###########################
+ CAmount target = 29.5L * COIN;
+ int max_weight = 3000;
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_weight, [&](CWallet& wallet) {
+ CoinsResult available_coins;
+ for (int j = 0; j < 10; ++j) {
+ add_coin(available_coins, wallet, CAmount(1 * COIN), CFeeRate(5000), 144, false, 0, true);
+ add_coin(available_coins, wallet, CAmount(2 * COIN), CFeeRate(5000), 144, false, 0, true);
+ }
+ return available_coins;
+ });
+ BOOST_CHECK(!res);
+ BOOST_CHECK(util::ErrorString(res).original.find("The inputs size exceeds the maximum weight") != std::string::npos);
+ }
+
+ {
+ // ###############################################################################################################
+ // 3) Test selection when some coins surpass the max allowed weight while others not. --> must find a good solution
+ // ################################################################################################################
+ CAmount target = 25.33L * COIN;
+ int max_weight = 10'000; // WU
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_weight, [&](CWallet& wallet) {
+ CoinsResult available_coins;
+ for (int j = 0; j < 60; ++j) { // 60 UTXO --> 19,8 BTC total --> 60 × 272 WU = 16320 WU
+ add_coin(available_coins, wallet, CAmount(0.33 * COIN), CFeeRate(5000), 144, false, 0, true);
+ }
+ for (int i = 0; i < 10; i++) { // 10 UTXO --> 20 BTC total --> 10 × 272 WU = 2720 WU
+ add_coin(available_coins, wallet, CAmount(2 * COIN), CFeeRate(5000), 144, false, 0, true);
+ }
+ return available_coins;
+ });
+ BOOST_CHECK(res);
+ // Demonstrate how following improvements reduce iteration count and catch any regressions in the future.
+ size_t expected_attempts = 37;
+ BOOST_CHECK_MESSAGE(res->GetSelectionsEvaluated() == expected_attempts, strprintf("Expected %i attempts, but got %i", expected_attempts, res->GetSelectionsEvaluated()));
+ }
+
+ {
+ // #################################################################################################################
+ // 4) Test that two less valuable UTXOs with a combined lower weight are preferred over a more valuable heavier UTXO
+ // #################################################################################################################
+ CAmount target = 1.9L * COIN;
+ int max_weight = 400'000; // WU
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_weight, [&](CWallet& wallet) {
+ CoinsResult available_coins;
+ add_coin(available_coins, wallet, CAmount(2 * COIN), CFeeRate(5000), 144, false, 0, true, 148);
+ add_coin(available_coins, wallet, CAmount(1 * COIN), CFeeRate(5000), 144, false, 0, true, 68);
+ add_coin(available_coins, wallet, CAmount(1 * COIN), CFeeRate(5000), 144, false, 0, true, 68);
+ return available_coins;
+ });
+ SelectionResult expected_result(CAmount(0), SelectionAlgorithm::CG);
+ add_coin(1 * COIN, 1, expected_result);
+ add_coin(1 * COIN, 2, expected_result);
+ BOOST_CHECK(EquivalentResult(expected_result, *res));
+ // Demonstrate how following improvements reduce iteration count and catch any regressions in the future.
+ size_t expected_attempts = 3;
+ BOOST_CHECK_MESSAGE(res->GetSelectionsEvaluated() == expected_attempts, strprintf("Expected %i attempts, but got %i", expected_attempts, res->GetSelectionsEvaluated()));
+ }
+
+ {
+ // ###############################################################################################################
+ // 5) Test finding a solution in a UTXO pool with mixed weights
+ // ################################################################################################################
+ CAmount target = 30L * COIN;
+ int max_weight = 400'000; // WU
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_weight, [&](CWallet& wallet) {
+ CoinsResult available_coins;
+ for (int j = 0; j < 5; ++j) {
+ // Add heavy coins {3, 6, 9, 12, 15}
+ add_coin(available_coins, wallet, CAmount((3 + 3 * j) * COIN), CFeeRate(5000), 144, false, 0, true, 350);
+ // Add medium coins {2, 5, 8, 11, 14}
+ add_coin(available_coins, wallet, CAmount((2 + 3 * j) * COIN), CFeeRate(5000), 144, false, 0, true, 250);
+ // Add light coins {1, 4, 7, 10, 13}
+ add_coin(available_coins, wallet, CAmount((1 + 3 * j) * COIN), CFeeRate(5000), 144, false, 0, true, 150);
+ }
+ return available_coins;
+ });
+ BOOST_CHECK(res);
+ SelectionResult expected_result(CAmount(0), SelectionAlgorithm::CG);
+ add_coin(14 * COIN, 1, expected_result);
+ add_coin(13 * COIN, 2, expected_result);
+ add_coin(4 * COIN, 3, expected_result);
+ BOOST_CHECK(EquivalentResult(expected_result, *res));
+ // Demonstrate how following improvements reduce iteration count and catch any regressions in the future.
+ size_t expected_attempts = 92;
+ BOOST_CHECK_MESSAGE(res->GetSelectionsEvaluated() == expected_attempts, strprintf("Expected %i attempts, but got %i", expected_attempts, res->GetSelectionsEvaluated()));
+ }
+
+ {
+ // #################################################################################################################
+ // 6) Test that the lightest solution among many clones is found
+ // #################################################################################################################
+ CAmount target = 9.9L * COIN;
+ int max_weight = 400'000; // WU
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_weight, [&](CWallet& wallet) {
+ CoinsResult available_coins;
+ // Expected Result: 4 + 3 + 2 + 1 = 10 BTC at 400 vB
+ add_coin(available_coins, wallet, CAmount(4 * COIN), CFeeRate(5000), 144, false, 0, true, 100);
+ add_coin(available_coins, wallet, CAmount(3 * COIN), CFeeRate(5000), 144, false, 0, true, 100);
+ add_coin(available_coins, wallet, CAmount(2 * COIN), CFeeRate(5000), 144, false, 0, true, 100);
+ add_coin(available_coins, wallet, CAmount(1 * COIN), CFeeRate(5000), 144, false, 0, true, 100);
+ // Distracting clones:
+ for (int j = 0; j < 100; ++j) {
+ add_coin(available_coins, wallet, CAmount(8 * COIN), CFeeRate(5000), 144, false, 0, true, 1000);
+ }
+ for (int j = 0; j < 100; ++j) {
+ add_coin(available_coins, wallet, CAmount(7 * COIN), CFeeRate(5000), 144, false, 0, true, 800);
+ }
+ for (int j = 0; j < 100; ++j) {
+ add_coin(available_coins, wallet, CAmount(6 * COIN), CFeeRate(5000), 144, false, 0, true, 600);
+ }
+ for (int j = 0; j < 100; ++j) {
+ add_coin(available_coins, wallet, CAmount(5 * COIN), CFeeRate(5000), 144, false, 0, true, 400);
+ }
+ return available_coins;
+ });
+ SelectionResult expected_result(CAmount(0), SelectionAlgorithm::CG);
+ add_coin(4 * COIN, 0, expected_result);
+ add_coin(3 * COIN, 0, expected_result);
+ add_coin(2 * COIN, 0, expected_result);
+ add_coin(1 * COIN, 0, expected_result);
+ BOOST_CHECK(EquivalentResult(expected_result, *res));
+ // Demonstrate how following improvements reduce iteration count and catch any regressions in the future.
+ size_t expected_attempts = 38;
+ BOOST_CHECK_MESSAGE(res->GetSelectionsEvaluated() == expected_attempts, strprintf("Expected %i attempts, but got %i", expected_attempts, res->GetSelectionsEvaluated()));
+ }
+
+ {
+ // #################################################################################################################
+ // 7) Test that lots of tiny UTXOs can be skipped if they are too heavy while there are enough funds in lookahead
+ // #################################################################################################################
+ CAmount target = 1.9L * COIN;
+ int max_weight = 40000; // WU
+ const auto& res = CoinGrinder(target, dummy_params, m_node, max_weight, [&](CWallet& wallet) {
+ CoinsResult available_coins;
+ add_coin(available_coins, wallet, CAmount(1.8 * COIN), CFeeRate(5000), 144, false, 0, true, 2500);
+ add_coin(available_coins, wallet, CAmount(1 * COIN), CFeeRate(5000), 144, false, 0, true, 1000);
+ add_coin(available_coins, wallet, CAmount(1 * COIN), CFeeRate(5000), 144, false, 0, true, 1000);
+ for (int j = 0; j < 100; ++j) {
+ // make a 100 unique coins only differing by one sat
+ add_coin(available_coins, wallet, CAmount(0.01 * COIN + j), CFeeRate(5000), 144, false, 0, true, 110);
+ }
+ return available_coins;
+ });
+ SelectionResult expected_result(CAmount(0), SelectionAlgorithm::CG);
+ add_coin(1 * COIN, 1, expected_result);
+ add_coin(1 * COIN, 2, expected_result);
+ BOOST_CHECK(EquivalentResult(expected_result, *res));
+ // Demonstrate how following improvements reduce iteration count and catch any regressions in the future.
+ size_t expected_attempts = 7;
+ BOOST_CHECK_MESSAGE(res->GetSelectionsEvaluated() == expected_attempts, strprintf("Expected %i attempts, but got %i", expected_attempts, res->GetSelectionsEvaluated()));
+ }
+}
static util::Result<SelectionResult> SelectCoinsSRD(const CAmount& target,
const CoinSelectionParams& cs_params,
@@ -1150,6 +1360,7 @@ BOOST_AUTO_TEST_CASE(srd_tests)
const auto& res = SelectCoinsSRD(target, dummy_params, m_node, max_weight, [&](CWallet& wallet) {
CoinsResult available_coins;
for (int j = 0; j < 10; ++j) {
+ /* 10 × 1 BTC + 10 × 2 BTC = 30 BTC. 20 × 272 WU = 5440 WU */
add_coin(available_coins, wallet, CAmount(1 * COIN), CFeeRate(0), 144, false, 0, true);
add_coin(available_coins, wallet, CAmount(2 * COIN), CFeeRate(0), 144, false, 0, true);
}
diff --git a/src/wallet/test/db_tests.cpp b/src/wallet/test/db_tests.cpp
index d341e84d9b..f783424df8 100644
--- a/src/wallet/test/db_tests.cpp
+++ b/src/wallet/test/db_tests.cpp
@@ -2,6 +2,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <boost/test/unit_test.hpp>
#include <test/util/setup_common.h>
@@ -205,5 +209,155 @@ BOOST_AUTO_TEST_CASE(db_cursor_prefix_byte_test)
}
}
+BOOST_AUTO_TEST_CASE(db_availability_after_write_error)
+{
+ // Ensures the database remains accessible without deadlocking after a write error.
+ // To simulate the behavior, record overwrites are disallowed, and the test verifies
+ // that the database remains active after failing to store an existing record.
+ for (const auto& database : TestDatabases(m_path_root)) {
+ // Write original record
+ std::unique_ptr<DatabaseBatch> batch = database->MakeBatch();
+ std::string key = "key";
+ std::string value = "value";
+ std::string value2 = "value_2";
+ BOOST_CHECK(batch->Write(key, value));
+ // Attempt to overwrite the record (expect failure)
+ BOOST_CHECK(!batch->Write(key, value2, /*fOverwrite=*/false));
+ // Successfully overwrite the record
+ BOOST_CHECK(batch->Write(key, value2, /*fOverwrite=*/true));
+ // Sanity-check; read and verify the overwritten value
+ std::string read_value;
+ BOOST_CHECK(batch->Read(key, read_value));
+ BOOST_CHECK_EQUAL(read_value, value2);
+ }
+}
+
+// Verify 'ErasePrefix' functionality using db keys similar to the ones used by the wallet.
+// Keys are in the form of std::pair<TYPE, ENTRY_ID>
+BOOST_AUTO_TEST_CASE(erase_prefix)
+{
+ const std::string key = "key";
+ const std::string key2 = "key2";
+ const std::string value = "value";
+ const std::string value2 = "value_2";
+ auto make_key = [](std::string type, std::string id) { return std::make_pair(type, id); };
+
+ for (const auto& database : TestDatabases(m_path_root)) {
+ std::unique_ptr<DatabaseBatch> batch = database->MakeBatch();
+
+ // Write two entries with the same key type prefix, a third one with a different prefix
+ // and a fourth one with the type-id values inverted
+ BOOST_CHECK(batch->Write(make_key(key, value), value));
+ BOOST_CHECK(batch->Write(make_key(key, value2), value2));
+ BOOST_CHECK(batch->Write(make_key(key2, value), value));
+ BOOST_CHECK(batch->Write(make_key(value, key), value));
+
+ // Erase the ones with the same prefix and verify result
+ BOOST_CHECK(batch->TxnBegin());
+ BOOST_CHECK(batch->ErasePrefix(DataStream() << key));
+ BOOST_CHECK(batch->TxnCommit());
+
+ BOOST_CHECK(!batch->Exists(make_key(key, value)));
+ BOOST_CHECK(!batch->Exists(make_key(key, value2)));
+ // Also verify that entries with a different prefix were not erased
+ BOOST_CHECK(batch->Exists(make_key(key2, value)));
+ BOOST_CHECK(batch->Exists(make_key(value, key)));
+ }
+}
+
+#ifdef USE_SQLITE
+
+// Test-only statement execution error
+constexpr int TEST_SQLITE_ERROR = -999;
+
+class DbExecBlocker : public SQliteExecHandler
+{
+private:
+ SQliteExecHandler m_base_exec;
+ std::set<std::string> m_blocked_statements;
+public:
+ DbExecBlocker(std::set<std::string> blocked_statements) : m_blocked_statements(blocked_statements) {}
+ int Exec(SQLiteDatabase& database, const std::string& statement) override {
+ if (m_blocked_statements.contains(statement)) return TEST_SQLITE_ERROR;
+ return m_base_exec.Exec(database, statement);
+ }
+};
+
+BOOST_AUTO_TEST_CASE(txn_close_failure_dangling_txn)
+{
+ // Verifies that there is no active dangling, to-be-reversed db txn
+ // after the batch object that initiated it is destroyed.
+ DatabaseOptions options;
+ DatabaseStatus status;
+ bilingual_str error;
+ std::unique_ptr<SQLiteDatabase> database = MakeSQLiteDatabase(m_path_root / "sqlite", options, status, error);
+
+ std::string key = "key";
+ std::string value = "value";
+
+ std::unique_ptr<SQLiteBatch> batch = std::make_unique<SQLiteBatch>(*database);
+ BOOST_CHECK(batch->TxnBegin());
+ BOOST_CHECK(batch->Write(key, value));
+ // Set a handler to prevent txn abortion during destruction.
+ // Mimicking a db statement execution failure.
+ batch->SetExecHandler(std::make_unique<DbExecBlocker>(std::set<std::string>{"ROLLBACK TRANSACTION"}));
+ // Destroy batch
+ batch.reset();
+
+ // Ensure there is no dangling, to-be-reversed db txn
+ BOOST_CHECK(!database->HasActiveTxn());
+
+ // And, just as a sanity check; verify that new batchs only write what they suppose to write
+ // and nothing else.
+ std::string key2 = "key2";
+ std::unique_ptr<SQLiteBatch> batch2 = std::make_unique<SQLiteBatch>(*database);
+ BOOST_CHECK(batch2->Write(key2, value));
+ // The first key must not exist
+ BOOST_CHECK(!batch2->Exists(key));
+}
+
+BOOST_AUTO_TEST_CASE(concurrent_txn_dont_interfere)
+{
+ std::string key = "key";
+ std::string value = "value";
+ std::string value2 = "value_2";
+
+ DatabaseOptions options;
+ DatabaseStatus status;
+ bilingual_str error;
+ const auto& database = MakeSQLiteDatabase(m_path_root / "sqlite", options, status, error);
+
+ std::unique_ptr<DatabaseBatch> handler = Assert(database)->MakeBatch();
+
+ // Verify concurrent db transactions does not interfere between each other.
+ // Start db txn, write key and check the key does exist within the db txn.
+ BOOST_CHECK(handler->TxnBegin());
+ BOOST_CHECK(handler->Write(key, value));
+ BOOST_CHECK(handler->Exists(key));
+
+ // But, the same key, does not exist in another handler
+ std::unique_ptr<DatabaseBatch> handler2 = Assert(database)->MakeBatch();
+ BOOST_CHECK(handler2->Exists(key));
+
+ // Attempt to commit the handler txn calling the handler2 methods.
+ // Which, must not be possible.
+ BOOST_CHECK(!handler2->TxnCommit());
+ BOOST_CHECK(!handler2->TxnAbort());
+
+ // Only the first handler can commit the changes.
+ BOOST_CHECK(handler->TxnCommit());
+ // And, once commit is completed, handler2 can read the record
+ std::string read_value;
+ BOOST_CHECK(handler2->Read(key, read_value));
+ BOOST_CHECK_EQUAL(read_value, value);
+
+ // Also, once txn is committed, single write statements are re-enabled.
+ // Which means that handler2 can read the record changes directly.
+ BOOST_CHECK(handler->Write(key, value2, /*fOverwrite=*/true));
+ BOOST_CHECK(handler2->Read(key, read_value));
+ BOOST_CHECK_EQUAL(read_value, value2);
+}
+#endif // USE_SQLITE
+
BOOST_AUTO_TEST_SUITE_END()
} // namespace wallet
diff --git a/src/wallet/test/fuzz/coinselection.cpp b/src/wallet/test/fuzz/coinselection.cpp
index 87d419493b..297432de9e 100644
--- a/src/wallet/test/fuzz/coinselection.cpp
+++ b/src/wallet/test/fuzz/coinselection.cpp
@@ -11,6 +11,7 @@
#include <test/util/setup_common.h>
#include <wallet/coinselection.h>
+#include <numeric>
#include <vector>
namespace wallet {
@@ -77,6 +78,144 @@ static SelectionResult ManualSelection(std::vector<COutput>& utxos, const CAmoun
// Returns true if the result contains an error and the message is not empty
static bool HasErrorMsg(const util::Result<SelectionResult>& res) { return !util::ErrorString(res).empty(); }
+FUZZ_TARGET(coin_grinder)
+{
+ FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
+ std::vector<COutput> utxo_pool;
+
+ const CAmount target{fuzzed_data_provider.ConsumeIntegralInRange<CAmount>(1, MAX_MONEY)};
+
+ FastRandomContext fast_random_context{ConsumeUInt256(fuzzed_data_provider)};
+ CoinSelectionParams coin_params{fast_random_context};
+ coin_params.m_subtract_fee_outputs = fuzzed_data_provider.ConsumeBool();
+ coin_params.m_long_term_feerate = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)};
+ coin_params.m_effective_feerate = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)};
+ coin_params.change_output_size = fuzzed_data_provider.ConsumeIntegralInRange<int>(10, 1000);
+ coin_params.change_spend_size = fuzzed_data_provider.ConsumeIntegralInRange<int>(10, 1000);
+ coin_params.m_cost_of_change= coin_params.m_effective_feerate.GetFee(coin_params.change_output_size) + coin_params.m_long_term_feerate.GetFee(coin_params.change_spend_size);
+ coin_params.m_change_fee = coin_params.m_effective_feerate.GetFee(coin_params.change_output_size);
+ // For other results to be comparable to SRD, we must align the change_target with SRD’s hardcoded behavior
+ coin_params.m_min_change_target = CHANGE_LOWER + coin_params.m_change_fee;
+
+ // Create some coins
+ CAmount total_balance{0};
+ CAmount max_spendable{0};
+ int next_locktime{0};
+ LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), 10000)
+ {
+ const int n_input{fuzzed_data_provider.ConsumeIntegralInRange<int>(0, 10)};
+ const int n_input_bytes{fuzzed_data_provider.ConsumeIntegralInRange<int>(41, 10000)};
+ const CAmount amount{fuzzed_data_provider.ConsumeIntegralInRange<CAmount>(1, MAX_MONEY)};
+ if (total_balance + amount >= MAX_MONEY) {
+ break;
+ }
+ AddCoin(amount, n_input, n_input_bytes, ++next_locktime, utxo_pool, coin_params.m_effective_feerate);
+ total_balance += amount;
+ CAmount eff_value = amount - coin_params.m_effective_feerate.GetFee(n_input_bytes);
+ max_spendable += eff_value;
+ }
+
+ std::vector<OutputGroup> group_pos;
+ GroupCoins(fuzzed_data_provider, utxo_pool, coin_params, /*positive_only=*/true, group_pos);
+
+ // Run coinselection algorithms
+ auto result_cg = CoinGrinder(group_pos, target, coin_params.m_min_change_target, MAX_STANDARD_TX_WEIGHT);
+ if (target + coin_params.m_min_change_target > max_spendable || HasErrorMsg(result_cg)) return; // We only need to compare algorithms if CoinGrinder has a solution
+ assert(result_cg);
+ if (!result_cg->GetAlgoCompleted()) return; // Bail out if CoinGrinder solution is not optimal
+
+ auto result_srd = SelectCoinsSRD(group_pos, target, coin_params.m_change_fee, fast_random_context, MAX_STANDARD_TX_WEIGHT);
+ if (result_srd && result_srd->GetChange(CHANGE_LOWER, coin_params.m_change_fee) > 0) { // exclude any srd solutions that don’t have change, err on excluding
+ assert(result_srd->GetWeight() >= result_cg->GetWeight());
+ }
+
+ auto result_knapsack = KnapsackSolver(group_pos, target, coin_params.m_min_change_target, fast_random_context, MAX_STANDARD_TX_WEIGHT);
+ if (result_knapsack && result_knapsack->GetChange(CHANGE_LOWER, coin_params.m_change_fee) > 0) { // exclude any knapsack solutions that don’t have change, err on excluding
+ assert(result_knapsack->GetWeight() >= result_cg->GetWeight());
+ }
+}
+
+FUZZ_TARGET(coin_grinder_is_optimal)
+{
+ FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
+
+ FastRandomContext fast_random_context{ConsumeUInt256(fuzzed_data_provider)};
+ CoinSelectionParams coin_params{fast_random_context};
+ coin_params.m_subtract_fee_outputs = false;
+ // Set effective feerate up to MAX_MONEY sats per 1'000'000 vB (2'100'000'000 sat/vB = 21'000 BTC/kvB).
+ coin_params.m_effective_feerate = CFeeRate{ConsumeMoney(fuzzed_data_provider, MAX_MONEY), 1'000'000};
+ coin_params.m_min_change_target = ConsumeMoney(fuzzed_data_provider);
+
+ // Create some coins
+ CAmount max_spendable{0};
+ int next_locktime{0};
+ static constexpr unsigned max_output_groups{16};
+ std::vector<OutputGroup> group_pos;
+ LIMITED_WHILE(fuzzed_data_provider.ConsumeBool(), max_output_groups)
+ {
+ // With maximum m_effective_feerate and n_input_bytes = 1'000'000, input_fee <= MAX_MONEY.
+ const int n_input_bytes{fuzzed_data_provider.ConsumeIntegralInRange<int>(1, 1'000'000)};
+ // Only make UTXOs with positive effective value
+ const CAmount input_fee = coin_params.m_effective_feerate.GetFee(n_input_bytes);
+ // Ensure that each UTXO has at least an effective value of 1 sat
+ const CAmount eff_value{fuzzed_data_provider.ConsumeIntegralInRange<CAmount>(1, MAX_MONEY + group_pos.size() - max_spendable - max_output_groups)};
+ const CAmount amount{eff_value + input_fee};
+ std::vector<COutput> temp_utxo_pool;
+
+ AddCoin(amount, /*n_input=*/0, n_input_bytes, ++next_locktime, temp_utxo_pool, coin_params.m_effective_feerate);
+ max_spendable += eff_value;
+
+ auto output_group = OutputGroup(coin_params);
+ output_group.Insert(std::make_shared<COutput>(temp_utxo_pool.at(0)), /*ancestors=*/0, /*descendants=*/0);
+ group_pos.push_back(output_group);
+ }
+ size_t num_groups = group_pos.size();
+ assert(num_groups <= max_output_groups);
+
+ // Only choose targets below max_spendable
+ const CAmount target{fuzzed_data_provider.ConsumeIntegralInRange<CAmount>(1, std::max(CAmount{1}, max_spendable - coin_params.m_min_change_target))};
+
+ // Brute force optimal solution
+ CAmount best_amount{MAX_MONEY};
+ int best_weight{std::numeric_limits<int>::max()};
+ for (uint32_t pattern = 1; (pattern >> num_groups) == 0; ++pattern) {
+ CAmount subset_amount{0};
+ int subset_weight{0};
+ for (unsigned i = 0; i < num_groups; ++i) {
+ if ((pattern >> i) & 1) {
+ subset_amount += group_pos[i].GetSelectionAmount();
+ subset_weight += group_pos[i].m_weight;
+ }
+ }
+ if ((subset_amount >= target + coin_params.m_min_change_target) && (subset_weight < best_weight || (subset_weight == best_weight && subset_amount < best_amount))) {
+ best_weight = subset_weight;
+ best_amount = subset_amount;
+ }
+ }
+
+ if (best_weight < std::numeric_limits<int>::max()) {
+ // Sufficient funds and acceptable weight: CoinGrinder should find at least one solution
+ int high_max_weight = fuzzed_data_provider.ConsumeIntegralInRange<int>(best_weight, std::numeric_limits<int>::max());
+
+ auto result_cg = CoinGrinder(group_pos, target, coin_params.m_min_change_target, high_max_weight);
+ assert(result_cg);
+ assert(result_cg->GetWeight() <= high_max_weight);
+ assert(result_cg->GetSelectedEffectiveValue() >= target + coin_params.m_min_change_target);
+ assert(best_weight < result_cg->GetWeight() || (best_weight == result_cg->GetWeight() && best_amount <= result_cg->GetSelectedEffectiveValue()));
+ if (result_cg->GetAlgoCompleted()) {
+ // If CoinGrinder exhausted the search space, it must return the optimal solution
+ assert(best_weight == result_cg->GetWeight());
+ assert(best_amount == result_cg->GetSelectedEffectiveValue());
+ }
+ }
+
+ // CoinGrinder cannot ever find a better solution than the brute-forced best, or there is none in the first place
+ int low_max_weight = fuzzed_data_provider.ConsumeIntegralInRange<int>(0, best_weight - 1);
+ auto result_cg = CoinGrinder(group_pos, target, coin_params.m_min_change_target, low_max_weight);
+ // Max_weight should have been exceeded, or there were insufficient funds
+ assert(!result_cg);
+}
+
FUZZ_TARGET(coinselection)
{
FuzzedDataProvider fuzzed_data_provider{buffer.data(), buffer.size()};
diff --git a/src/wallet/test/fuzz/fees.cpp b/src/wallet/test/fuzz/fees.cpp
index 2f7892dc0a..c2e785651a 100644
--- a/src/wallet/test/fuzz/fees.cpp
+++ b/src/wallet/test/fuzz/fees.cpp
@@ -37,6 +37,10 @@ FUZZ_TARGET(wallet_fees, .init = initialize_setup)
}
if (fuzzed_data_provider.ConsumeBool()) {
+ wallet.m_fallback_fee = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)};
+ }
+
+ if (fuzzed_data_provider.ConsumeBool()) {
wallet.m_discard_rate = CFeeRate{ConsumeMoney(fuzzed_data_provider, /*max=*/COIN)};
}
(void)GetDiscardRate(wallet);
@@ -58,6 +62,9 @@ FUZZ_TARGET(wallet_fees, .init = initialize_setup)
if (fuzzed_data_provider.ConsumeBool()) {
coin_control.m_confirm_target = fuzzed_data_provider.ConsumeIntegralInRange<unsigned int>(0, 999'000);
}
+ if (fuzzed_data_provider.ConsumeBool()) {
+ coin_control.m_fee_mode = fuzzed_data_provider.ConsumeBool() ? FeeEstimateMode::CONSERVATIVE : FeeEstimateMode::ECONOMICAL;
+ }
FeeCalculation fee_calculation;
FeeCalculation* maybe_fee_calculation{fuzzed_data_provider.ConsumeBool() ? nullptr : &fee_calculation};
diff --git a/src/wallet/test/fuzz/notifications.cpp b/src/wallet/test/fuzz/notifications.cpp
index 203ab5f606..9a515828fe 100644
--- a/src/wallet/test/fuzz/notifications.cpp
+++ b/src/wallet/test/fuzz/notifications.cpp
@@ -3,7 +3,6 @@
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
#include <addresstype.h>
-#include <common/args.h>
#include <consensus/amount.h>
#include <interfaces/chain.h>
#include <kernel/chain.h>
@@ -89,8 +88,6 @@ void ImportDescriptors(CWallet& wallet, const std::string& seed_insecure)
* Wraps a descriptor wallet for fuzzing.
*/
struct FuzzedWallet {
- ArgsManager args;
- WalletContext context;
std::shared_ptr<CWallet> wallet;
FuzzedWallet(const std::string& name, const std::string& seed_insecure)
{
@@ -132,6 +129,14 @@ struct FuzzedWallet {
}
}
}
+ std::vector<CRecipient> recipients;
+ for (size_t idx = 0; idx < tx.vout.size(); idx++) {
+ const CTxOut& tx_out = tx.vout[idx];
+ CTxDestination dest;
+ ExtractDestination(tx_out.scriptPubKey, dest);
+ CRecipient recipient = {dest, tx_out.nValue, subtract_fee_from_outputs.count(idx) == 1};
+ recipients.push_back(recipient);
+ }
CCoinControl coin_control;
coin_control.m_allow_other_inputs = fuzzed_data_provider.ConsumeBool();
CallOneOf(
@@ -158,7 +163,10 @@ struct FuzzedWallet {
int change_position{fuzzed_data_provider.ConsumeIntegralInRange<int>(-1, tx.vout.size() - 1)};
bilingual_str error;
- (void)FundTransaction(*wallet, tx, change_position, /*lockUnspents=*/false, subtract_fee_from_outputs, coin_control);
+ // Clear tx.vout since it is not meant to be used now that we are passing outputs directly.
+ // This sets us up for a future PR to completely remove tx from the function signature in favor of passing inputs directly
+ tx.vout.clear();
+ (void)FundTransaction(*wallet, tx, recipients, change_position, /*lockUnspents=*/false, coin_control);
}
};
diff --git a/src/wallet/test/fuzz/scriptpubkeyman.cpp b/src/wallet/test/fuzz/scriptpubkeyman.cpp
index b0c955f482..228e9629ed 100644
--- a/src/wallet/test/fuzz/scriptpubkeyman.cpp
+++ b/src/wallet/test/fuzz/scriptpubkeyman.cpp
@@ -49,9 +49,21 @@ void initialize_spkm()
MOCKED_DESC_CONVERTER.Init();
}
+/**
+ * Key derivation is expensive. Deriving deep derivation paths take a lot of compute and we'd rather spend time
+ * elsewhere in this target, like on actually fuzzing the DescriptorScriptPubKeyMan. So rule out strings which could
+ * correspond to a descriptor containing a too large derivation path.
+ */
+static bool TooDeepDerivPath(std::string_view desc)
+{
+ const FuzzBufferType desc_buf{reinterpret_cast<const unsigned char *>(desc.data()), desc.size()};
+ return HasDeepDerivPath(desc_buf);
+}
+
static std::optional<std::pair<WalletDescriptor, FlatSigningProvider>> CreateWalletDescriptor(FuzzedDataProvider& fuzzed_data_provider)
{
const std::string mocked_descriptor{fuzzed_data_provider.ConsumeRandomLengthString()};
+ if (TooDeepDerivPath(mocked_descriptor)) return {};
const auto desc_str{MOCKED_DESC_CONVERTER.GetDescriptor(mocked_descriptor)};
if (!desc_str.has_value()) return std::nullopt;
diff --git a/src/wallet/test/ismine_tests.cpp b/src/wallet/test/ismine_tests.cpp
index 95d5c1b9ce..dfad0e2126 100644
--- a/src/wallet/test/ismine_tests.cpp
+++ b/src/wallet/test/ismine_tests.cpp
@@ -47,8 +47,7 @@ BOOST_AUTO_TEST_CASE(ismine_standard)
pubkeys[i] = keys[i].GetPubKey();
}
- CKey uncompressedKey;
- uncompressedKey.MakeNewKey(false);
+ CKey uncompressedKey = GenerateRandomKey(/*compressed=*/false);
CPubKey uncompressedPubkey = uncompressedKey.GetPubKey();
std::unique_ptr<interfaces::Chain>& chain = m_node.chain;
diff --git a/src/wallet/test/util.cpp b/src/wallet/test/util.cpp
index cbf3ccd1ec..49d206f409 100644
--- a/src/wallet/test/util.cpp
+++ b/src/wallet/test/util.cpp
@@ -71,7 +71,8 @@ std::shared_ptr<CWallet> TestLoadWallet(WalletContext& context)
void TestUnloadWallet(std::shared_ptr<CWallet>&& wallet)
{
- SyncWithValidationInterfaceQueue();
+ // Calls SyncWithValidationInterfaceQueue
+ wallet->chain().waitForNotificationsIfTipChanged({});
wallet->m_chain_notifications_handler.reset();
UnloadWallet(std::move(wallet));
}
diff --git a/src/wallet/test/util.h b/src/wallet/test/util.h
index 8bd238648f..9f2974ece6 100644
--- a/src/wallet/test/util.h
+++ b/src/wallet/test/util.h
@@ -5,6 +5,10 @@
#ifndef BITCOIN_WALLET_TEST_UTIL_H
#define BITCOIN_WALLET_TEST_UTIL_H
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <addresstype.h>
#include <wallet/db.h>
diff --git a/src/wallet/test/wallet_tests.cpp b/src/wallet/test/wallet_tests.cpp
index 1c5ca1483f..3a67b9a433 100644
--- a/src/wallet/test/wallet_tests.cpp
+++ b/src/wallet/test/wallet_tests.cpp
@@ -231,8 +231,7 @@ BOOST_FIXTURE_TEST_CASE(importmulti_rescan, TestChain100Setup)
keys.push_back(key);
key.clear();
key.setObject();
- CKey futureKey;
- futureKey.MakeNewKey(true);
+ CKey futureKey = GenerateRandomKey();
key.pushKV("scriptPubKey", HexStr(GetScriptForRawPubKey(futureKey.GetPubKey())));
key.pushKV("timestamp", newTip->GetBlockTimeMax() + TIMESTAMP_WINDOW + 1);
key.pushKV("internal", UniValue(true));
@@ -446,9 +445,11 @@ BOOST_FIXTURE_TEST_CASE(LoadReceiveRequests, TestingSetup)
auto requests = wallet->GetAddressReceiveRequests();
auto erequests = {"val_rr11", "val_rr20"};
BOOST_CHECK_EQUAL_COLLECTIONS(requests.begin(), requests.end(), std::begin(erequests), std::end(erequests));
- WalletBatch batch{wallet->GetDatabase()};
- BOOST_CHECK(batch.WriteAddressPreviouslySpent(PKHash(), false));
- BOOST_CHECK(batch.EraseAddressData(ScriptHash()));
+ RunWithinTxn(wallet->GetDatabase(), /*process_desc*/"test", [](WalletBatch& batch){
+ BOOST_CHECK(batch.WriteAddressPreviouslySpent(PKHash(), false));
+ BOOST_CHECK(batch.EraseAddressData(ScriptHash()));
+ return true;
+ });
});
TestLoadWallet(name, format, [](std::shared_ptr<CWallet> wallet) EXCLUSIVE_LOCKS_REQUIRED(wallet->cs_wallet) {
BOOST_CHECK(!wallet->IsAddressPreviouslySpent(PKHash()));
@@ -704,8 +705,7 @@ BOOST_FIXTURE_TEST_CASE(wallet_disableprivkeys, TestChain100Setup)
static size_t CalculateNestedKeyhashInputSize(bool use_max_sig)
{
// Generate ephemeral valid pubkey
- CKey key;
- key.MakeNewKey(true);
+ CKey key = GenerateRandomKey();
CPubKey pubkey = key.GetPubKey();
// Generate pubkey hash
@@ -789,8 +789,7 @@ BOOST_FIXTURE_TEST_CASE(CreateWallet, TestChain100Setup)
context.args = &m_args;
context.chain = m_node.chain.get();
auto wallet = TestLoadWallet(context);
- CKey key;
- key.MakeNewKey(true);
+ CKey key = GenerateRandomKey();
AddKey(*wallet, key);
TestUnloadWallet(std::move(wallet));
@@ -815,7 +814,7 @@ BOOST_FIXTURE_TEST_CASE(CreateWallet, TestChain100Setup)
// transactionAddedToMempool notifications, and create block and mempool
// transactions paying to the wallet
std::promise<void> promise;
- CallFunctionInValidationInterfaceQueue([&promise] {
+ m_node.validation_signals->CallFunctionInValidationInterfaceQueue([&promise] {
promise.get_future().wait();
});
std::string error;
@@ -843,7 +842,7 @@ BOOST_FIXTURE_TEST_CASE(CreateWallet, TestChain100Setup)
// Unblock notification queue and make sure stale blockConnected and
// transactionAddedToMempool events are processed
promise.set_value();
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
// AddToWallet events for block_tx and mempool_tx events are counted a
// second time as the notification queue is processed
BOOST_CHECK_EQUAL(addtx_count, 5);
@@ -866,7 +865,7 @@ BOOST_FIXTURE_TEST_CASE(CreateWallet, TestChain100Setup)
m_coinbase_txns.push_back(CreateAndProcessBlock({block_tx}, GetScriptForRawPubKey(coinbaseKey.GetPubKey())).vtx[0]);
mempool_tx = TestSimpleSpend(*m_coinbase_txns[3], 0, coinbaseKey, GetScriptForRawPubKey(key.GetPubKey()));
BOOST_CHECK(m_node.chain->broadcastTransaction(MakeTransactionRef(mempool_tx), DEFAULT_TRANSACTION_MAXFEE, false, error));
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
});
wallet = TestLoadWallet(context);
// Since mempool transactions are requested at the end of loading, there will
@@ -891,15 +890,14 @@ BOOST_FIXTURE_TEST_CASE(CreateWalletWithoutChain, BasicTestingSetup)
UnloadWallet(std::move(wallet));
}
-BOOST_FIXTURE_TEST_CASE(ZapSelectTx, TestChain100Setup)
+BOOST_FIXTURE_TEST_CASE(RemoveTxs, TestChain100Setup)
{
m_args.ForceSetArg("-unsafesqlitesync", "1");
WalletContext context;
context.args = &m_args;
context.chain = m_node.chain.get();
auto wallet = TestLoadWallet(context);
- CKey key;
- key.MakeNewKey(true);
+ CKey key = GenerateRandomKey();
AddKey(*wallet, key);
std::string error;
@@ -907,7 +905,7 @@ BOOST_FIXTURE_TEST_CASE(ZapSelectTx, TestChain100Setup)
auto block_tx = TestSimpleSpend(*m_coinbase_txns[0], 0, coinbaseKey, GetScriptForRawPubKey(key.GetPubKey()));
CreateAndProcessBlock({block_tx}, GetScriptForRawPubKey(coinbaseKey.GetPubKey()));
- SyncWithValidationInterfaceQueue();
+ m_node.validation_signals->SyncWithValidationInterfaceQueue();
{
auto block_hash = block_tx.GetHash();
@@ -917,8 +915,8 @@ BOOST_FIXTURE_TEST_CASE(ZapSelectTx, TestChain100Setup)
BOOST_CHECK(wallet->HasWalletSpend(prev_tx));
BOOST_CHECK_EQUAL(wallet->mapWallet.count(block_hash), 1u);
- std::vector<uint256> vHashIn{ block_hash }, vHashOut;
- BOOST_CHECK_EQUAL(wallet->ZapSelectTx(vHashIn, vHashOut), DBErrors::LOAD_OK);
+ std::vector<uint256> vHashIn{ block_hash };
+ BOOST_CHECK(wallet->RemoveTxs(vHashIn));
BOOST_CHECK(!wallet->HasWalletSpend(prev_tx));
BOOST_CHECK_EQUAL(wallet->mapWallet.count(block_hash), 0u);
diff --git a/src/wallet/wallet.cpp b/src/wallet/wallet.cpp
index 507174413d..3ac09430d8 100644
--- a/src/wallet/wallet.cpp
+++ b/src/wallet/wallet.cpp
@@ -555,7 +555,7 @@ void CWallet::UpgradeDescriptorCache()
SetWalletFlag(WALLET_FLAG_LAST_HARDENED_XPUB_CACHED);
}
-bool CWallet::Unlock(const SecureString& strWalletPassphrase, bool accept_no_keys)
+bool CWallet::Unlock(const SecureString& strWalletPassphrase)
{
CCrypter crypter;
CKeyingMaterial _vMasterKey;
@@ -568,7 +568,7 @@ bool CWallet::Unlock(const SecureString& strWalletPassphrase, bool accept_no_key
return false;
if (!crypter.Decrypt(pMasterKey.second.vchCryptedKey, _vMasterKey))
continue; // try another master key
- if (Unlock(_vMasterKey, accept_no_keys)) {
+ if (Unlock(_vMasterKey)) {
// Now that we've unlocked, upgrade the key metadata
UpgradeKeyMetadata();
// Now that we've unlocked, upgrade the descriptor cache
@@ -1571,11 +1571,22 @@ isminetype CWallet::IsMine(const CTxDestination& dest) const
isminetype CWallet::IsMine(const CScript& script) const
{
AssertLockHeld(cs_wallet);
- isminetype result = ISMINE_NO;
- for (const auto& spk_man_pair : m_spk_managers) {
- result = std::max(result, spk_man_pair.second->IsMine(script));
+
+ // Search the cache so that IsMine is called only on the relevant SPKMs instead of on everything in m_spk_managers
+ const auto& it = m_cached_spks.find(script);
+ if (it != m_cached_spks.end()) {
+ isminetype res = ISMINE_NO;
+ for (const auto& spkm : it->second) {
+ res = std::max(res, spkm->IsMine(script));
+ }
+ Assume(res == ISMINE_SPENDABLE);
+ return res;
}
- return result;
+
+ // Legacy wallet
+ if (IsLegacy()) return GetLegacyScriptPubKeyMan()->IsMine(script);
+
+ return ISMINE_NO;
}
bool CWallet::IsMine(const CTransaction& tx) const
@@ -2320,12 +2331,41 @@ DBErrors CWallet::LoadWallet()
return nLoadWalletRet;
}
-DBErrors CWallet::ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut)
+util::Result<void> CWallet::RemoveTxs(std::vector<uint256>& txs_to_remove)
{
AssertLockHeld(cs_wallet);
- DBErrors nZapSelectTxRet = WalletBatch(GetDatabase()).ZapSelectTx(vHashIn, vHashOut);
- for (const uint256& hash : vHashOut) {
- const auto& it = mapWallet.find(hash);
+ WalletBatch batch(GetDatabase());
+ if (!batch.TxnBegin()) return util::Error{_("Error starting db txn for wallet transactions removal")};
+
+ // Check for transaction existence and remove entries from disk
+ using TxIterator = std::unordered_map<uint256, CWalletTx, SaltedTxidHasher>::const_iterator;
+ std::vector<TxIterator> erased_txs;
+ bilingual_str str_err;
+ for (const uint256& hash : txs_to_remove) {
+ auto it_wtx = mapWallet.find(hash);
+ if (it_wtx == mapWallet.end()) {
+ str_err = strprintf(_("Transaction %s does not belong to this wallet"), hash.GetHex());
+ break;
+ }
+ if (!batch.EraseTx(hash)) {
+ str_err = strprintf(_("Failure removing transaction: %s"), hash.GetHex());
+ break;
+ }
+ erased_txs.emplace_back(it_wtx);
+ }
+
+ // Roll back removals in case of an error
+ if (!str_err.empty()) {
+ batch.TxnAbort();
+ return util::Error{str_err};
+ }
+
+ // Dump changes to disk
+ if (!batch.TxnCommit()) return util::Error{_("Error committing db txn for wallet transactions removal")};
+
+ // Update the in-memory state and notify upper layers about the removals
+ for (const auto& it : erased_txs) {
+ const uint256 hash{it->first};
wtxOrdered.erase(it->second.m_it_wtxOrdered);
for (const auto& txin : it->second.tx->vin)
mapTxSpends.erase(txin.prevout);
@@ -2333,22 +2373,9 @@ DBErrors CWallet::ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256
NotifyTransactionChanged(hash, CT_DELETED);
}
- if (nZapSelectTxRet == DBErrors::NEED_REWRITE)
- {
- if (GetDatabase().Rewrite("\x04pool"))
- {
- for (const auto& spk_man_pair : m_spk_managers) {
- spk_man_pair.second->RewriteDB();
- }
- }
- }
-
- if (nZapSelectTxRet != DBErrors::LOAD_OK)
- return nZapSelectTxRet;
-
MarkDirty();
- return DBErrors::LOAD_OK;
+ return {}; // all good
}
bool CWallet::SetAddressBookWithDB(WalletBatch& batch, const CTxDestination& address, const std::string& strName, const std::optional<AddressPurpose>& new_purpose)
@@ -2359,22 +2386,32 @@ bool CWallet::SetAddressBookWithDB(WalletBatch& batch, const CTxDestination& add
{
LOCK(cs_wallet);
std::map<CTxDestination, CAddressBookData>::iterator mi = m_address_book.find(address);
- fUpdated = (mi != m_address_book.end() && !mi->second.IsChange());
- m_address_book[address].SetLabel(strName);
+ fUpdated = mi != m_address_book.end() && !mi->second.IsChange();
+
+ CAddressBookData& record = mi != m_address_book.end() ? mi->second : m_address_book[address];
+ record.SetLabel(strName);
is_mine = IsMine(address) != ISMINE_NO;
if (new_purpose) { /* update purpose only if requested */
- purpose = m_address_book[address].purpose = new_purpose;
- } else {
- purpose = m_address_book[address].purpose;
+ record.purpose = new_purpose;
}
+ purpose = record.purpose;
+ }
+
+ const std::string& encoded_dest = EncodeDestination(address);
+ if (new_purpose && !batch.WritePurpose(encoded_dest, PurposeToString(*new_purpose))) {
+ WalletLogPrintf("Error: fail to write address book 'purpose' entry\n");
+ return false;
+ }
+ if (!batch.WriteName(encoded_dest, strName)) {
+ WalletLogPrintf("Error: fail to write address book 'name' entry\n");
+ return false;
}
+
// In very old wallets, address purpose may not be recorded so we derive it from IsMine
NotifyAddressBookChanged(address, strName, is_mine,
purpose.value_or(is_mine ? AddressPurpose::RECEIVE : AddressPurpose::SEND),
(fUpdated ? CT_UPDATED : CT_NEW));
- if (new_purpose && !batch.WritePurpose(EncodeDestination(address), PurposeToString(*new_purpose)))
- return false;
- return batch.WriteName(EncodeDestination(address), strName);
+ return true;
}
bool CWallet::SetAddressBook(const CTxDestination& address, const std::string& strName, const std::optional<AddressPurpose>& purpose)
@@ -2385,7 +2422,14 @@ bool CWallet::SetAddressBook(const CTxDestination& address, const std::string& s
bool CWallet::DelAddressBook(const CTxDestination& address)
{
- WalletBatch batch(GetDatabase());
+ return RunWithinTxn(GetDatabase(), /*process_desc=*/"address book entry removal", [&](WalletBatch& batch){
+ return DelAddressBookWithDB(batch, address);
+ });
+}
+
+bool CWallet::DelAddressBookWithDB(WalletBatch& batch, const CTxDestination& address)
+{
+ const std::string& dest = EncodeDestination(address);
{
LOCK(cs_wallet);
// If we want to delete receiving addresses, we should avoid calling EraseAddressData because it will delete the previously_spent value. Could instead just erase the label so it becomes a change address, and keep the data.
@@ -2396,14 +2440,30 @@ bool CWallet::DelAddressBook(const CTxDestination& address)
return false;
}
// Delete data rows associated with this address
- batch.EraseAddressData(address);
+ if (!batch.EraseAddressData(address)) {
+ WalletLogPrintf("Error: cannot erase address book entry data\n");
+ return false;
+ }
+
+ // Delete purpose entry
+ if (!batch.ErasePurpose(dest)) {
+ WalletLogPrintf("Error: cannot erase address book entry purpose\n");
+ return false;
+ }
+
+ // Delete name entry
+ if (!batch.EraseName(dest)) {
+ WalletLogPrintf("Error: cannot erase address book entry name\n");
+ return false;
+ }
+
+ // finally, remove it from the map
m_address_book.erase(address);
}
+ // All good, signal changes
NotifyAddressBookChanged(address, "", /*is_mine=*/false, AddressPurpose::SEND, CT_DELETED);
-
- batch.ErasePurpose(EncodeDestination(address));
- return batch.EraseName(EncodeDestination(address));
+ return true;
}
size_t CWallet::KeypoolCountExternalKeys() const
@@ -2547,8 +2607,10 @@ util::Result<CTxDestination> ReserveDestination::GetReservedDestination(bool int
if (nIndex == -1) {
CKeyPool keypool;
- auto op_address = m_spk_man->GetReservedDestination(type, internal, nIndex, keypool);
+ int64_t index;
+ auto op_address = m_spk_man->GetReservedDestination(type, internal, index, keypool);
if (!op_address) return op_address;
+ nIndex = index;
address = *op_address;
fInternal = keypool.fInternal;
}
@@ -3099,6 +3161,7 @@ std::shared_ptr<CWallet> CWallet::Create(WalletContext& context, const std::stri
if (time_first_key) walletInstance->MaybeUpdateBirthTime(*time_first_key);
if (chain && !AttachChain(walletInstance, *chain, rescan_required, error, warnings)) {
+ walletInstance->m_chain_notifications_handler.reset(); // Reset this pointer so that the wallet will actually be unloaded
return nullptr;
}
@@ -3373,12 +3436,12 @@ bool CWallet::Lock()
return true;
}
-bool CWallet::Unlock(const CKeyingMaterial& vMasterKeyIn, bool accept_no_keys)
+bool CWallet::Unlock(const CKeyingMaterial& vMasterKeyIn)
{
{
LOCK(cs_wallet);
for (const auto& spk_man_pair : m_spk_managers) {
- if (!spk_man_pair.second->CheckDecryptionKey(vMasterKeyIn, accept_no_keys)) {
+ if (!spk_man_pair.second->CheckDecryptionKey(vMasterKeyIn)) {
return false;
}
}
@@ -3424,12 +3487,18 @@ ScriptPubKeyMan* CWallet::GetScriptPubKeyMan(const OutputType& type, bool intern
std::set<ScriptPubKeyMan*> CWallet::GetScriptPubKeyMans(const CScript& script) const
{
std::set<ScriptPubKeyMan*> spk_mans;
- SignatureData sigdata;
- for (const auto& spk_man_pair : m_spk_managers) {
- if (spk_man_pair.second->CanProvide(script, sigdata)) {
- spk_mans.insert(spk_man_pair.second.get());
- }
+
+ // Search the cache for relevant SPKMs instead of iterating m_spk_managers
+ const auto& it = m_cached_spks.find(script);
+ if (it != m_cached_spks.end()) {
+ spk_mans.insert(it->second.begin(), it->second.end());
}
+ SignatureData sigdata;
+ Assume(std::all_of(spk_mans.begin(), spk_mans.end(), [&script, &sigdata](ScriptPubKeyMan* spkm) { return spkm->CanProvide(script, sigdata); }));
+
+ // Legacy wallet
+ if (IsLegacy() && GetLegacyScriptPubKeyMan()->CanProvide(script, sigdata)) spk_mans.insert(GetLegacyScriptPubKeyMan());
+
return spk_mans;
}
@@ -3449,11 +3518,17 @@ std::unique_ptr<SigningProvider> CWallet::GetSolvingProvider(const CScript& scri
std::unique_ptr<SigningProvider> CWallet::GetSolvingProvider(const CScript& script, SignatureData& sigdata) const
{
- for (const auto& spk_man_pair : m_spk_managers) {
- if (spk_man_pair.second->CanProvide(script, sigdata)) {
- return spk_man_pair.second->GetSolvingProvider(script);
- }
+ // Search the cache for relevant SPKMs instead of iterating m_spk_managers
+ const auto& it = m_cached_spks.find(script);
+ if (it != m_cached_spks.end()) {
+ // All spkms for a given script must already be able to make a SigningProvider for the script, so just return the first one.
+ Assume(it->second.at(0)->CanProvide(script, sigdata));
+ return it->second.at(0)->GetSolvingProvider(script);
}
+
+ // Legacy wallet
+ if (IsLegacy() && GetLegacyScriptPubKeyMan()->CanProvide(script, sigdata)) return GetLegacyScriptPubKeyMan()->GetSolvingProvider(script);
+
return nullptr;
}
@@ -3512,9 +3587,10 @@ void CWallet::SetupLegacyScriptPubKeyMan()
AddScriptPubKeyMan(id, std::move(spk_manager));
}
-const CKeyingMaterial& CWallet::GetEncryptionKey() const
+bool CWallet::WithEncryptionKey(std::function<bool (const CKeyingMaterial&)> cb) const
{
- return vMasterKey;
+ LOCK(cs_wallet);
+ return cb(vMasterKey);
}
bool CWallet::HasEncryptionKeys() const
@@ -3531,15 +3607,16 @@ void CWallet::ConnectScriptPubKeyManNotifiers()
}
}
-void CWallet::LoadDescriptorScriptPubKeyMan(uint256 id, WalletDescriptor& desc)
+DescriptorScriptPubKeyMan& CWallet::LoadDescriptorScriptPubKeyMan(uint256 id, WalletDescriptor& desc)
{
+ DescriptorScriptPubKeyMan* spk_manager;
if (IsWalletFlagSet(WALLET_FLAG_EXTERNAL_SIGNER)) {
- auto spk_manager = std::unique_ptr<ScriptPubKeyMan>(new ExternalSignerScriptPubKeyMan(*this, desc, m_keypool_size));
- AddScriptPubKeyMan(id, std::move(spk_manager));
+ spk_manager = new ExternalSignerScriptPubKeyMan(*this, desc, m_keypool_size);
} else {
- auto spk_manager = std::unique_ptr<ScriptPubKeyMan>(new DescriptorScriptPubKeyMan(*this, desc, m_keypool_size));
- AddScriptPubKeyMan(id, std::move(spk_manager));
+ spk_manager = new DescriptorScriptPubKeyMan(*this, desc, m_keypool_size);
}
+ AddScriptPubKeyMan(id, std::unique_ptr<ScriptPubKeyMan>(spk_manager));
+ return *spk_manager;
}
void CWallet::SetupDescriptorScriptPubKeyMans(const CExtKey& master_key)
@@ -3578,8 +3655,7 @@ void CWallet::SetupDescriptorScriptPubKeyMans()
if (!IsWalletFlagSet(WALLET_FLAG_EXTERNAL_SIGNER)) {
// Make a seed
- CKey seed_key;
- seed_key.MakeNewKey(true);
+ CKey seed_key = GenerateRandomKey();
CPubKey seed = seed_key.GetPubKey();
assert(seed_key.VerifyPubKey(seed));
@@ -3863,7 +3939,11 @@ std::optional<MigrationData> CWallet::GetDescriptorsForLegacy(bilingual_str& err
AssertLockHeld(cs_wallet);
LegacyScriptPubKeyMan* legacy_spkm = GetLegacyScriptPubKeyMan();
- assert(legacy_spkm);
+ if (!Assume(legacy_spkm)) {
+ // This shouldn't happen
+ error = Untranslated(STR_INTERNAL_BUG("Error: Legacy wallet data missing"));
+ return std::nullopt;
+ }
std::optional<MigrationData> res = legacy_spkm->MigrateToDescriptor();
if (res == std::nullopt) {
@@ -3878,8 +3958,9 @@ bool CWallet::ApplyMigrationData(MigrationData& data, bilingual_str& error)
AssertLockHeld(cs_wallet);
LegacyScriptPubKeyMan* legacy_spkm = GetLegacyScriptPubKeyMan();
- if (!legacy_spkm) {
- error = _("Error: This wallet is already a descriptor wallet");
+ if (!Assume(legacy_spkm)) {
+ // This shouldn't happen
+ error = Untranslated(STR_INTERNAL_BUG("Error: Legacy wallet data missing"));
return false;
}
@@ -3890,6 +3971,8 @@ bool CWallet::ApplyMigrationData(MigrationData& data, bilingual_str& error)
if (ExtractDestination(script, dest)) not_migrated_dests.emplace(dest);
}
+ Assume(!m_cached_spks.empty());
+
for (auto& desc_spkm : data.desc_spkms) {
if (m_spk_managers.count(desc_spkm->GetID()) > 0) {
error = _("Error: Duplicate descriptors created during migration. Your wallet may be corrupted.");
@@ -3921,6 +4004,13 @@ bool CWallet::ApplyMigrationData(MigrationData& data, bilingual_str& error)
}
}
+ // Get best block locator so that we can copy it to the watchonly and solvables
+ CBlockLocator best_block_locator;
+ if (!WalletBatch(GetDatabase()).ReadBestBlock(best_block_locator)) {
+ error = _("Error: Unable to read wallet's best block locator record");
+ return false;
+ }
+
// Check if the transactions in the wallet are still ours. Either they belong here, or they belong in the watchonly wallet.
// We need to go through these in the tx insertion order so that lookups to spends works.
std::vector<uint256> txids_to_delete;
@@ -3931,32 +4021,47 @@ bool CWallet::ApplyMigrationData(MigrationData& data, bilingual_str& error)
LOCK(data.watchonly_wallet->cs_wallet);
data.watchonly_wallet->nOrderPosNext = nOrderPosNext;
watchonly_batch->WriteOrderPosNext(data.watchonly_wallet->nOrderPosNext);
+ // Write the best block locator to avoid rescanning on reload
+ if (!watchonly_batch->WriteBestBlock(best_block_locator)) {
+ error = _("Error: Unable to write watchonly wallet best block locator record");
+ return false;
+ }
+ }
+ if (data.solvable_wallet) {
+ // Write the best block locator to avoid rescanning on reload
+ if (!WalletBatch(data.solvable_wallet->GetDatabase()).WriteBestBlock(best_block_locator)) {
+ error = _("Error: Unable to write solvable wallet best block locator record");
+ return false;
+ }
}
for (const auto& [_pos, wtx] : wtxOrdered) {
- if (!IsMine(*wtx->tx) && !IsFromMe(*wtx->tx)) {
- // Check it is the watchonly wallet's
- // solvable_wallet doesn't need to be checked because transactions for those scripts weren't being watched for
- if (data.watchonly_wallet) {
- LOCK(data.watchonly_wallet->cs_wallet);
- if (data.watchonly_wallet->IsMine(*wtx->tx) || data.watchonly_wallet->IsFromMe(*wtx->tx)) {
- // Add to watchonly wallet
- const uint256& hash = wtx->GetHash();
- const CWalletTx& to_copy_wtx = *wtx;
- if (!data.watchonly_wallet->LoadToWallet(hash, [&](CWalletTx& ins_wtx, bool new_tx) EXCLUSIVE_LOCKS_REQUIRED(data.watchonly_wallet->cs_wallet) {
- if (!new_tx) return false;
- ins_wtx.SetTx(to_copy_wtx.tx);
- ins_wtx.CopyFrom(to_copy_wtx);
- return true;
- })) {
- error = strprintf(_("Error: Could not add watchonly tx %s to watchonly wallet"), wtx->GetHash().GetHex());
- return false;
- }
- watchonly_batch->WriteTx(data.watchonly_wallet->mapWallet.at(hash));
- // Mark as to remove from this wallet
+ // Check it is the watchonly wallet's
+ // solvable_wallet doesn't need to be checked because transactions for those scripts weren't being watched for
+ bool is_mine = IsMine(*wtx->tx) || IsFromMe(*wtx->tx);
+ if (data.watchonly_wallet) {
+ LOCK(data.watchonly_wallet->cs_wallet);
+ if (data.watchonly_wallet->IsMine(*wtx->tx) || data.watchonly_wallet->IsFromMe(*wtx->tx)) {
+ // Add to watchonly wallet
+ const uint256& hash = wtx->GetHash();
+ const CWalletTx& to_copy_wtx = *wtx;
+ if (!data.watchonly_wallet->LoadToWallet(hash, [&](CWalletTx& ins_wtx, bool new_tx) EXCLUSIVE_LOCKS_REQUIRED(data.watchonly_wallet->cs_wallet) {
+ if (!new_tx) return false;
+ ins_wtx.SetTx(to_copy_wtx.tx);
+ ins_wtx.CopyFrom(to_copy_wtx);
+ return true;
+ })) {
+ error = strprintf(_("Error: Could not add watchonly tx %s to watchonly wallet"), wtx->GetHash().GetHex());
+ return false;
+ }
+ watchonly_batch->WriteTx(data.watchonly_wallet->mapWallet.at(hash));
+ // Mark as to remove from the migrated wallet only if it does not also belong to it
+ if (!is_mine) {
txids_to_delete.push_back(hash);
- continue;
}
+ continue;
}
+ }
+ if (!is_mine) {
// Both not ours and not in the watchonly wallet
error = strprintf(_("Error: Transaction %s in wallet cannot be identified to belong to migrated wallets"), wtx->GetHash().GetHex());
return false;
@@ -3965,112 +4070,95 @@ bool CWallet::ApplyMigrationData(MigrationData& data, bilingual_str& error)
watchonly_batch.reset(); // Flush
// Do the removes
if (txids_to_delete.size() > 0) {
- std::vector<uint256> deleted_txids;
- if (ZapSelectTx(txids_to_delete, deleted_txids) != DBErrors::LOAD_OK) {
- error = _("Error: Could not delete watchonly transactions");
+ if (auto res = RemoveTxs(txids_to_delete); !res) {
+ error = _("Error: Could not delete watchonly transactions. ") + util::ErrorString(res);
return false;
}
- if (deleted_txids != txids_to_delete) {
- error = _("Error: Not all watchonly txs could be deleted");
+ }
+
+ // Pair external wallets with their corresponding db handler
+ std::vector<std::pair<std::shared_ptr<CWallet>, std::unique_ptr<WalletBatch>>> wallets_vec;
+ for (const auto& ext_wallet : {data.watchonly_wallet, data.solvable_wallet}) {
+ if (!ext_wallet) continue;
+
+ std::unique_ptr<WalletBatch> batch = std::make_unique<WalletBatch>(ext_wallet->GetDatabase());
+ if (!batch->TxnBegin()) {
+ error = strprintf(_("Error: database transaction cannot be executed for wallet %s"), ext_wallet->GetName());
return false;
}
- // Tell the GUI of each tx
- for (const uint256& txid : deleted_txids) {
- NotifyTransactionChanged(txid, CT_UPDATED);
- }
+ wallets_vec.emplace_back(ext_wallet, std::move(batch));
}
+ // Write address book entry to disk
+ auto func_store_addr = [](WalletBatch& batch, const CTxDestination& dest, const CAddressBookData& entry) {
+ auto address{EncodeDestination(dest)};
+ if (entry.purpose) batch.WritePurpose(address, PurposeToString(*entry.purpose));
+ if (entry.label) batch.WriteName(address, *entry.label);
+ for (const auto& [id, request] : entry.receive_requests) {
+ batch.WriteAddressReceiveRequest(dest, id, request);
+ }
+ if (entry.previously_spent) batch.WriteAddressPreviouslySpent(dest, true);
+ };
+
// Check the address book data in the same way we did for transactions
std::vector<CTxDestination> dests_to_delete;
- for (const auto& addr_pair : m_address_book) {
- // Labels applied to receiving addresses should go based on IsMine
- if (addr_pair.second.purpose == AddressPurpose::RECEIVE) {
- if (!IsMine(addr_pair.first)) {
- // Check the address book data is the watchonly wallet's
- if (data.watchonly_wallet) {
- LOCK(data.watchonly_wallet->cs_wallet);
- if (data.watchonly_wallet->IsMine(addr_pair.first)) {
- // Add to the watchonly. Preserve the labels, purpose, and change-ness
- std::string label = addr_pair.second.GetLabel();
- data.watchonly_wallet->m_address_book[addr_pair.first].purpose = addr_pair.second.purpose;
- if (!addr_pair.second.IsChange()) {
- data.watchonly_wallet->m_address_book[addr_pair.first].SetLabel(label);
- }
- dests_to_delete.push_back(addr_pair.first);
- continue;
- }
- }
- if (data.solvable_wallet) {
- LOCK(data.solvable_wallet->cs_wallet);
- if (data.solvable_wallet->IsMine(addr_pair.first)) {
- // Add to the solvable. Preserve the labels, purpose, and change-ness
- std::string label = addr_pair.second.GetLabel();
- data.solvable_wallet->m_address_book[addr_pair.first].purpose = addr_pair.second.purpose;
- if (!addr_pair.second.IsChange()) {
- data.solvable_wallet->m_address_book[addr_pair.first].SetLabel(label);
- }
- dests_to_delete.push_back(addr_pair.first);
- continue;
- }
- }
+ for (const auto& [dest, record] : m_address_book) {
+ // Ensure "receive" entries that are no longer part of the original wallet are transferred to another wallet
+ // Entries for everything else ("send") will be cloned to all wallets.
+ bool require_transfer = record.purpose == AddressPurpose::RECEIVE && !IsMine(dest);
+ bool copied = false;
+ for (auto& [wallet, batch] : wallets_vec) {
+ LOCK(wallet->cs_wallet);
+ if (require_transfer && !wallet->IsMine(dest)) continue;
+
+ // Copy the entire address book entry
+ wallet->m_address_book[dest] = record;
+ func_store_addr(*batch, dest, record);
+
+ copied = true;
+ // Only delete 'receive' records that are no longer part of the original wallet
+ if (require_transfer) {
+ dests_to_delete.push_back(dest);
+ break;
+ }
+ }
- // Skip invalid/non-watched scripts that will not be migrated
- if (not_migrated_dests.count(addr_pair.first) > 0) {
- dests_to_delete.push_back(addr_pair.first);
- continue;
- }
+ // Fail immediately if we ever found an entry that was ours and cannot be transferred
+ // to any of the created wallets (watch-only, solvable).
+ // Means that no inferred descriptor maps to the stored entry. Which mustn't happen.
+ if (require_transfer && !copied) {
- // Not ours, not in watchonly wallet, and not in solvable
- error = _("Error: Address book data in wallet cannot be identified to belong to migrated wallets");
- return false;
- }
- } else {
- // Labels for everything else ("send") should be cloned to all
- if (data.watchonly_wallet) {
- LOCK(data.watchonly_wallet->cs_wallet);
- // Add to the watchonly. Preserve the labels, purpose, and change-ness
- std::string label = addr_pair.second.GetLabel();
- data.watchonly_wallet->m_address_book[addr_pair.first].purpose = addr_pair.second.purpose;
- if (!addr_pair.second.IsChange()) {
- data.watchonly_wallet->m_address_book[addr_pair.first].SetLabel(label);
- }
- }
- if (data.solvable_wallet) {
- LOCK(data.solvable_wallet->cs_wallet);
- // Add to the solvable. Preserve the labels, purpose, and change-ness
- std::string label = addr_pair.second.GetLabel();
- data.solvable_wallet->m_address_book[addr_pair.first].purpose = addr_pair.second.purpose;
- if (!addr_pair.second.IsChange()) {
- data.solvable_wallet->m_address_book[addr_pair.first].SetLabel(label);
- }
+ // Skip invalid/non-watched scripts that will not be migrated
+ if (not_migrated_dests.count(dest) > 0) {
+ dests_to_delete.push_back(dest);
+ continue;
}
+
+ error = _("Error: Address book data in wallet cannot be identified to belong to migrated wallets");
+ return false;
}
}
- // Persist added address book entries (labels, purpose) for watchonly and solvable wallets
- auto persist_address_book = [](const CWallet& wallet) {
- LOCK(wallet.cs_wallet);
- WalletBatch batch{wallet.GetDatabase()};
- for (const auto& [destination, addr_book_data] : wallet.m_address_book) {
- auto address{EncodeDestination(destination)};
- std::optional<std::string> label = addr_book_data.IsChange() ? std::nullopt : std::make_optional(addr_book_data.GetLabel());
- // don't bother writing default values (unknown purpose)
- if (addr_book_data.purpose) batch.WritePurpose(address, PurposeToString(*addr_book_data.purpose));
- if (label) batch.WriteName(address, *label);
+ // Persist external wallets address book entries
+ for (auto& [wallet, batch] : wallets_vec) {
+ if (!batch->TxnCommit()) {
+ error = strprintf(_("Error: address book copy failed for wallet %s"), wallet->GetName());
+ return false;
}
- };
- if (data.watchonly_wallet) persist_address_book(*data.watchonly_wallet);
- if (data.solvable_wallet) persist_address_book(*data.solvable_wallet);
+ }
- // Remove the things to delete
+ // Remove the things to delete in this wallet
+ WalletBatch local_wallet_batch(GetDatabase());
+ local_wallet_batch.TxnBegin();
if (dests_to_delete.size() > 0) {
for (const auto& dest : dests_to_delete) {
- if (!DelAddressBook(dest)) {
+ if (!DelAddressBookWithDB(local_wallet_batch, dest)) {
error = _("Error: Unable to remove watchonly address book data");
return false;
}
}
}
+ local_wallet_batch.TxnCommit();
// Connect the SPKM signals
ConnectScriptPubKeyManNotifiers();
@@ -4202,11 +4290,13 @@ util::Result<MigrationResult> MigrateLegacyToDescriptor(const std::string& walle
std::vector<bilingual_str> warnings;
// If the wallet is still loaded, unload it so that nothing else tries to use it while we're changing it
+ bool was_loaded = false;
if (auto wallet = GetWallet(context, wallet_name)) {
if (!RemoveWallet(context, wallet, /*load_on_start=*/std::nullopt, warnings)) {
return util::Error{_("Unable to unload the wallet before migrating")};
}
UnloadWallet(std::move(wallet));
+ was_loaded = true;
}
// Load the wallet but only in the context of this function.
@@ -4227,8 +4317,20 @@ util::Result<MigrationResult> MigrateLegacyToDescriptor(const std::string& walle
return util::Error{Untranslated("Wallet loading failed.") + Untranslated(" ") + error};
}
+ // Helper to reload as normal for some of our exit scenarios
+ const auto& reload_wallet = [&](std::shared_ptr<CWallet>& to_reload) {
+ assert(to_reload.use_count() == 1);
+ std::string name = to_reload->GetName();
+ to_reload.reset();
+ to_reload = LoadWallet(context, name, /*load_on_start=*/std::nullopt, options, status, error, warnings);
+ return to_reload != nullptr;
+ };
+
// Before anything else, check if there is something to migrate.
- if (!local_wallet->GetLegacyScriptPubKeyMan()) {
+ if (local_wallet->IsWalletFlagSet(WALLET_FLAG_DESCRIPTORS)) {
+ if (was_loaded) {
+ reload_wallet(local_wallet);
+ }
return util::Error{_("Error: This wallet is already a descriptor wallet")};
}
@@ -4237,32 +4339,44 @@ util::Result<MigrationResult> MigrateLegacyToDescriptor(const std::string& walle
fs::path backup_filename = fs::PathFromString(strprintf("%s-%d.legacy.bak", wallet_name, GetTime()));
fs::path backup_path = this_wallet_dir / backup_filename;
if (!local_wallet->BackupWallet(fs::PathToString(backup_path))) {
+ if (was_loaded) {
+ reload_wallet(local_wallet);
+ }
return util::Error{_("Error: Unable to make a backup of your wallet")};
}
res.backup_path = backup_path;
bool success = false;
- {
- LOCK(local_wallet->cs_wallet);
- // Unlock the wallet if needed
- if (local_wallet->IsLocked() && !local_wallet->Unlock(passphrase)) {
- if (passphrase.find('\0') == std::string::npos) {
- return util::Error{Untranslated("Error: Wallet decryption failed, the wallet passphrase was not provided or was incorrect.")};
- } else {
- return util::Error{Untranslated("Error: Wallet decryption failed, the wallet passphrase entered was incorrect. "
- "The passphrase contains a null character (ie - a zero byte). "
- "If this passphrase was set with a version of this software prior to 25.0, "
- "please try again with only the characters up to — but not including — "
- "the first null character.")};
- }
+ // Unlock the wallet if needed
+ if (local_wallet->IsLocked() && !local_wallet->Unlock(passphrase)) {
+ if (was_loaded) {
+ reload_wallet(local_wallet);
+ }
+ if (passphrase.find('\0') == std::string::npos) {
+ return util::Error{Untranslated("Error: Wallet decryption failed, the wallet passphrase was not provided or was incorrect.")};
+ } else {
+ return util::Error{Untranslated("Error: Wallet decryption failed, the wallet passphrase entered was incorrect. "
+ "The passphrase contains a null character (ie - a zero byte). "
+ "If this passphrase was set with a version of this software prior to 25.0, "
+ "please try again with only the characters up to — but not including — "
+ "the first null character.")};
}
+ }
+ {
+ LOCK(local_wallet->cs_wallet);
// First change to using SQLite
if (!local_wallet->MigrateToSQLite(error)) return util::Error{error};
- // Do the migration, and cleanup if it fails
- success = DoMigration(*local_wallet, context, error, res);
+ // Do the migration of keys and scripts for non-blank wallets, and cleanup if it fails
+ success = local_wallet->IsWalletFlagSet(WALLET_FLAG_BLANK_WALLET);
+ if (!success) {
+ success = DoMigration(*local_wallet, context, error, res);
+ } else {
+ // Make sure that descriptors flag is actually set
+ local_wallet->SetWalletFlag(WALLET_FLAG_DESCRIPTORS);
+ }
}
// In case of reloading failure, we need to remember the wallet dirs to remove
@@ -4272,24 +4386,19 @@ util::Result<MigrationResult> MigrateLegacyToDescriptor(const std::string& walle
std::set<fs::path> wallet_dirs;
if (success) {
// Migration successful, unload all wallets locally, then reload them.
- const auto& reload_wallet = [&](std::shared_ptr<CWallet>& to_reload) {
- assert(to_reload.use_count() == 1);
- std::string name = to_reload->GetName();
- wallet_dirs.insert(fs::PathFromString(to_reload->GetDatabase().Filename()).parent_path());
- to_reload.reset();
- to_reload = LoadWallet(context, name, /*load_on_start=*/std::nullopt, options, status, error, warnings);
- return to_reload != nullptr;
- };
// Reload the main wallet
+ wallet_dirs.insert(fs::PathFromString(local_wallet->GetDatabase().Filename()).parent_path());
success = reload_wallet(local_wallet);
res.wallet = local_wallet;
res.wallet_name = wallet_name;
if (success && res.watchonly_wallet) {
// Reload watchonly
+ wallet_dirs.insert(fs::PathFromString(res.watchonly_wallet->GetDatabase().Filename()).parent_path());
success = reload_wallet(res.watchonly_wallet);
}
if (success && res.solvables_wallet) {
// Reload solvables
+ wallet_dirs.insert(fs::PathFromString(res.solvables_wallet->GetDatabase().Filename()).parent_path());
success = reload_wallet(res.solvables_wallet);
}
}
@@ -4347,4 +4456,17 @@ util::Result<MigrationResult> MigrateLegacyToDescriptor(const std::string& walle
}
return res;
}
+
+void CWallet::CacheNewScriptPubKeys(const std::set<CScript>& spks, ScriptPubKeyMan* spkm)
+{
+ for (const auto& script : spks) {
+ m_cached_spks[script].push_back(spkm);
+ }
+}
+
+void CWallet::TopUpCallback(const std::set<CScript>& spks, ScriptPubKeyMan* spkm)
+{
+ // Update scriptPubKey cache
+ CacheNewScriptPubKeys(spks, spkm);
+}
} // namespace wallet
diff --git a/src/wallet/wallet.h b/src/wallet/wallet.h
index 487921443f..8b0ee22276 100644
--- a/src/wallet/wallet.h
+++ b/src/wallet/wallet.h
@@ -302,7 +302,7 @@ class CWallet final : public WalletStorage, public interfaces::Chain::Notificati
private:
CKeyingMaterial vMasterKey GUARDED_BY(cs_wallet);
- bool Unlock(const CKeyingMaterial& vMasterKeyIn, bool accept_no_keys = false);
+ bool Unlock(const CKeyingMaterial& vMasterKeyIn);
std::atomic<bool> fAbortRescan{false};
std::atomic<bool> fScanningWallet{false}; // controlled by WalletRescanReserver
@@ -422,6 +422,9 @@ private:
// Same as 'AddActiveScriptPubKeyMan' but designed for use within a batch transaction context
void AddActiveScriptPubKeyManWithDb(WalletBatch& batch, uint256 id, OutputType type, bool internal);
+ //! Cache of descriptor ScriptPubKeys used for IsMine. Maps ScriptPubKey to set of spkms
+ std::unordered_map<CScript, std::vector<ScriptPubKeyMan*>, SaltedSipHasher> m_cached_spks;
+
/**
* Catch wallet up to current chain, scanning new blocks, updating the best
* block locator and m_last_block_processed, and registering for
@@ -578,7 +581,7 @@ public:
// Used to prevent deleting the passphrase from memory when it is still in use.
RecursiveMutex m_relock_mutex;
- bool Unlock(const SecureString& strWalletPassphrase, bool accept_no_keys = false);
+ bool Unlock(const SecureString& strWalletPassphrase);
bool ChangeWalletPassphrase(const SecureString& strOldWalletPassphrase, const SecureString& strNewWalletPassphrase);
bool EncryptWallet(const SecureString& strWalletPassphrase);
@@ -790,11 +793,14 @@ public:
void chainStateFlushed(ChainstateRole role, const CBlockLocator& loc) override;
DBErrors LoadWallet();
- DBErrors ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
+
+ /** Erases the provided transactions from the wallet. */
+ util::Result<void> RemoveTxs(std::vector<uint256>& txs_to_remove) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
bool SetAddressBook(const CTxDestination& address, const std::string& strName, const std::optional<AddressPurpose>& purpose);
bool DelAddressBook(const CTxDestination& address);
+ bool DelAddressBookWithDB(WalletBatch& batch, const CTxDestination& address);
bool IsAddressPreviouslySpent(const CTxDestination& dest) const EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
bool SetAddressPreviouslySpent(WalletBatch& batch, const CTxDestination& dest, bool used) EXCLUSIVE_LOCKS_REQUIRED(cs_wallet);
@@ -962,7 +968,8 @@ public:
//! Make a LegacyScriptPubKeyMan and set it for all types, internal, and external.
void SetupLegacyScriptPubKeyMan();
- const CKeyingMaterial& GetEncryptionKey() const override;
+ bool WithEncryptionKey(std::function<bool (const CKeyingMaterial&)> cb) const override;
+
bool HasEncryptionKeys() const override;
/** Get last block processed height */
@@ -990,7 +997,7 @@ public:
void ConnectScriptPubKeyManNotifiers();
//! Instantiate a descriptor ScriptPubKeyMan from the WalletDescriptor and load it
- void LoadDescriptorScriptPubKeyMan(uint256 id, WalletDescriptor& desc);
+ DescriptorScriptPubKeyMan& LoadDescriptorScriptPubKeyMan(uint256 id, WalletDescriptor& desc);
//! Adds the active ScriptPubKeyMan for the specified type and internal. Writes it to the wallet file
//! @param[in] id The unique id for the ScriptPubKeyMan
@@ -1041,6 +1048,11 @@ public:
//! Whether the (external) signer performs R-value signature grinding
bool CanGrindR() const;
+
+ //! Add scriptPubKeys for this ScriptPubKeyMan into the scriptPubKey cache
+ void CacheNewScriptPubKeys(const std::set<CScript>& spks, ScriptPubKeyMan* spkm);
+
+ void TopUpCallback(const std::set<CScript>& spks, ScriptPubKeyMan* spkm) override;
};
/**
diff --git a/src/wallet/walletdb.cpp b/src/wallet/walletdb.cpp
index ba453b47e7..b1ce7ee4e7 100644
--- a/src/wallet/walletdb.cpp
+++ b/src/wallet/walletdb.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <wallet/walletdb.h>
#include <common/system.h>
@@ -804,10 +808,10 @@ static DBErrors LoadDescriptorWalletRecords(CWallet* pwallet, DatabaseBatch& bat
strErr = strprintf("%s\nDetails: %s", strErr, e.what());
return DBErrors::UNKNOWN_DESCRIPTOR;
}
- pwallet->LoadDescriptorScriptPubKeyMan(id, desc);
+ DescriptorScriptPubKeyMan& spkm = pwallet->LoadDescriptorScriptPubKeyMan(id, desc);
// Prior to doing anything with this spkm, verify ID compatibility
- if (id != pwallet->GetDescriptorScriptPubKeyMan(desc)->GetID()) {
+ if (id != spkm.GetID()) {
strErr = "The descriptor ID calculated by the wallet differs from the one in DB";
return DBErrors::CORRUPT;
}
@@ -1230,88 +1234,33 @@ DBErrors WalletBatch::LoadWallet(CWallet* pwallet)
return result;
}
-DBErrors WalletBatch::FindWalletTxHashes(std::vector<uint256>& tx_hashes)
+static bool RunWithinTxn(WalletBatch& batch, std::string_view process_desc, const std::function<bool(WalletBatch&)>& func)
{
- DBErrors result = DBErrors::LOAD_OK;
-
- try {
- int nMinVersion = 0;
- if (m_batch->Read(DBKeys::MINVERSION, nMinVersion)) {
- if (nMinVersion > FEATURE_LATEST)
- return DBErrors::TOO_NEW;
- }
-
- // Get cursor
- std::unique_ptr<DatabaseCursor> cursor = m_batch->GetNewCursor();
- if (!cursor)
- {
- LogPrintf("Error getting wallet database cursor\n");
- return DBErrors::CORRUPT;
- }
+ if (!batch.TxnBegin()) {
+ LogPrint(BCLog::WALLETDB, "Error: cannot create db txn for %s\n", process_desc);
+ return false;
+ }
- while (true)
- {
- // Read next record
- DataStream ssKey{};
- DataStream ssValue{};
- DatabaseCursor::Status status = cursor->Next(ssKey, ssValue);
- if (status == DatabaseCursor::Status::DONE) {
- break;
- } else if (status == DatabaseCursor::Status::FAIL) {
- LogPrintf("Error reading next record from wallet database\n");
- return DBErrors::CORRUPT;
- }
+ // Run procedure
+ if (!func(batch)) {
+ LogPrint(BCLog::WALLETDB, "Error: %s failed\n", process_desc);
+ batch.TxnAbort();
+ return false;
+ }
- std::string strType;
- ssKey >> strType;
- if (strType == DBKeys::TX) {
- uint256 hash;
- ssKey >> hash;
- tx_hashes.push_back(hash);
- }
- }
- } catch (...) {
- result = DBErrors::CORRUPT;
+ if (!batch.TxnCommit()) {
+ LogPrint(BCLog::WALLETDB, "Error: cannot commit db txn for %s\n", process_desc);
+ return false;
}
- return result;
+ // All good
+ return true;
}
-DBErrors WalletBatch::ZapSelectTx(std::vector<uint256>& vTxHashIn, std::vector<uint256>& vTxHashOut)
+bool RunWithinTxn(WalletDatabase& database, std::string_view process_desc, const std::function<bool(WalletBatch&)>& func)
{
- // build list of wallet TX hashes
- std::vector<uint256> vTxHash;
- DBErrors err = FindWalletTxHashes(vTxHash);
- if (err != DBErrors::LOAD_OK) {
- return err;
- }
-
- std::sort(vTxHash.begin(), vTxHash.end());
- std::sort(vTxHashIn.begin(), vTxHashIn.end());
-
- // erase each matching wallet TX
- bool delerror = false;
- std::vector<uint256>::iterator it = vTxHashIn.begin();
- for (const uint256& hash : vTxHash) {
- while (it < vTxHashIn.end() && (*it) < hash) {
- it++;
- }
- if (it == vTxHashIn.end()) {
- break;
- }
- else if ((*it) == hash) {
- if(!EraseTx(hash)) {
- LogPrint(BCLog::WALLETDB, "Transaction was found for deletion but returned database error: %s\n", hash.GetHex());
- delerror = true;
- }
- vTxHashOut.push_back(hash);
- }
- }
-
- if (delerror) {
- return DBErrors::CORRUPT;
- }
- return DBErrors::LOAD_OK;
+ WalletBatch batch(database);
+ return RunWithinTxn(batch, process_desc, func);
}
void MaybeCompactWalletDB(WalletContext& context)
@@ -1376,47 +1325,11 @@ bool WalletBatch::WriteWalletFlags(const uint64_t flags)
bool WalletBatch::EraseRecords(const std::unordered_set<std::string>& types)
{
- // Begin db txn
- if (!m_batch->TxnBegin()) return false;
-
- // Get cursor
- std::unique_ptr<DatabaseCursor> cursor = m_batch->GetNewCursor();
- if (!cursor)
- {
- return false;
- }
-
- // Iterate the DB and look for any records that have the type prefixes
- while (true) {
- // Read next record
- DataStream key{};
- DataStream value{};
- DatabaseCursor::Status status = cursor->Next(key, value);
- if (status == DatabaseCursor::Status::DONE) {
- break;
- } else if (status == DatabaseCursor::Status::FAIL) {
- cursor.reset(nullptr);
- m_batch->TxnAbort(); // abort db txn
- return false;
- }
-
- // Make a copy of key to avoid data being deleted by the following read of the type
- Span key_data{key};
-
- std::string type;
- key >> type;
-
- if (types.count(type) > 0) {
- if (!m_batch->Erase(key_data)) {
- cursor.reset(nullptr);
- m_batch->TxnAbort();
- return false; // erase failed
- }
- }
- }
- // Finish db txn
- cursor.reset(nullptr);
- return m_batch->TxnCommit();
+ return RunWithinTxn(*this, "erase records", [&types](WalletBatch& self) {
+ return std::all_of(types.begin(), types.end(), [&self](const std::string& type) {
+ return self.m_batch->ErasePrefix(DataStream() << type);
+ });
+ });
}
bool WalletBatch::TxnBegin()
@@ -1498,20 +1411,26 @@ std::unique_ptr<WalletDatabase> MakeDatabase(const fs::path& path, const Databas
if (format == DatabaseFormat::SQLITE) {
#ifdef USE_SQLITE
- return MakeSQLiteDatabase(path, options, status, error);
-#else
- error = Untranslated(strprintf("Failed to open database path '%s'. Build does not support SQLite database format.", fs::PathToString(path)));
- status = DatabaseStatus::FAILED_BAD_FORMAT;
- return nullptr;
+ if constexpr (true) {
+ return MakeSQLiteDatabase(path, options, status, error);
+ } else
#endif
+ {
+ error = Untranslated(strprintf("Failed to open database path '%s'. Build does not support SQLite database format.", fs::PathToString(path)));
+ status = DatabaseStatus::FAILED_BAD_FORMAT;
+ return nullptr;
+ }
}
#ifdef USE_BDB
- return MakeBerkeleyDatabase(path, options, status, error);
-#else
- error = Untranslated(strprintf("Failed to open database path '%s'. Build does not support Berkeley DB database format.", fs::PathToString(path)));
- status = DatabaseStatus::FAILED_BAD_FORMAT;
- return nullptr;
+ if constexpr (true) {
+ return MakeBerkeleyDatabase(path, options, status, error);
+ } else
#endif
+ {
+ error = Untranslated(strprintf("Failed to open database path '%s'. Build does not support Berkeley DB database format.", fs::PathToString(path)));
+ status = DatabaseStatus::FAILED_BAD_FORMAT;
+ return nullptr;
+ }
}
} // namespace wallet
diff --git a/src/wallet/walletdb.h b/src/wallet/walletdb.h
index dad0b18a78..9474a59660 100644
--- a/src/wallet/walletdb.h
+++ b/src/wallet/walletdb.h
@@ -275,8 +275,6 @@ public:
bool EraseActiveScriptPubKeyMan(uint8_t type, bool internal);
DBErrors LoadWallet(CWallet* pwallet);
- DBErrors FindWalletTxHashes(std::vector<uint256>& tx_hashes);
- DBErrors ZapSelectTx(std::vector<uint256>& vHashIn, std::vector<uint256>& vHashOut);
//! write the hdchain model (external chain child index counter)
bool WriteHDChain(const CHDChain& chain);
@@ -296,6 +294,20 @@ private:
WalletDatabase& m_database;
};
+/**
+ * Executes the provided function 'func' within a database transaction context.
+ *
+ * This function ensures that all db modifications performed within 'func()' are
+ * atomically committed to the db at the end of the process. And, in case of a
+ * failure during execution, all performed changes are rolled back.
+ *
+ * @param database The db connection instance to perform the transaction on.
+ * @param process_desc A description of the process being executed, used for logging purposes in the event of a failure.
+ * @param func The function to be executed within the db txn context. It returns a boolean indicating whether to commit or roll back the txn.
+ * @return true if the db txn executed successfully, false otherwise.
+ */
+bool RunWithinTxn(WalletDatabase& database, std::string_view process_desc, const std::function<bool(WalletBatch&)>& func);
+
//! Compacts BDB state so that wallet.dat is self-contained (if there are changes)
void MaybeCompactWalletDB(WalletContext& context);
diff --git a/src/wallet/wallettool.cpp b/src/wallet/wallettool.cpp
index 2f3f8ef77d..cda344ab19 100644
--- a/src/wallet/wallettool.cpp
+++ b/src/wallet/wallettool.cpp
@@ -68,7 +68,6 @@ static std::shared_ptr<CWallet> MakeWallet(const std::string& name, const fs::pa
}
if (load_wallet_ret != DBErrors::LOAD_OK) {
- wallet_instance = nullptr;
if (load_wallet_ret == DBErrors::CORRUPT) {
tfm::format(std::cerr, "Error loading %s: Wallet corrupted", name);
return nullptr;
@@ -194,10 +193,15 @@ bool ExecuteWalletToolFunc(const ArgsManager& args, const std::string& command)
DatabaseOptions options;
ReadDatabaseArgs(args, options);
options.require_existing = true;
- const std::shared_ptr<CWallet> wallet_instance = MakeWallet(name, path, options);
- if (!wallet_instance) return false;
+ DatabaseStatus status;
bilingual_str error;
- bool ret = DumpWallet(args, *wallet_instance, error);
+ std::unique_ptr<WalletDatabase> database = MakeDatabase(path, options, status, error);
+ if (!database) {
+ tfm::format(std::cerr, "%s\n", error.original);
+ return false;
+ }
+
+ bool ret = DumpWallet(args, *database, error);
if (!ret && !error.empty()) {
tfm::format(std::cerr, "%s\n", error.original);
return ret;
diff --git a/src/warnings.cpp b/src/warnings.cpp
index cb73c7aea2..84b021dad5 100644
--- a/src/warnings.cpp
+++ b/src/warnings.cpp
@@ -3,6 +3,10 @@
// Distributed under the MIT software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
+#if defined(HAVE_CONFIG_H)
+#include <config/bitcoin-config.h>
+#endif
+
#include <warnings.h>
#include <common/system.h>
diff --git a/src/zmq/zmqpublishnotifier.cpp b/src/zmq/zmqpublishnotifier.cpp
index 54d125e47b..0f20706364 100644
--- a/src/zmq/zmqpublishnotifier.cpp
+++ b/src/zmq/zmqpublishnotifier.cpp
@@ -250,7 +250,7 @@ bool CZMQPublishRawBlockNotifier::NotifyBlock(const CBlockIndex *pindex)
return false;
}
- ss << RPCTxSerParams(block);
+ ss << TX_WITH_WITNESS(block);
return SendZmqMessage(MSG_RAWBLOCK, &(*ss.begin()), ss.size());
}
@@ -260,7 +260,7 @@ bool CZMQPublishRawTransactionNotifier::NotifyTransaction(const CTransaction &tr
uint256 hash = transaction.GetHash();
LogPrint(BCLog::ZMQ, "Publish rawtx %s to %s\n", hash.GetHex(), this->address);
DataStream ss;
- ss << RPCTxSerParams(transaction);
+ ss << TX_WITH_WITNESS(transaction);
return SendZmqMessage(MSG_RAWTX, &(*ss.begin()), ss.size());
}
diff --git a/test/README.md b/test/README.md
index fee8828d34..0d1e06c0ad 100644
--- a/test/README.md
+++ b/test/README.md
@@ -326,35 +326,7 @@ Use the `-v` option for verbose output.
### Lint tests
-#### Dependencies
-
-| Lint test | Dependency |
-|-----------|:----------:|
-| [`lint-python.py`](lint/lint-python.py) | [flake8](https://gitlab.com/pycqa/flake8)
-| [`lint-python.py`](lint/lint-python.py) | [lief](https://github.com/lief-project/LIEF)
-| [`lint-python.py`](lint/lint-python.py) | [mypy](https://github.com/python/mypy)
-| [`lint-python.py`](lint/lint-python.py) | [pyzmq](https://github.com/zeromq/pyzmq)
-| [`lint-python-dead-code.py`](lint/lint-python-dead-code.py) | [vulture](https://github.com/jendrikseipp/vulture)
-| [`lint-shell.py`](lint/lint-shell.py) | [ShellCheck](https://github.com/koalaman/shellcheck)
-| [`lint-spelling.py`](lint/lint-spelling.py) | [codespell](https://github.com/codespell-project/codespell)
-
-In use versions and install instructions are available in the [CI setup](../ci/lint/04_install.sh).
-
-Please be aware that on Linux distributions all dependencies are usually available as packages, but could be outdated.
-
-#### Running the tests
-
-Individual tests can be run by directly calling the test script, e.g.:
-
-```
-test/lint/lint-files.py
-```
-
-You can run all the shell-based lint tests by running:
-
-```
-test/lint/all-lint.py
-```
+See the README in [test/lint](/test/lint).
# Writing functional tests
diff --git a/test/functional/README.md b/test/functional/README.md
index 1bd618a0c3..a4994f2e7c 100644
--- a/test/functional/README.md
+++ b/test/functional/README.md
@@ -37,6 +37,10 @@ don't have test cases for.
`set_test_params()`, `add_options()` and `setup_xxxx()` methods at the top of
the subclass, then locally-defined helper methods, then the `run_test()` method.
- Use `f'{x}'` for string formatting in preference to `'{}'.format(x)` or `'%s' % x`.
+- Use `platform.system()` for detecting the running operating system and `os.name` to
+ check whether it's a POSIX system (see also the `skip_if_platform_not_{linux,posix}`
+ methods in the `BitcoinTestFramework` class, which can be used to skip a whole test
+ depending on the platform).
#### Naming guidelines
diff --git a/test/functional/feature_addrman.py b/test/functional/feature_addrman.py
index 9839993115..a7ce864fde 100755
--- a/test/functional/feature_addrman.py
+++ b/test/functional/feature_addrman.py
@@ -8,9 +8,8 @@ import os
import re
import struct
-from test_framework.messages import ser_uint256, hash256
+from test_framework.messages import ser_uint256, hash256, MAGIC_BYTES
from test_framework.netutil import ADDRMAN_NEW_BUCKET_COUNT, ADDRMAN_TRIED_BUCKET_COUNT, ADDRMAN_BUCKET_SIZE
-from test_framework.p2p import MAGIC_BYTES
from test_framework.test_framework import BitcoinTestFramework
from test_framework.test_node import ErrorMatch
from test_framework.util import assert_equal
diff --git a/test/functional/feature_anchors.py b/test/functional/feature_anchors.py
index 3b75a06d9e..5d68f50f58 100755
--- a/test/functional/feature_anchors.py
+++ b/test/functional/feature_anchors.py
@@ -99,7 +99,7 @@ class AnchorsTest(BitcoinTestFramework):
self.restart_node(0, extra_args=[f"-onion={onion_conf.addr[0]}:{onion_conf.addr[1]}"])
self.log.info("Add 256-bit-address block-relay-only connections to node")
- self.nodes[0].addconnection(ONION_ADDR, 'block-relay-only')
+ self.nodes[0].addconnection(ONION_ADDR, 'block-relay-only', v2transport=False)
self.log.debug("Stop node")
with self.nodes[0].assert_debug_log([f"DumpAnchors: Flush 1 outbound block-relay-only peer addresses to anchors.dat"]):
diff --git a/test/functional/feature_assumeutxo.py b/test/functional/feature_assumeutxo.py
index 2e3589b020..60dd751ff8 100755
--- a/test/functional/feature_assumeutxo.py
+++ b/test/functional/feature_assumeutxo.py
@@ -7,11 +7,10 @@ a serialized version of the UTXO set at a certain height, which corresponds
to a hash that has been compiled into bitcoind.
The assumeutxo value generated and used here is committed to in
-`CRegTestParams::m_assumeutxo_data` in `src/chainparams.cpp`.
+`CRegTestParams::m_assumeutxo_data` in `src/kernel/chainparams.cpp`.
## Possible test improvements
-- TODO: test submitting a transaction and verifying it appears in mempool
- TODO: test what happens with -reindex and -reindex-chainstate before the
snapshot is validated, and make sure it's deleted successfully.
@@ -35,11 +34,16 @@ Interesting starting states could be loading a snapshot when the current chain t
"""
from shutil import rmtree
+from test_framework.messages import tx_from_hex
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
assert_equal,
assert_raises_rpc_error,
)
+from test_framework.wallet import (
+ getnewdestination,
+ MiniWallet,
+)
START_HEIGHT = 199
SNAPSHOT_BASE_HEIGHT = 299
@@ -56,7 +60,7 @@ class AssumeutxoTest(BitcoinTestFramework):
self.extra_args = [
[],
["-fastprune", "-prune=1", "-blockfilterindex=1", "-coinstatsindex=1"],
- ["-txindex=1", "-blockfilterindex=1", "-coinstatsindex=1"],
+ ["-persistmempool=0","-txindex=1", "-blockfilterindex=1", "-coinstatsindex=1"],
]
def setup_network(self):
@@ -96,10 +100,10 @@ class AssumeutxoTest(BitcoinTestFramework):
self.log.info(" - snapshot file with alternated UTXO data")
cases = [
- [b"\xff" * 32, 0, "05030e506678f2eca8d624ffed97090ab3beadad1b51ee6e5985ba91c5720e37"], # wrong outpoint hash
- [(1).to_bytes(4, "little"), 32, "7d29cfe2c1e242bc6f103878bb70cfffa8b4dac20dbd001ff6ce24b7de2d2399"], # wrong outpoint index
- [b"\x81", 36, "f03939a195531f96d5dff983e294a1af62af86049fa7a19a7627246f237c03f1"], # wrong coin code VARINT((coinbase ? 1 : 0) | (height << 1))
- [b"\x83", 36, "e4577da84590fb288c0f7967e89575e1b0aa46624669640f6f5dfef028d39930"], # another wrong coin code
+ [b"\xff" * 32, 0, "7d52155c9a9fdc4525b637ef6170568e5dad6fabd0b1fdbb9432010b8453095b"], # wrong outpoint hash
+ [(1).to_bytes(4, "little"), 32, "9f4d897031ab8547665b4153317ae2fdbf0130c7840b66427ebc48b881cb80ad"], # wrong outpoint index
+ [b"\x81", 36, "3da966ba9826fb6d2604260e01607b55ba44e1a5de298606b08704bc62570ea8"], # wrong coin code VARINT((coinbase ? 1 : 0) | (height << 1))
+ [b"\x80", 36, "091e893b3ccb4334378709578025356c8bcb0a623f37c7c4e493133c988648e5"], # another wrong coin code
]
for content, offset, wrong_hash in cases:
@@ -107,7 +111,7 @@ class AssumeutxoTest(BitcoinTestFramework):
f.write(valid_snapshot_contents[:(32 + 8 + offset)])
f.write(content)
f.write(valid_snapshot_contents[(32 + 8 + offset + len(content)):])
- expected_error(log_msg=f"[snapshot] bad snapshot content hash: expected 61d9c2b29a2571a5fe285fe2d8554f91f93309666fc9b8223ee96338de25ff53, got {wrong_hash}")
+ expected_error(log_msg=f"[snapshot] bad snapshot content hash: expected a4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27, got {wrong_hash}")
def test_invalid_chainstate_scenarios(self):
self.log.info("Test different scenarios of invalid snapshot chainstate in datadir")
@@ -131,6 +135,19 @@ class AssumeutxoTest(BitcoinTestFramework):
rmtree(chainstate_snapshot_path)
self.start_node(0)
+ def test_invalid_mempool_state(self, dump_output_path):
+ self.log.info("Test bitcoind should fail when mempool not empty.")
+ node=self.nodes[2]
+ tx = MiniWallet(node).send_self_transfer(from_node=node)
+
+ assert tx['txid'] in node.getrawmempool()
+
+ # Attempt to load the snapshot on Node 2 and expect it to fail
+ with node.assert_debug_log(expected_msgs=["[snapshot] can't activate a snapshot when mempool not empty"]):
+ assert_raises_rpc_error(-32603, "Unable to load UTXO snapshot", node.loadtxoutset, dump_output_path)
+
+ self.restart_node(2, extra_args=self.extra_args[2])
+
def run_test(self):
"""
Bring up two (disconnected) nodes, mine some new blocks on the first,
@@ -143,6 +160,8 @@ class AssumeutxoTest(BitcoinTestFramework):
n1 = self.nodes[1]
n2 = self.nodes[2]
+ self.mini_wallet = MiniWallet(n0)
+
# Mock time for a deterministic chain
for n in self.nodes:
n.setmocktime(n.getblockheader(n.getbestblockhash())['time'])
@@ -155,6 +174,8 @@ class AssumeutxoTest(BitcoinTestFramework):
# isn't waiting forever to see the header of the snapshot's base block
# while disconnected from n0.
for i in range(100):
+ if i % 3 == 0:
+ self.mini_wallet.send_self_transfer(from_node=n0)
self.generate(n0, nblocks=1, sync_fun=self.no_op)
newblock = n0.getblock(n0.getbestblockhash(), 0)
@@ -176,8 +197,8 @@ class AssumeutxoTest(BitcoinTestFramework):
assert_equal(
dump_output['txoutset_hash'],
- '61d9c2b29a2571a5fe285fe2d8554f91f93309666fc9b8223ee96338de25ff53')
- assert_equal(dump_output['nchaintx'], 300)
+ "a4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27")
+ assert_equal(dump_output["nchaintx"], 334)
assert_equal(n0.getblockchaininfo()["blocks"], SNAPSHOT_BASE_HEIGHT)
# Mine more blocks on top of the snapshot that n1 hasn't yet seen. This
@@ -189,6 +210,7 @@ class AssumeutxoTest(BitcoinTestFramework):
assert_equal(n0.getblockchaininfo()["blocks"], FINAL_HEIGHT)
+ self.test_invalid_mempool_state(dump_output['path'])
self.test_invalid_snapshot_scenarios(dump_output['path'])
self.test_invalid_chainstate_scenarios()
@@ -207,6 +229,22 @@ class AssumeutxoTest(BitcoinTestFramework):
assert_equal(n1.getblockchaininfo()["blocks"], SNAPSHOT_BASE_HEIGHT)
+ self.log.info("Submit a spending transaction for a snapshot chainstate coin to the mempool")
+ # spend the coinbase output of the first block that is not available on node1
+ spend_coin_blockhash = n1.getblockhash(START_HEIGHT + 1)
+ assert_raises_rpc_error(-1, "Block not found on disk", n1.getblock, spend_coin_blockhash)
+ prev_tx = n0.getblock(spend_coin_blockhash, 3)['tx'][0]
+ prevout = {"txid": prev_tx['txid'], "vout": 0, "scriptPubKey": prev_tx['vout'][0]['scriptPubKey']['hex']}
+ privkey = n0.get_deterministic_priv_key().key
+ raw_tx = n1.createrawtransaction([prevout], {getnewdestination()[2]: 24.99})
+ signed_tx = n1.signrawtransactionwithkey(raw_tx, [privkey], [prevout])['hex']
+ signed_txid = tx_from_hex(signed_tx).rehash()
+
+ assert n1.gettxout(prev_tx['txid'], 0) is not None
+ n1.sendrawtransaction(signed_tx)
+ assert signed_txid in n1.getrawmempool()
+ assert not n1.gettxout(prev_tx['txid'], 0)
+
PAUSE_HEIGHT = FINAL_HEIGHT - 40
self.log.info("Restarting node to stop at height %d", PAUSE_HEIGHT)
diff --git a/test/functional/feature_bind_extra.py b/test/functional/feature_bind_extra.py
index 4a94d2ce7b..5cd031f852 100755
--- a/test/functional/feature_bind_extra.py
+++ b/test/functional/feature_bind_extra.py
@@ -7,15 +7,12 @@ Test starting bitcoind with -bind and/or -bind=...=onion and confirm
that bind happens on the expected ports.
"""
-import sys
-
from test_framework.netutil import (
addr_to_hex,
get_bind_addrs,
)
from test_framework.test_framework import (
BitcoinTestFramework,
- SkipTest,
)
from test_framework.util import (
assert_equal,
@@ -32,12 +29,11 @@ class BindExtraTest(BitcoinTestFramework):
self.bind_to_localhost_only = False
self.num_nodes = 2
- def setup_network(self):
+ def skip_test_if_missing_module(self):
# Due to OS-specific network stats queries, we only run on Linux.
- self.log.info("Checking for Linux")
- if not sys.platform.startswith('linux'):
- raise SkipTest("This test can only be run on Linux.")
+ self.skip_if_platform_not_linux()
+ def setup_network(self):
loopback_ipv4 = addr_to_hex("127.0.0.1")
# Start custom ports by reusing unused p2p ports
diff --git a/test/functional/feature_bip68_sequence.py b/test/functional/feature_bip68_sequence.py
index 894afffc79..8768d4040d 100755
--- a/test/functional/feature_bip68_sequence.py
+++ b/test/functional/feature_bip68_sequence.py
@@ -408,10 +408,8 @@ class BIP68Test(BitcoinTestFramework):
# Use self.nodes[1] to test that version 2 transactions are standard.
def test_version2_relay(self):
mini_wallet = MiniWallet(self.nodes[1])
- mini_wallet.rescan_utxos()
- tx = mini_wallet.create_self_transfer()["tx"]
- tx.nVersion = 2
- mini_wallet.sendrawtransaction(from_node=self.nodes[1], tx_hex=tx.serialize().hex())
+ mini_wallet.send_self_transfer(from_node=self.nodes[1], version=2)
+
if __name__ == '__main__':
BIP68Test().main()
diff --git a/test/functional/feature_block.py b/test/functional/feature_block.py
index 58ef1e761d..8a95975184 100755
--- a/test/functional/feature_block.py
+++ b/test/functional/feature_block.py
@@ -1263,6 +1263,10 @@ class FullBlockTest(BitcoinTestFramework):
b89a = self.update_block("89a", [tx])
self.send_blocks([b89a], success=False, reject_reason='bad-txns-inputs-missingorspent', reconnect=True)
+ # Don't use v2transport for the large reorg, which is too slow with the unoptimized python ChaCha20 implementation
+ if self.options.v2transport:
+ self.nodes[0].disconnect_p2ps()
+ self.helper_peer = self.nodes[0].add_p2p_connection(P2PDataStore(), supports_v2_p2p=False)
self.log.info("Test a re-org of one week's worth of blocks (1088 blocks)")
self.move_tip(88)
diff --git a/test/functional/feature_config_args.py b/test/functional/feature_config_args.py
index dcea662089..9e13a3deef 100755
--- a/test/functional/feature_config_args.py
+++ b/test/functional/feature_config_args.py
@@ -6,8 +6,8 @@
import os
from pathlib import Path
+import platform
import re
-import sys
import tempfile
import time
@@ -116,7 +116,7 @@ class ConfArgsTest(BitcoinTestFramework):
def test_config_file_log(self):
# Disable this test for windows currently because trying to override
# the default datadir through the environment does not seem to work.
- if sys.platform == "win32":
+ if platform.system() == "Windows":
return
self.log.info('Test that correct configuration path is changed when configuration file changes the datadir')
@@ -339,7 +339,7 @@ class ConfArgsTest(BitcoinTestFramework):
def test_ignored_default_conf(self):
# Disable this test for windows currently because trying to override
# the default datadir through the environment does not seem to work.
- if sys.platform == "win32":
+ if platform.system() == "Windows":
return
self.log.info('Test error is triggered when bitcoin.conf in the default data directory sets another datadir '
diff --git a/test/functional/feature_init.py b/test/functional/feature_init.py
index 142d75a851..268009b0f4 100755
--- a/test/functional/feature_init.py
+++ b/test/functional/feature_init.py
@@ -3,8 +3,8 @@
# Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Stress tests related to node initialization."""
-import os
from pathlib import Path
+import platform
import shutil
from test_framework.test_framework import BitcoinTestFramework, SkipTest
@@ -36,7 +36,7 @@ class InitStressTest(BitcoinTestFramework):
# and other approaches (like below) don't work:
#
# os.kill(node.process.pid, signal.CTRL_C_EVENT)
- if os.name == 'nt':
+ if platform.system() == 'Windows':
raise SkipTest("can't SIGTERM on Windows")
self.stop_node(0)
diff --git a/test/functional/feature_maxuploadtarget.py b/test/functional/feature_maxuploadtarget.py
index c551c0b449..39cff7b738 100755
--- a/test/functional/feature_maxuploadtarget.py
+++ b/test/functional/feature_maxuploadtarget.py
@@ -8,6 +8,7 @@
if uploadtarget has been reached.
* Verify that getdata requests for recent blocks are respected even
if uploadtarget has been reached.
+* Verify that mempool requests lead to a disconnect if uploadtarget has been reached.
* Verify that the upload counters are reset after 24 hours.
"""
from collections import defaultdict
@@ -17,6 +18,7 @@ from test_framework.messages import (
CInv,
MSG_BLOCK,
msg_getdata,
+ msg_mempool,
)
from test_framework.p2p import P2PInterface
from test_framework.test_framework import BitcoinTestFramework
@@ -27,6 +29,9 @@ from test_framework.util import (
from test_framework.wallet import MiniWallet
+UPLOAD_TARGET_MB = 800
+
+
class TestP2PConn(P2PInterface):
def __init__(self):
super().__init__()
@@ -45,12 +50,21 @@ class MaxUploadTest(BitcoinTestFramework):
self.setup_clean_chain = True
self.num_nodes = 1
self.extra_args = [[
- "-maxuploadtarget=800M",
+ f"-maxuploadtarget={UPLOAD_TARGET_MB}M",
"-datacarriersize=100000",
]]
self.supports_cli = False
+ def assert_uploadtarget_state(self, *, target_reached, serve_historical_blocks):
+ """Verify the node's current upload target state via the `getnettotals` RPC call."""
+ uploadtarget = self.nodes[0].getnettotals()["uploadtarget"]
+ assert_equal(uploadtarget["target_reached"], target_reached)
+ assert_equal(uploadtarget["serve_historical_blocks"], serve_historical_blocks)
+
def run_test(self):
+ # Initially, neither historical blocks serving limit nor total limit are reached
+ self.assert_uploadtarget_state(target_reached=False, serve_historical_blocks=True)
+
# Before we connect anything, we first set the time on the node
# to be in the past, otherwise things break because the CNode
# time counters can't be reset backward after initialization
@@ -67,7 +81,8 @@ class MaxUploadTest(BitcoinTestFramework):
p2p_conns = []
for _ in range(3):
- p2p_conns.append(self.nodes[0].add_p2p_connection(TestP2PConn()))
+ # Don't use v2transport in this test (too slow with the unoptimized python ChaCha20 implementation)
+ p2p_conns.append(self.nodes[0].add_p2p_connection(TestP2PConn(), supports_v2_p2p=False))
# Now mine a big block
mine_large_block(self, self.wallet, self.nodes[0])
@@ -93,7 +108,7 @@ class MaxUploadTest(BitcoinTestFramework):
getdata_request = msg_getdata()
getdata_request.inv.append(CInv(MSG_BLOCK, big_old_block))
- max_bytes_per_day = 800*1024*1024
+ max_bytes_per_day = UPLOAD_TARGET_MB * 1024 *1024
daily_buffer = 144 * 4000000
max_bytes_available = max_bytes_per_day - daily_buffer
success_count = max_bytes_available // old_block_size
@@ -107,12 +122,16 @@ class MaxUploadTest(BitcoinTestFramework):
assert_equal(len(self.nodes[0].getpeerinfo()), 3)
# At most a couple more tries should succeed (depending on how long
# the test has been running so far).
- for _ in range(3):
- p2p_conns[0].send_message(getdata_request)
- p2p_conns[0].wait_for_disconnect()
+ with self.nodes[0].assert_debug_log(expected_msgs=["historical block serving limit reached, disconnect peer"]):
+ for _ in range(3):
+ p2p_conns[0].send_message(getdata_request)
+ p2p_conns[0].wait_for_disconnect()
assert_equal(len(self.nodes[0].getpeerinfo()), 2)
self.log.info("Peer 0 disconnected after downloading old block too many times")
+ # Historical blocks serving limit is reached by now, but total limit still isn't
+ self.assert_uploadtarget_state(target_reached=False, serve_historical_blocks=False)
+
# Requesting the current block on p2p_conns[1] should succeed indefinitely,
# even when over the max upload target.
# We'll try 800 times
@@ -121,12 +140,16 @@ class MaxUploadTest(BitcoinTestFramework):
p2p_conns[1].send_and_ping(getdata_request)
assert_equal(p2p_conns[1].block_receive_map[big_new_block], i+1)
+ # Both historical blocks serving limit and total limit are reached
+ self.assert_uploadtarget_state(target_reached=True, serve_historical_blocks=False)
+
self.log.info("Peer 1 able to repeatedly download new block")
# But if p2p_conns[1] tries for an old block, it gets disconnected too.
getdata_request.inv = [CInv(MSG_BLOCK, big_old_block)]
- p2p_conns[1].send_message(getdata_request)
- p2p_conns[1].wait_for_disconnect()
+ with self.nodes[0].assert_debug_log(expected_msgs=["historical block serving limit reached, disconnect peer"]):
+ p2p_conns[1].send_message(getdata_request)
+ p2p_conns[1].wait_for_disconnect()
assert_equal(len(self.nodes[0].getpeerinfo()), 1)
self.log.info("Peer 1 disconnected after trying to download old block")
@@ -139,16 +162,22 @@ class MaxUploadTest(BitcoinTestFramework):
p2p_conns[2].sync_with_ping()
p2p_conns[2].send_and_ping(getdata_request)
assert_equal(p2p_conns[2].block_receive_map[big_old_block], 1)
+ self.assert_uploadtarget_state(target_reached=False, serve_historical_blocks=True)
self.log.info("Peer 2 able to download old block")
self.nodes[0].disconnect_p2ps()
- self.log.info("Restarting node 0 with download permission and 1MB maxuploadtarget")
- self.restart_node(0, ["-whitelist=download@127.0.0.1", "-maxuploadtarget=1"])
+ self.log.info("Restarting node 0 with download permission, bloom filter support and 1MB maxuploadtarget")
+ self.restart_node(0, ["-whitelist=download@127.0.0.1", "-peerbloomfilters", "-maxuploadtarget=1"])
+ # Total limit isn't reached after restart, but 1 MB is too small to serve historical blocks
+ self.assert_uploadtarget_state(target_reached=False, serve_historical_blocks=False)
# Reconnect to self.nodes[0]
- peer = self.nodes[0].add_p2p_connection(TestP2PConn())
+ peer = self.nodes[0].add_p2p_connection(TestP2PConn(), supports_v2_p2p=False)
+
+ # Sending mempool message shouldn't disconnect peer, as total limit isn't reached yet
+ peer.send_and_ping(msg_mempool())
#retrieve 20 blocks which should be enough to break the 1MB limit
getdata_request.inv = [CInv(MSG_BLOCK, big_new_block)]
@@ -156,6 +185,9 @@ class MaxUploadTest(BitcoinTestFramework):
peer.send_and_ping(getdata_request)
assert_equal(peer.block_receive_map[big_new_block], i+1)
+ # Total limit is exceeded
+ self.assert_uploadtarget_state(target_reached=True, serve_historical_blocks=False)
+
getdata_request.inv = [CInv(MSG_BLOCK, big_old_block)]
peer.send_and_ping(getdata_request)
@@ -164,6 +196,11 @@ class MaxUploadTest(BitcoinTestFramework):
assert_equal(len(peer_info), 1) # node is still connected
assert_equal(peer_info[0]['permissions'], ['download'])
+ self.log.info("Peer gets disconnected for a mempool request after limit is reached")
+ with self.nodes[0].assert_debug_log(expected_msgs=["mempool request with bandwidth limit reached, disconnect peer"]):
+ peer.send_message(msg_mempool())
+ peer.wait_for_disconnect()
+
self.log.info("Test passing an unparsable value to -maxuploadtarget throws an error")
self.stop_node(0)
self.nodes[0].assert_start_raises_init_error(extra_args=["-maxuploadtarget=abc"], expected_msg="Error: Unable to parse -maxuploadtarget: 'abc'")
diff --git a/test/functional/feature_notifications.py b/test/functional/feature_notifications.py
index adf6c13973..d2b5315d31 100755
--- a/test/functional/feature_notifications.py
+++ b/test/functional/feature_notifications.py
@@ -4,6 +4,7 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test the -alertnotify, -blocknotify and -walletnotify options."""
import os
+import platform
from test_framework.address import ADDRESS_BCRT1_UNSPENDABLE
from test_framework.descriptors import descsum_create
@@ -14,13 +15,13 @@ from test_framework.util import (
# Linux allow all characters other than \x00
# Windows disallow control characters (0-31) and /\?%:|"<>
-FILE_CHAR_START = 32 if os.name == 'nt' else 1
+FILE_CHAR_START = 32 if platform.system() == 'Windows' else 1
FILE_CHAR_END = 128
-FILE_CHARS_DISALLOWED = '/\\?%*:|"<>' if os.name == 'nt' else '/'
+FILE_CHARS_DISALLOWED = '/\\?%*:|"<>' if platform.system() == 'Windows' else '/'
UNCONFIRMED_HASH_STRING = 'unconfirmed'
def notify_outputname(walletname, txid):
- return txid if os.name == 'nt' else f'{walletname}_{txid}'
+ return txid if platform.system() == 'Windows' else f'{walletname}_{txid}'
class NotificationsTest(BitcoinTestFramework):
@@ -181,7 +182,7 @@ class NotificationsTest(BitcoinTestFramework):
# Universal newline ensures '\n' on 'nt'
assert_equal(text[-1], '\n')
text = text[:-1]
- if os.name == 'nt':
+ if platform.system() == 'Windows':
# On Windows, echo as above will append a whitespace
assert_equal(text[-1], ' ')
text = text[:-1]
diff --git a/test/functional/feature_reindex.py b/test/functional/feature_reindex.py
index 83f1c5003c..f0f32a61ab 100755
--- a/test/functional/feature_reindex.py
+++ b/test/functional/feature_reindex.py
@@ -11,7 +11,7 @@
"""
from test_framework.test_framework import BitcoinTestFramework
-from test_framework.p2p import MAGIC_BYTES
+from test_framework.messages import MAGIC_BYTES
from test_framework.util import assert_equal
diff --git a/test/functional/feature_remove_pruned_files_on_startup.py b/test/functional/feature_remove_pruned_files_on_startup.py
index c128587949..4ee653142a 100755
--- a/test/functional/feature_remove_pruned_files_on_startup.py
+++ b/test/functional/feature_remove_pruned_files_on_startup.py
@@ -4,6 +4,7 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test removing undeleted pruned blk files on startup."""
+import platform
import os
from test_framework.test_framework import BitcoinTestFramework
@@ -32,7 +33,7 @@ class FeatureRemovePrunedFilesOnStartupTest(BitcoinTestFramework):
self.nodes[0].pruneblockchain(600)
# Windows systems will not remove files with an open fd
- if os.name != 'nt':
+ if platform.system() != 'Windows':
assert not os.path.exists(blk0)
assert not os.path.exists(rev0)
assert not os.path.exists(blk1)
diff --git a/test/functional/feature_segwit.py b/test/functional/feature_segwit.py
index 6c467fa613..4dc19222c4 100755
--- a/test/functional/feature_segwit.py
+++ b/test/functional/feature_segwit.py
@@ -88,14 +88,11 @@ class SegWitTest(BitcoinTestFramework):
self.extra_args = [
[
"-acceptnonstdtxn=1",
- "-rpcserialversion=0",
- "-deprecatedrpc=serialversion",
"-testactivationheight=segwit@165",
"-addresstype=legacy",
],
[
"-acceptnonstdtxn=1",
- "-rpcserialversion=1",
"-testactivationheight=segwit@165",
"-addresstype=legacy",
],
@@ -224,18 +221,6 @@ class SegWitTest(BitcoinTestFramework):
self.fail_accept(self.nodes[0], "mandatory-script-verify-flag-failed (Witness program hash mismatch)", p2sh_ids[NODE_0][P2WPKH][0], sign=False, redeem_script=witness_script(False, self.pubkey[0]))
self.fail_accept(self.nodes[0], "mandatory-script-verify-flag-failed (Witness program was passed an empty witness)", p2sh_ids[NODE_0][P2WSH][0], sign=False, redeem_script=witness_script(True, self.pubkey[0]))
- self.log.info("Verify block and transaction serialization rpcs return differing serializations depending on rpc serialization flag")
- assert self.nodes[2].getblock(blockhash, False) != self.nodes[0].getblock(blockhash, False)
- assert self.nodes[1].getblock(blockhash, False) == self.nodes[2].getblock(blockhash, False)
-
- for tx_id in segwit_tx_list:
- tx = tx_from_hex(self.nodes[2].gettransaction(tx_id)["hex"])
- assert self.nodes[2].getrawtransaction(tx_id, False, blockhash) != self.nodes[0].getrawtransaction(tx_id, False, blockhash)
- assert self.nodes[1].getrawtransaction(tx_id, False, blockhash) == self.nodes[2].getrawtransaction(tx_id, False, blockhash)
- assert self.nodes[0].getrawtransaction(tx_id, False, blockhash) != self.nodes[2].gettransaction(tx_id)["hex"]
- assert self.nodes[1].getrawtransaction(tx_id, False, blockhash) == self.nodes[2].gettransaction(tx_id)["hex"]
- assert self.nodes[0].getrawtransaction(tx_id, False, blockhash) == tx.serialize_without_witness().hex()
-
# Coinbase contains the witness commitment nonce, check that RPC shows us
coinbase_txid = self.nodes[2].getblock(blockhash)['tx'][0]
coinbase_tx = self.nodes[2].gettransaction(txid=coinbase_txid, verbose=True)
@@ -276,9 +261,6 @@ class SegWitTest(BitcoinTestFramework):
# tx3 (non-segwit input, paying to a non-segwit output).
# tx1 is allowed to appear in the block, but no others.
txid1 = send_to_witness(1, self.nodes[0], find_spendable_utxo(self.nodes[0], 50), self.pubkey[0], False, Decimal("49.996"))
- hex_tx = self.nodes[0].gettransaction(txid)['hex']
- tx = tx_from_hex(hex_tx)
- assert tx.wit.is_null() # This should not be a segwit input
assert txid1 in self.nodes[0].getrawmempool()
tx1_hex = self.nodes[0].gettransaction(txid1)['hex']
@@ -613,11 +595,6 @@ class SegWitTest(BitcoinTestFramework):
assert_equal(self.nodes[1].gettransaction(txid, True)["txid"], txid)
assert_equal(self.nodes[1].listtransactions("*", 1, 0, True)[0]["txid"], txid)
- self.log.info('Test negative and unknown rpcserialversion throw an init error')
- self.stop_node(0)
- self.nodes[0].assert_start_raises_init_error(["-rpcserialversion=-1"], "Error: rpcserialversion must be non-negative.")
- self.nodes[0].assert_start_raises_init_error(["-rpcserialversion=100"], "Error: Unknown rpcserialversion requested.")
-
def mine_and_test_listunspent(self, script_list, ismine):
utxo = find_spendable_utxo(self.nodes[0], 50)
tx = CTransaction()
diff --git a/test/functional/feature_settings.py b/test/functional/feature_settings.py
index 1bacdd447a..0214e781de 100755
--- a/test/functional/feature_settings.py
+++ b/test/functional/feature_settings.py
@@ -23,10 +23,11 @@ class SettingsTest(BitcoinTestFramework):
settings = node.chain_path / "settings.json"
conf = node.datadir_path / "bitcoin.conf"
- # Assert empty settings file was created
+ # Assert default settings file was created
self.stop_node(0)
+ default_settings = {"_warning_": "This file is automatically generated and updated by Bitcoin Core. Please do not edit this file while the node is running, as any changes might be ignored or overwritten."}
with settings.open() as fp:
- assert_equal(json.load(fp), {})
+ assert_equal(json.load(fp), default_settings)
# Assert settings are parsed and logged
with settings.open("w") as fp:
@@ -48,12 +49,12 @@ class SettingsTest(BitcoinTestFramework):
# Assert settings are unchanged after shutdown
with settings.open() as fp:
- assert_equal(json.load(fp), {"string": "string", "num": 5, "bool": True, "null": None, "list": [6, 7]})
+ assert_equal(json.load(fp), {**default_settings, **{"string": "string", "num": 5, "bool": True, "null": None, "list": [6, 7]}})
# Test invalid json
with settings.open("w") as fp:
fp.write("invalid json")
- node.assert_start_raises_init_error(expected_msg='Unable to parse settings file', match=ErrorMatch.PARTIAL_REGEX)
+ node.assert_start_raises_init_error(expected_msg='does not contain valid JSON. This is probably caused by disk corruption or a crash', match=ErrorMatch.PARTIAL_REGEX)
# Test invalid json object
with settings.open("w") as fp:
diff --git a/test/functional/feature_utxo_set_hash.py b/test/functional/feature_utxo_set_hash.py
index be154b411f..0bdcc6d83d 100755
--- a/test/functional/feature_utxo_set_hash.py
+++ b/test/functional/feature_utxo_set_hash.py
@@ -4,8 +4,6 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test UTXO set hash value calculation in gettxoutsetinfo."""
-import struct
-
from test_framework.messages import (
CBlock,
COutPoint,
@@ -58,7 +56,7 @@ class UTXOSetHashTest(BitcoinTestFramework):
continue
data = COutPoint(int(tx.rehash(), 16), n).serialize()
- data += struct.pack("<i", height * 2 + coinbase)
+ data += (height * 2 + coinbase).to_bytes(4, "little")
data += tx_out.serialize()
muhash.insert(data)
diff --git a/test/functional/interface_rest.py b/test/functional/interface_rest.py
index b81eae2506..05aa40bbfe 100755
--- a/test/functional/interface_rest.py
+++ b/test/functional/interface_rest.py
@@ -337,6 +337,9 @@ class RESTTest (BitcoinTestFramework):
assert_greater_than(json_obj['bytes'], 300)
mempool_info = self.nodes[0].getmempoolinfo()
+ # pop unstable unbroadcastcount before check
+ for obj in [json_obj, mempool_info]:
+ obj.pop("unbroadcastcount")
assert_equal(json_obj, mempool_info)
# Check that there are our submitted transactions in the TX memory pool
diff --git a/test/functional/interface_usdt_coinselection.py b/test/functional/interface_usdt_coinselection.py
index aff90ea5fc..30931a41cd 100755
--- a/test/functional/interface_usdt_coinselection.py
+++ b/test/functional/interface_usdt_coinselection.py
@@ -204,6 +204,29 @@ class CoinSelectionTracepointTest(BitcoinTestFramework):
assert_equal(success, True)
assert_equal(use_aps, None)
+ self.log.info("Change position is -1 if no change is created with APS when APS was initially not used")
+ # We should have 2 tracepoints in the order:
+ # 1. selected_coins (type 1)
+ # 2. normal_create_tx_internal (type 2)
+ # 3. attempting_aps_create_tx (type 3)
+ # 4. selected_coins (type 1)
+ # 5. aps_create_tx_internal (type 4)
+ wallet.sendtoaddress(address=wallet.getnewaddress(), amount=wallet.getbalance(), subtractfeefromamount=True, avoid_reuse=False)
+ events = self.get_tracepoints([1, 2, 3, 1, 4])
+ success, use_aps, algo, waste, change_pos = self.determine_selection_from_usdt(events)
+ assert_equal(success, True)
+ assert_equal(change_pos, -1)
+
+ self.log.info("Change position is -1 if no change is created normally and APS is not used")
+ # We should have 2 tracepoints in the order:
+ # 1. selected_coins (type 1)
+ # 2. normal_create_tx_internal (type 2)
+ wallet.sendtoaddress(address=wallet.getnewaddress(), amount=wallet.getbalance(), subtractfeefromamount=True)
+ events = self.get_tracepoints([1, 2])
+ success, use_aps, algo, waste, change_pos = self.determine_selection_from_usdt(events)
+ assert_equal(success, True)
+ assert_equal(change_pos, -1)
+
self.bpf.cleanup()
diff --git a/test/functional/mempool_accept.py b/test/functional/mempool_accept.py
index 8f3aec96a7..538e1fe053 100755
--- a/test/functional/mempool_accept.py
+++ b/test/functional/mempool_accept.py
@@ -90,9 +90,17 @@ class MempoolAcceptanceTest(BitcoinTestFramework):
txid_in_block = self.wallet.sendrawtransaction(from_node=node, tx_hex=raw_tx_in_block)
self.generate(node, 1)
self.mempool_size = 0
+ # Also check feerate. 1BTC/kvB fails
+ assert_raises_rpc_error(-8, "Fee rates larger than or equal to 1BTC/kvB are not accepted", lambda: self.check_mempool_result(
+ result_expected=None,
+ rawtxs=[raw_tx_in_block],
+ maxfeerate=1,
+ ))
+ # ... 0.99 passes
self.check_mempool_result(
result_expected=[{'txid': txid_in_block, 'allowed': False, 'reject-reason': 'txn-already-known'}],
rawtxs=[raw_tx_in_block],
+ maxfeerate=0.99,
)
self.log.info('A transaction not in the mempool')
diff --git a/test/functional/mempool_accept_v3.py b/test/functional/mempool_accept_v3.py
new file mode 100755
index 0000000000..7ac3c97c4b
--- /dev/null
+++ b/test/functional/mempool_accept_v3.py
@@ -0,0 +1,451 @@
+#!/usr/bin/env python3
+# Copyright (c) 2024 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+from decimal import Decimal
+
+from test_framework.messages import (
+ MAX_BIP125_RBF_SEQUENCE,
+)
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import (
+ assert_equal,
+ assert_greater_than,
+ assert_greater_than_or_equal,
+ assert_raises_rpc_error,
+)
+from test_framework.wallet import (
+ DEFAULT_FEE,
+ MiniWallet,
+)
+
+def cleanup(extra_args=None):
+ def decorator(func):
+ def wrapper(self):
+ try:
+ if extra_args is not None:
+ self.restart_node(0, extra_args=extra_args)
+ func(self)
+ finally:
+ # Clear mempool again after test
+ self.generate(self.nodes[0], 1)
+ if extra_args is not None:
+ self.restart_node(0)
+ return wrapper
+ return decorator
+
+class MempoolAcceptV3(BitcoinTestFramework):
+ def set_test_params(self):
+ self.num_nodes = 1
+ self.extra_args = [["-acceptnonstdtxn=1"]]
+ self.setup_clean_chain = True
+
+ def check_mempool(self, txids):
+ """Assert exact contents of the node's mempool (by txid)."""
+ mempool_contents = self.nodes[0].getrawmempool()
+ assert_equal(len(txids), len(mempool_contents))
+ assert all([txid in txids for txid in mempool_contents])
+
+ @cleanup(extra_args=["-datacarriersize=1000", "-acceptnonstdtxn=1"])
+ def test_v3_acceptance(self):
+ node = self.nodes[0]
+ self.log.info("Test a child of a v3 transaction cannot be more than 1000vB")
+ tx_v3_parent_normal = self.wallet.send_self_transfer(from_node=node, version=3)
+ self.check_mempool([tx_v3_parent_normal["txid"]])
+ tx_v3_child_heavy = self.wallet.create_self_transfer(
+ utxo_to_spend=tx_v3_parent_normal["new_utxo"],
+ target_weight=4004,
+ version=3
+ )
+ assert_greater_than_or_equal(tx_v3_child_heavy["tx"].get_vsize(), 1000)
+ expected_error_child_heavy = f"v3-rule-violation, v3 child tx {tx_v3_child_heavy['txid']} (wtxid={tx_v3_child_heavy['wtxid']}) is too big"
+ assert_raises_rpc_error(-26, expected_error_child_heavy, node.sendrawtransaction, tx_v3_child_heavy["hex"])
+ self.check_mempool([tx_v3_parent_normal["txid"]])
+ # tx has no descendants
+ assert_equal(node.getmempoolentry(tx_v3_parent_normal["txid"])["descendantcount"], 1)
+
+ self.log.info("Test that, during replacements, only the new transaction counts for v3 descendant limit")
+ tx_v3_child_almost_heavy = self.wallet.send_self_transfer(
+ from_node=node,
+ fee_rate=DEFAULT_FEE,
+ utxo_to_spend=tx_v3_parent_normal["new_utxo"],
+ target_weight=3987,
+ version=3
+ )
+ assert_greater_than_or_equal(1000, tx_v3_child_almost_heavy["tx"].get_vsize())
+ self.check_mempool([tx_v3_parent_normal["txid"], tx_v3_child_almost_heavy["txid"]])
+ assert_equal(node.getmempoolentry(tx_v3_parent_normal["txid"])["descendantcount"], 2)
+ tx_v3_child_almost_heavy_rbf = self.wallet.send_self_transfer(
+ from_node=node,
+ fee_rate=DEFAULT_FEE * 2,
+ utxo_to_spend=tx_v3_parent_normal["new_utxo"],
+ target_weight=3500,
+ version=3
+ )
+ assert_greater_than_or_equal(tx_v3_child_almost_heavy["tx"].get_vsize() + tx_v3_child_almost_heavy_rbf["tx"].get_vsize(), 1000)
+ self.check_mempool([tx_v3_parent_normal["txid"], tx_v3_child_almost_heavy_rbf["txid"]])
+ assert_equal(node.getmempoolentry(tx_v3_parent_normal["txid"])["descendantcount"], 2)
+
+ @cleanup(extra_args=["-acceptnonstdtxn=1"])
+ def test_v3_replacement(self):
+ node = self.nodes[0]
+ self.log.info("Test v3 transactions may be replaced by v3 transactions")
+ utxo_v3_bip125 = self.wallet.get_utxo()
+ tx_v3_bip125 = self.wallet.send_self_transfer(
+ from_node=node,
+ fee_rate=DEFAULT_FEE,
+ utxo_to_spend=utxo_v3_bip125,
+ sequence=MAX_BIP125_RBF_SEQUENCE,
+ version=3
+ )
+ self.check_mempool([tx_v3_bip125["txid"]])
+
+ tx_v3_bip125_rbf = self.wallet.send_self_transfer(
+ from_node=node,
+ fee_rate=DEFAULT_FEE * 2,
+ utxo_to_spend=utxo_v3_bip125,
+ version=3
+ )
+ self.check_mempool([tx_v3_bip125_rbf["txid"]])
+
+ self.log.info("Test v3 transactions may be replaced by V2 transactions")
+ tx_v3_bip125_rbf_v2 = self.wallet.send_self_transfer(
+ from_node=node,
+ fee_rate=DEFAULT_FEE * 3,
+ utxo_to_spend=utxo_v3_bip125,
+ version=2
+ )
+ self.check_mempool([tx_v3_bip125_rbf_v2["txid"]])
+
+ self.log.info("Test that replacements cannot cause violation of inherited v3")
+ utxo_v3_parent = self.wallet.get_utxo()
+ tx_v3_parent = self.wallet.send_self_transfer(
+ from_node=node,
+ fee_rate=DEFAULT_FEE,
+ utxo_to_spend=utxo_v3_parent,
+ version=3
+ )
+ tx_v3_child = self.wallet.send_self_transfer(
+ from_node=node,
+ fee_rate=DEFAULT_FEE,
+ utxo_to_spend=tx_v3_parent["new_utxo"],
+ version=3
+ )
+ self.check_mempool([tx_v3_bip125_rbf_v2["txid"], tx_v3_parent["txid"], tx_v3_child["txid"]])
+
+ tx_v3_child_rbf_v2 = self.wallet.create_self_transfer(
+ fee_rate=DEFAULT_FEE * 2,
+ utxo_to_spend=tx_v3_parent["new_utxo"],
+ version=2
+ )
+ expected_error_v2_v3 = f"v3-rule-violation, non-v3 tx {tx_v3_child_rbf_v2['txid']} (wtxid={tx_v3_child_rbf_v2['wtxid']}) cannot spend from v3 tx {tx_v3_parent['txid']} (wtxid={tx_v3_parent['wtxid']})"
+ assert_raises_rpc_error(-26, expected_error_v2_v3, node.sendrawtransaction, tx_v3_child_rbf_v2["hex"])
+ self.check_mempool([tx_v3_bip125_rbf_v2["txid"], tx_v3_parent["txid"], tx_v3_child["txid"]])
+
+
+ @cleanup(extra_args=["-acceptnonstdtxn=1"])
+ def test_v3_bip125(self):
+ node = self.nodes[0]
+ self.log.info("Test v3 transactions that don't signal BIP125 are replaceable")
+ assert_equal(node.getmempoolinfo()["fullrbf"], False)
+ utxo_v3_no_bip125 = self.wallet.get_utxo()
+ tx_v3_no_bip125 = self.wallet.send_self_transfer(
+ from_node=node,
+ fee_rate=DEFAULT_FEE,
+ utxo_to_spend=utxo_v3_no_bip125,
+ sequence=MAX_BIP125_RBF_SEQUENCE + 1,
+ version=3
+ )
+
+ self.check_mempool([tx_v3_no_bip125["txid"]])
+ assert not node.getmempoolentry(tx_v3_no_bip125["txid"])["bip125-replaceable"]
+ tx_v3_no_bip125_rbf = self.wallet.send_self_transfer(
+ from_node=node,
+ fee_rate=DEFAULT_FEE * 2,
+ utxo_to_spend=utxo_v3_no_bip125,
+ version=3
+ )
+ self.check_mempool([tx_v3_no_bip125_rbf["txid"]])
+
+ @cleanup(extra_args=["-datacarriersize=40000", "-acceptnonstdtxn=1"])
+ def test_v3_reorg(self):
+ node = self.nodes[0]
+ self.log.info("Test that, during a reorg, v3 rules are not enforced")
+ tx_v2_block = self.wallet.send_self_transfer(from_node=node, version=2)
+ tx_v3_block = self.wallet.send_self_transfer(from_node=node, version=3)
+ tx_v3_block2 = self.wallet.send_self_transfer(from_node=node, version=3)
+ self.check_mempool([tx_v3_block["txid"], tx_v2_block["txid"], tx_v3_block2["txid"]])
+
+ block = self.generate(node, 1)
+ self.check_mempool([])
+ tx_v2_from_v3 = self.wallet.send_self_transfer(from_node=node, utxo_to_spend=tx_v3_block["new_utxo"], version=2)
+ tx_v3_from_v2 = self.wallet.send_self_transfer(from_node=node, utxo_to_spend=tx_v2_block["new_utxo"], version=3)
+ tx_v3_child_large = self.wallet.send_self_transfer(from_node=node, utxo_to_spend=tx_v3_block2["new_utxo"], target_weight=5000, version=3)
+ assert_greater_than(node.getmempoolentry(tx_v3_child_large["txid"])["vsize"], 1000)
+ self.check_mempool([tx_v2_from_v3["txid"], tx_v3_from_v2["txid"], tx_v3_child_large["txid"]])
+ node.invalidateblock(block[0])
+ self.check_mempool([tx_v3_block["txid"], tx_v2_block["txid"], tx_v3_block2["txid"], tx_v2_from_v3["txid"], tx_v3_from_v2["txid"], tx_v3_child_large["txid"]])
+ # This is needed because generate() will create the exact same block again.
+ node.reconsiderblock(block[0])
+
+
+ @cleanup(extra_args=["-limitdescendantsize=10", "-datacarriersize=40000", "-acceptnonstdtxn=1"])
+ def test_nondefault_package_limits(self):
+ """
+ Max standard tx size + v3 rules imply the ancestor/descendant rules (at their default
+ values), but those checks must not be skipped. Ensure both sets of checks are done by
+ changing the ancestor/descendant limit configurations.
+ """
+ node = self.nodes[0]
+ self.log.info("Test that a decreased limitdescendantsize also applies to v3 child")
+ tx_v3_parent_large1 = self.wallet.send_self_transfer(from_node=node, target_weight=99900, version=3)
+ tx_v3_child_large1 = self.wallet.create_self_transfer(utxo_to_spend=tx_v3_parent_large1["new_utxo"], version=3)
+ # Child is within v3 limits, but parent's descendant limit is exceeded
+ assert_greater_than(1000, tx_v3_child_large1["tx"].get_vsize())
+ assert_raises_rpc_error(-26, f"too-long-mempool-chain, exceeds descendant size limit for tx {tx_v3_parent_large1['txid']}", node.sendrawtransaction, tx_v3_child_large1["hex"])
+ self.check_mempool([tx_v3_parent_large1["txid"]])
+ assert_equal(node.getmempoolentry(tx_v3_parent_large1["txid"])["descendantcount"], 1)
+ self.generate(node, 1)
+
+ self.log.info("Test that a decreased limitancestorsize also applies to v3 parent")
+ self.restart_node(0, extra_args=["-limitancestorsize=10", "-datacarriersize=40000", "-acceptnonstdtxn=1"])
+ tx_v3_parent_large2 = self.wallet.send_self_transfer(from_node=node, target_weight=99900, version=3)
+ tx_v3_child_large2 = self.wallet.create_self_transfer(utxo_to_spend=tx_v3_parent_large2["new_utxo"], version=3)
+ # Child is within v3 limits
+ assert_greater_than_or_equal(1000, tx_v3_child_large2["tx"].get_vsize())
+ assert_raises_rpc_error(-26, f"too-long-mempool-chain, exceeds ancestor size limit", node.sendrawtransaction, tx_v3_child_large2["hex"])
+ self.check_mempool([tx_v3_parent_large2["txid"]])
+
+ @cleanup(extra_args=["-datacarriersize=1000", "-acceptnonstdtxn=1"])
+ def test_v3_ancestors_package(self):
+ self.log.info("Test that v3 ancestor limits are checked within the package")
+ node = self.nodes[0]
+ tx_v3_parent_normal = self.wallet.create_self_transfer(
+ fee_rate=0,
+ target_weight=4004,
+ version=3
+ )
+ tx_v3_parent_2_normal = self.wallet.create_self_transfer(
+ fee_rate=0,
+ target_weight=4004,
+ version=3
+ )
+ tx_v3_child_multiparent = self.wallet.create_self_transfer_multi(
+ utxos_to_spend=[tx_v3_parent_normal["new_utxo"], tx_v3_parent_2_normal["new_utxo"]],
+ fee_per_output=10000,
+ version=3
+ )
+ tx_v3_child_heavy = self.wallet.create_self_transfer_multi(
+ utxos_to_spend=[tx_v3_parent_normal["new_utxo"]],
+ target_weight=4004,
+ fee_per_output=10000,
+ version=3
+ )
+
+ self.check_mempool([])
+ result = node.submitpackage([tx_v3_parent_normal["hex"], tx_v3_parent_2_normal["hex"], tx_v3_child_multiparent["hex"]])
+ assert_equal(result['package_msg'], f"v3-violation, tx {tx_v3_child_multiparent['txid']} (wtxid={tx_v3_child_multiparent['wtxid']}) would have too many ancestors")
+ self.check_mempool([])
+
+ self.check_mempool([])
+ result = node.submitpackage([tx_v3_parent_normal["hex"], tx_v3_child_heavy["hex"]])
+ # tx_v3_child_heavy is heavy based on weight, not sigops.
+ assert_equal(result['package_msg'], f"v3-violation, v3 child tx {tx_v3_child_heavy['txid']} (wtxid={tx_v3_child_heavy['wtxid']}) is too big: {tx_v3_child_heavy['tx'].get_vsize()} > 1000 virtual bytes")
+ self.check_mempool([])
+
+ tx_v3_parent = self.wallet.create_self_transfer(version=3)
+ tx_v3_child = self.wallet.create_self_transfer(utxo_to_spend=tx_v3_parent["new_utxo"], version=3)
+ tx_v3_grandchild = self.wallet.create_self_transfer(utxo_to_spend=tx_v3_child["new_utxo"], version=3)
+ result = node.testmempoolaccept([tx_v3_parent["hex"], tx_v3_child["hex"], tx_v3_grandchild["hex"]])
+ assert all([txresult["package-error"] == f"v3-violation, tx {tx_v3_grandchild['txid']} (wtxid={tx_v3_grandchild['wtxid']}) would have too many ancestors" for txresult in result])
+
+ @cleanup(extra_args=["-acceptnonstdtxn=1"])
+ def test_v3_ancestors_package_and_mempool(self):
+ """
+ A v3 transaction in a package cannot have 2 v3 parents.
+ Test that if we have a transaction graph A -> B -> C, where A, B, C are
+ all v3 transactions, that we cannot use submitpackage to get the
+ transactions all into the mempool.
+
+ Verify, in particular, that if A is already in the mempool, then
+ submitpackage(B, C) will fail.
+ """
+ node = self.nodes[0]
+ self.log.info("Test that v3 ancestor limits include transactions within the package and all in-mempool ancestors")
+ # This is our transaction "A":
+ tx_in_mempool = self.wallet.send_self_transfer(from_node=node, version=3)
+
+ # Verify that A is in the mempool
+ self.check_mempool([tx_in_mempool["txid"]])
+
+ # tx_0fee_parent is our transaction "B"; just create it.
+ tx_0fee_parent = self.wallet.create_self_transfer(utxo_to_spend=tx_in_mempool["new_utxo"], fee=0, fee_rate=0, version=3)
+
+ # tx_child_violator is our transaction "C"; create it:
+ tx_child_violator = self.wallet.create_self_transfer_multi(utxos_to_spend=[tx_0fee_parent["new_utxo"]], version=3)
+
+ # submitpackage(B, C) should fail
+ result = node.submitpackage([tx_0fee_parent["hex"], tx_child_violator["hex"]])
+ assert_equal(result['package_msg'], f"v3-violation, tx {tx_child_violator['txid']} (wtxid={tx_child_violator['wtxid']}) would have too many ancestors")
+ self.check_mempool([tx_in_mempool["txid"]])
+
+ @cleanup(extra_args=["-acceptnonstdtxn=1"])
+ def test_mempool_sibling(self):
+ self.log.info("Test that v3 transaction cannot have mempool siblings")
+ node = self.nodes[0]
+ # Add a parent + child to mempool
+ tx_mempool_parent = self.wallet.send_self_transfer_multi(
+ from_node=node,
+ utxos_to_spend=[self.wallet.get_utxo()],
+ num_outputs=2,
+ version=3
+ )
+ tx_mempool_sibling = self.wallet.send_self_transfer(
+ from_node=node,
+ utxo_to_spend=tx_mempool_parent["new_utxos"][0],
+ version=3
+ )
+ self.check_mempool([tx_mempool_parent["txid"], tx_mempool_sibling["txid"]])
+
+ tx_has_mempool_sibling = self.wallet.create_self_transfer(
+ utxo_to_spend=tx_mempool_parent["new_utxos"][1],
+ version=3
+ )
+ expected_error_mempool_sibling = f"v3-rule-violation, tx {tx_mempool_parent['txid']} (wtxid={tx_mempool_parent['wtxid']}) would exceed descendant count limit"
+ assert_raises_rpc_error(-26, expected_error_mempool_sibling, node.sendrawtransaction, tx_has_mempool_sibling["hex"])
+
+ tx_has_mempool_uncle = self.wallet.create_self_transfer(utxo_to_spend=tx_has_mempool_sibling["new_utxo"], version=3)
+
+ # Also fails with another non-related transaction via testmempoolaccept
+ tx_unrelated = self.wallet.create_self_transfer(version=3)
+ result_test_unrelated = node.testmempoolaccept([tx_has_mempool_sibling["hex"], tx_unrelated["hex"]])
+ assert_equal(result_test_unrelated[0]["reject-reason"], "v3-rule-violation")
+
+ result_test_1p1c = node.testmempoolaccept([tx_has_mempool_sibling["hex"], tx_has_mempool_uncle["hex"]])
+ assert_equal(result_test_1p1c[0]["reject-reason"], "v3-rule-violation")
+
+ # Also fails with a child via submitpackage
+ result_submitpackage = node.submitpackage([tx_has_mempool_sibling["hex"], tx_has_mempool_uncle["hex"]])
+ assert_equal(result_submitpackage["tx-results"][tx_has_mempool_sibling['wtxid']]['error'], expected_error_mempool_sibling)
+
+
+ @cleanup(extra_args=["-datacarriersize=1000", "-acceptnonstdtxn=1"])
+ def test_v3_package_inheritance(self):
+ self.log.info("Test that v3 inheritance is checked within package")
+ node = self.nodes[0]
+ tx_v3_parent = self.wallet.create_self_transfer(
+ fee_rate=0,
+ target_weight=4004,
+ version=3
+ )
+ tx_v2_child = self.wallet.create_self_transfer_multi(
+ utxos_to_spend=[tx_v3_parent["new_utxo"]],
+ fee_per_output=10000,
+ version=2
+ )
+ self.check_mempool([])
+ result = node.submitpackage([tx_v3_parent["hex"], tx_v2_child["hex"]])
+ assert_equal(result['package_msg'], f"v3-violation, non-v3 tx {tx_v2_child['txid']} (wtxid={tx_v2_child['wtxid']}) cannot spend from v3 tx {tx_v3_parent['txid']} (wtxid={tx_v3_parent['wtxid']})")
+ self.check_mempool([])
+
+ @cleanup(extra_args=["-acceptnonstdtxn=1"])
+ def test_v3_in_testmempoolaccept(self):
+ node = self.nodes[0]
+
+ self.log.info("Test that v3 inheritance is accurately assessed in testmempoolaccept")
+ tx_v2 = self.wallet.create_self_transfer(version=2)
+ tx_v2_from_v2 = self.wallet.create_self_transfer(utxo_to_spend=tx_v2["new_utxo"], version=2)
+ tx_v3_from_v2 = self.wallet.create_self_transfer(utxo_to_spend=tx_v2["new_utxo"], version=3)
+ tx_v3 = self.wallet.create_self_transfer(version=3)
+ tx_v2_from_v3 = self.wallet.create_self_transfer(utxo_to_spend=tx_v3["new_utxo"], version=2)
+ tx_v3_from_v3 = self.wallet.create_self_transfer(utxo_to_spend=tx_v3["new_utxo"], version=3)
+
+ # testmempoolaccept paths don't require child-with-parents topology. Ensure that topology
+ # assumptions aren't made in inheritance checks.
+ test_accept_v2_and_v3 = node.testmempoolaccept([tx_v2["hex"], tx_v3["hex"]])
+ assert all([result["allowed"] for result in test_accept_v2_and_v3])
+
+ test_accept_v3_from_v2 = node.testmempoolaccept([tx_v2["hex"], tx_v3_from_v2["hex"]])
+ expected_error_v3_from_v2 = f"v3-violation, v3 tx {tx_v3_from_v2['txid']} (wtxid={tx_v3_from_v2['wtxid']}) cannot spend from non-v3 tx {tx_v2['txid']} (wtxid={tx_v2['wtxid']})"
+ assert all([result["package-error"] == expected_error_v3_from_v2 for result in test_accept_v3_from_v2])
+
+ test_accept_v2_from_v3 = node.testmempoolaccept([tx_v3["hex"], tx_v2_from_v3["hex"]])
+ expected_error_v2_from_v3 = f"v3-violation, non-v3 tx {tx_v2_from_v3['txid']} (wtxid={tx_v2_from_v3['wtxid']}) cannot spend from v3 tx {tx_v3['txid']} (wtxid={tx_v3['wtxid']})"
+ assert all([result["package-error"] == expected_error_v2_from_v3 for result in test_accept_v2_from_v3])
+
+ test_accept_pairs = node.testmempoolaccept([tx_v2["hex"], tx_v3["hex"], tx_v2_from_v2["hex"], tx_v3_from_v3["hex"]])
+ assert all([result["allowed"] for result in test_accept_pairs])
+
+ self.log.info("Test that descendant violations are caught in testmempoolaccept")
+ tx_v3_independent = self.wallet.create_self_transfer(version=3)
+ tx_v3_parent = self.wallet.create_self_transfer_multi(num_outputs=2, version=3)
+ tx_v3_child_1 = self.wallet.create_self_transfer(utxo_to_spend=tx_v3_parent["new_utxos"][0], version=3)
+ tx_v3_child_2 = self.wallet.create_self_transfer(utxo_to_spend=tx_v3_parent["new_utxos"][1], version=3)
+ test_accept_2children = node.testmempoolaccept([tx_v3_parent["hex"], tx_v3_child_1["hex"], tx_v3_child_2["hex"]])
+ expected_error_2children = f"v3-violation, tx {tx_v3_parent['txid']} (wtxid={tx_v3_parent['wtxid']}) would exceed descendant count limit"
+ assert all([result["package-error"] == expected_error_2children for result in test_accept_2children])
+
+ # Extra v3 transaction does not get incorrectly marked as extra descendant
+ test_accept_1child_with_exra = node.testmempoolaccept([tx_v3_parent["hex"], tx_v3_child_1["hex"], tx_v3_independent["hex"]])
+ assert all([result["allowed"] for result in test_accept_1child_with_exra])
+
+ # Extra v3 transaction does not make us ignore the extra descendant
+ test_accept_2children_with_exra = node.testmempoolaccept([tx_v3_parent["hex"], tx_v3_child_1["hex"], tx_v3_child_2["hex"], tx_v3_independent["hex"]])
+ expected_error_extra = f"v3-violation, tx {tx_v3_parent['txid']} (wtxid={tx_v3_parent['wtxid']}) would exceed descendant count limit"
+ assert all([result["package-error"] == expected_error_extra for result in test_accept_2children_with_exra])
+ # Same result if the parent is already in mempool
+ node.sendrawtransaction(tx_v3_parent["hex"])
+ test_accept_2children_with_in_mempool_parent = node.testmempoolaccept([tx_v3_child_1["hex"], tx_v3_child_2["hex"]])
+ assert all([result["package-error"] == expected_error_extra for result in test_accept_2children_with_in_mempool_parent])
+
+ @cleanup(extra_args=["-acceptnonstdtxn=1"])
+ def test_reorg_2child_rbf(self):
+ node = self.nodes[0]
+ self.log.info("Test that children of a v3 transaction can be replaced individually, even if there are multiple due to reorg")
+
+ ancestor_tx = self.wallet.send_self_transfer_multi(from_node=node, num_outputs=2, version=3)
+ self.check_mempool([ancestor_tx["txid"]])
+
+ block = self.generate(node, 1)[0]
+ self.check_mempool([])
+
+ child_1 = self.wallet.send_self_transfer(from_node=node, version=3, utxo_to_spend=ancestor_tx["new_utxos"][0])
+ child_2 = self.wallet.send_self_transfer(from_node=node, version=3, utxo_to_spend=ancestor_tx["new_utxos"][1])
+ self.check_mempool([child_1["txid"], child_2["txid"]])
+
+ self.generate(node, 1)
+ self.check_mempool([])
+
+ # Create a reorg, causing ancestor_tx to exceed the 1-child limit
+ node.invalidateblock(block)
+ self.check_mempool([ancestor_tx["txid"], child_1["txid"], child_2["txid"]])
+ assert_equal(node.getmempoolentry(ancestor_tx["txid"])["descendantcount"], 3)
+
+ # Create a replacement of child_1. It does not conflict with child_2.
+ child_1_conflict = self.wallet.send_self_transfer(from_node=node, version=3, utxo_to_spend=ancestor_tx["new_utxos"][0], fee_rate=Decimal("0.01"))
+
+ # Ensure child_1 and child_1_conflict are different transactions
+ assert (child_1_conflict["txid"] != child_1["txid"])
+ self.check_mempool([ancestor_tx["txid"], child_1_conflict["txid"], child_2["txid"]])
+ assert_equal(node.getmempoolentry(ancestor_tx["txid"])["descendantcount"], 3)
+
+ def run_test(self):
+ self.log.info("Generate blocks to create UTXOs")
+ node = self.nodes[0]
+ self.wallet = MiniWallet(node)
+ self.generate(self.wallet, 110)
+ self.test_v3_acceptance()
+ self.test_v3_replacement()
+ self.test_v3_bip125()
+ self.test_v3_reorg()
+ self.test_nondefault_package_limits()
+ self.test_v3_ancestors_package()
+ self.test_v3_ancestors_package_and_mempool()
+ self.test_mempool_sibling()
+ self.test_v3_package_inheritance()
+ self.test_v3_in_testmempoolaccept()
+ self.test_reorg_2child_rbf()
+
+
+if __name__ == "__main__":
+ MempoolAcceptV3().main()
diff --git a/test/functional/mempool_expiry.py b/test/functional/mempool_expiry.py
index 18b3a8def4..5eebe43488 100755
--- a/test/functional/mempool_expiry.py
+++ b/test/functional/mempool_expiry.py
@@ -36,13 +36,14 @@ class MempoolExpiryTest(BitcoinTestFramework):
node = self.nodes[0]
# Send a parent transaction that will expire.
- parent_txid = self.wallet.send_self_transfer(from_node=node)['txid']
+ parent = self.wallet.send_self_transfer(from_node=node)
+ parent_txid = parent["txid"]
parent_utxo = self.wallet.get_utxo(txid=parent_txid)
independent_utxo = self.wallet.get_utxo()
# Add prioritisation to this transaction to check that it persists after the expiry
node.prioritisetransaction(parent_txid, 0, COIN)
- assert_equal(node.getprioritisedtransactions()[parent_txid], { "fee_delta" : COIN, "in_mempool" : True})
+ assert_equal(node.getprioritisedtransactions()[parent_txid], { "fee_delta" : COIN, "in_mempool" : True, "modified_fee": COIN + COIN * parent["fee"] })
# Ensure the transactions we send to trigger the mempool check spend utxos that are independent of
# the transactions being tested for expiration.
diff --git a/test/functional/mempool_package_limits.py b/test/functional/mempool_package_limits.py
index 81451bf2a5..2a64597511 100755
--- a/test/functional/mempool_package_limits.py
+++ b/test/functional/mempool_package_limits.py
@@ -29,7 +29,7 @@ def check_package_limits(func):
testres_error_expected = node.testmempoolaccept(rawtxs=package_hex)
assert_equal(len(testres_error_expected), len(package_hex))
for txres in testres_error_expected:
- assert_equal(txres["package-error"], "package-mempool-limits")
+ assert "package-mempool-limits" in txres["package-error"]
# Clear mempool and check that the package passes now
self.generate(node, 1)
diff --git a/test/functional/mempool_sigoplimit.py b/test/functional/mempool_sigoplimit.py
index 2e7850fb40..d3fb5f9119 100755
--- a/test/functional/mempool_sigoplimit.py
+++ b/test/functional/mempool_sigoplimit.py
@@ -39,7 +39,7 @@ from test_framework.wallet import MiniWallet
from test_framework.wallet_util import generate_keypair
DEFAULT_BYTES_PER_SIGOP = 20 # default setting
-
+MAX_PUBKEYS_PER_MULTISIG = 20
class BytesPerSigOpTest(BitcoinTestFramework):
def set_test_params(self):
@@ -159,13 +159,14 @@ class BytesPerSigOpTest(BitcoinTestFramework):
# Separately, the parent tx is ok
parent_individual_testres = self.nodes[0].testmempoolaccept([tx_parent.serialize().hex()])[0]
assert parent_individual_testres["allowed"]
- # Multisig is counted as MAX_PUBKEYS_PER_MULTISIG = 20 sigops
- assert_equal(parent_individual_testres["vsize"], 5000 * 20)
+ max_multisig_vsize = MAX_PUBKEYS_PER_MULTISIG * 5000
+ assert_equal(parent_individual_testres["vsize"], max_multisig_vsize)
# But together, it's exceeding limits in the *package* context. If sigops adjusted vsize wasn't being checked
# here, it would get further in validation and give too-long-mempool-chain error instead.
packet_test = self.nodes[0].testmempoolaccept([tx_parent.serialize().hex(), tx_child.serialize().hex()])
- assert_equal([x["package-error"] for x in packet_test], ["package-mempool-limits", "package-mempool-limits"])
+ expected_package_error = f"package-mempool-limits, package size {2*max_multisig_vsize} exceeds ancestor size limit [limit: 101000]"
+ assert_equal([x["package-error"] for x in packet_test], [expected_package_error] * 2)
# When we actually try to submit, the parent makes it into the mempool, but the child would exceed ancestor vsize limits
res = self.nodes[0].submitpackage([tx_parent.serialize().hex(), tx_child.serialize().hex()])
diff --git a/test/functional/mining_prioritisetransaction.py b/test/functional/mining_prioritisetransaction.py
index 099c0e418c..c5f34e3ecb 100755
--- a/test/functional/mining_prioritisetransaction.py
+++ b/test/functional/mining_prioritisetransaction.py
@@ -45,7 +45,7 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
self.nodes[0].prioritisetransaction(tx_replacee["txid"], 0, 100)
assert_equal(self.nodes[0].getprioritisedtransactions(), { tx_replacee["txid"] : { "fee_delta" : 100, "in_mempool" : False}})
self.nodes[0].sendrawtransaction(tx_replacee["hex"])
- assert_equal(self.nodes[0].getprioritisedtransactions(), { tx_replacee["txid"] : { "fee_delta" : 100, "in_mempool" : True}})
+ assert_equal(self.nodes[0].getprioritisedtransactions(), { tx_replacee["txid"] : { "fee_delta" : 100, "in_mempool" : True, "modified_fee": int(tx_replacee["fee"] * COIN + 100)}})
self.nodes[0].sendrawtransaction(tx_replacement["hex"])
assert tx_replacee["txid"] not in self.nodes[0].getrawmempool()
assert_equal(self.nodes[0].getprioritisedtransactions(), { tx_replacee["txid"] : { "fee_delta" : 100, "in_mempool" : False}})
@@ -53,7 +53,7 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
# PrioritiseTransaction is additive
self.nodes[0].prioritisetransaction(tx_replacee["txid"], 0, COIN)
self.nodes[0].sendrawtransaction(tx_replacee["hex"])
- assert_equal(self.nodes[0].getprioritisedtransactions(), { tx_replacee["txid"] : { "fee_delta" : COIN + 100, "in_mempool" : True}})
+ assert_equal(self.nodes[0].getprioritisedtransactions(), { tx_replacee["txid"] : { "fee_delta" : COIN + 100, "in_mempool" : True, "modified_fee": int(tx_replacee["fee"] * COIN + COIN + 100)}})
self.generate(self.nodes[0], 1)
assert_equal(self.nodes[0].getprioritisedtransactions(), {})
@@ -111,9 +111,7 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
raw_after = self.nodes[0].getrawmempool(verbose=True)
assert_equal(raw_before[txid_a], raw_after[txid_a])
assert_equal(raw_before, raw_after)
- prioritisation_map_in_mempool = self.nodes[0].getprioritisedtransactions()
- assert_equal(prioritisation_map_in_mempool[txid_b], {"fee_delta" : fee_delta_b*COIN, "in_mempool" : True})
- assert_equal(prioritisation_map_in_mempool[txid_c], {"fee_delta" : (fee_delta_c_1 + fee_delta_c_2)*COIN, "in_mempool" : True})
+ assert_equal(self.nodes[0].getprioritisedtransactions(), {txid_b: {"fee_delta" : fee_delta_b*COIN, "in_mempool" : True, "modified_fee": int(fee_delta_b*COIN + COIN * tx_o_b["fee"])}, txid_c: {"fee_delta" : (fee_delta_c_1 + fee_delta_c_2)*COIN, "in_mempool" : True, "modified_fee": int((fee_delta_c_1 + fee_delta_c_2 ) * COIN + COIN * tx_o_c["fee"])}})
# Clear prioritisation, otherwise the transactions' fee deltas are persisted to mempool.dat and loaded again when the node
# is restarted at the end of this subtest. Deltas are removed when a transaction is mined, but only at that time. We do
# not check whether mapDeltas transactions were mined when loading from mempool.dat.
@@ -126,17 +124,13 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
self.nodes[0].prioritisetransaction(txid=txid_b, fee_delta=int(fee_delta_b * COIN))
self.nodes[0].prioritisetransaction(txid=txid_c, fee_delta=int(fee_delta_c_1 * COIN))
self.nodes[0].prioritisetransaction(txid=txid_c, fee_delta=int(fee_delta_c_2 * COIN))
- prioritisation_map_not_in_mempool = self.nodes[0].getprioritisedtransactions()
- assert_equal(prioritisation_map_not_in_mempool[txid_b], {"fee_delta" : fee_delta_b*COIN, "in_mempool" : False})
- assert_equal(prioritisation_map_not_in_mempool[txid_c], {"fee_delta" : (fee_delta_c_1 + fee_delta_c_2)*COIN, "in_mempool" : False})
+ assert_equal(self.nodes[0].getprioritisedtransactions(), {txid_b: {"fee_delta" : fee_delta_b*COIN, "in_mempool" : False}, txid_c: {"fee_delta" : (fee_delta_c_1 + fee_delta_c_2)*COIN, "in_mempool" : False}})
for t in [tx_o_a["hex"], tx_o_b["hex"], tx_o_c["hex"], tx_o_d["hex"]]:
self.nodes[0].sendrawtransaction(t)
raw_after = self.nodes[0].getrawmempool(verbose=True)
assert_equal(raw_before[txid_a], raw_after[txid_a])
assert_equal(raw_before, raw_after)
- prioritisation_map_in_mempool = self.nodes[0].getprioritisedtransactions()
- assert_equal(prioritisation_map_in_mempool[txid_b], {"fee_delta" : fee_delta_b*COIN, "in_mempool" : True})
- assert_equal(prioritisation_map_in_mempool[txid_c], {"fee_delta" : (fee_delta_c_1 + fee_delta_c_2)*COIN, "in_mempool" : True})
+ assert_equal(self.nodes[0].getprioritisedtransactions(), {txid_b: {"fee_delta" : fee_delta_b*COIN, "in_mempool" : True, "modified_fee": int(fee_delta_b*COIN + COIN * tx_o_b["fee"])}, txid_c: {"fee_delta" : (fee_delta_c_1 + fee_delta_c_2)*COIN, "in_mempool" : True, "modified_fee": int((fee_delta_c_1 + fee_delta_c_2 ) * COIN + COIN * tx_o_c["fee"])}})
# Clear mempool
self.generate(self.nodes[0], 1)
@@ -217,7 +211,7 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
# add a fee delta to something in the cheapest bucket and make sure it gets mined
# also check that a different entry in the cheapest bucket is NOT mined
self.nodes[0].prioritisetransaction(txid=txids[0][0], fee_delta=int(3*base_fee*COIN))
- assert_equal(self.nodes[0].getprioritisedtransactions(), {txids[0][0] : { "fee_delta" : 3*base_fee*COIN, "in_mempool" : True}})
+ assert_equal(self.nodes[0].getprioritisedtransactions(), {txids[0][0] : { "fee_delta" : 3*base_fee*COIN, "in_mempool" : True, "modified_fee": int(3*base_fee*COIN + COIN * 1 * base_fee)}})
# Priority disappears when prioritisetransaction is called with an inverse value...
self.nodes[0].prioritisetransaction(txid=txids[0][0], fee_delta=int(-3*base_fee*COIN))
@@ -264,11 +258,17 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
mempool = self.nodes[0].getrawmempool()
self.log.info("Assert that de-prioritised transaction is still in mempool")
assert high_fee_tx in mempool
- assert_equal(self.nodes[0].getprioritisedtransactions()[high_fee_tx], { "fee_delta" : -2*base_fee*COIN, "in_mempool" : True})
+ assert_equal(self.nodes[0].getprioritisedtransactions()[high_fee_tx], { "fee_delta" : -2*base_fee*COIN, "in_mempool" : True, "modified_fee": int(-2*base_fee*COIN + COIN * 3 * base_fee)})
for x in txids[2]:
if (x != high_fee_tx):
assert x not in mempool
+
+ self.log.info("Assert that 0 delta is never added to mapDeltas")
+ tx_id_zero_del = self.wallet.create_self_transfer()['txid']
+ self.nodes[0].prioritisetransaction(txid=tx_id_zero_del, fee_delta=0)
+ assert tx_id_zero_del not in self.nodes[0].getprioritisedtransactions()
+
# Create a free transaction. Should be rejected.
tx_res = self.wallet.create_self_transfer(fee_rate=0)
tx_hex = tx_res['hex']
@@ -287,7 +287,7 @@ class PrioritiseTransactionTest(BitcoinTestFramework):
self.log.info("Assert that prioritised free transaction is accepted to mempool")
assert_equal(self.nodes[0].sendrawtransaction(tx_hex), tx_id)
assert tx_id in self.nodes[0].getrawmempool()
- assert_equal(self.nodes[0].getprioritisedtransactions()[tx_id], { "fee_delta" : self.relayfee*COIN, "in_mempool" : True})
+ assert_equal(self.nodes[0].getprioritisedtransactions()[tx_id], { "fee_delta" : self.relayfee*COIN, "in_mempool" : True, "modified_fee": int(self.relayfee*COIN + COIN * tx_res["fee"])})
# Test that calling prioritisetransaction is sufficient to trigger
# getblocktemplate to (eventually) return a new block.
diff --git a/test/functional/p2p_add_connections.py b/test/functional/p2p_add_connections.py
index f4462673f2..bd766a279e 100755
--- a/test/functional/p2p_add_connections.py
+++ b/test/functional/p2p_add_connections.py
@@ -17,7 +17,7 @@ class P2PFeelerReceiver(P2PInterface):
# message is received from the test framework. Don't send any responses
# to the node's version message since the connection will already be
# closed.
- pass
+ self.send_version()
class P2PAddConnections(BitcoinTestFramework):
def set_test_params(self):
diff --git a/test/functional/p2p_addr_relay.py b/test/functional/p2p_addr_relay.py
index 2adcaf178c..b23ec1028b 100755
--- a/test/functional/p2p_addr_relay.py
+++ b/test/functional/p2p_addr_relay.py
@@ -75,6 +75,7 @@ class AddrReceiver(P2PInterface):
return self.num_ipv4_received != 0
def on_version(self, message):
+ self.send_version()
self.send_message(msg_verack())
if (self.send_getaddr):
self.send_message(msg_getaddr())
diff --git a/test/functional/p2p_i2p_ports.py b/test/functional/p2p_i2p_ports.py
index 13188b9305..20dcb50a57 100755
--- a/test/functional/p2p_i2p_ports.py
+++ b/test/functional/p2p_i2p_ports.py
@@ -6,36 +6,28 @@
Test ports handling for I2P hosts
"""
-import re
from test_framework.test_framework import BitcoinTestFramework
+PROXY = "127.0.0.1:60000"
class I2PPorts(BitcoinTestFramework):
def set_test_params(self):
self.num_nodes = 1
# The test assumes that an I2P SAM proxy is not listening here.
- self.extra_args = [["-i2psam=127.0.0.1:60000"]]
+ self.extra_args = [[f"-i2psam={PROXY}"]]
def run_test(self):
node = self.nodes[0]
self.log.info("Ensure we don't try to connect if port!=0")
addr = "zsxwyo6qcn3chqzwxnseusqgsnuw3maqnztkiypyfxtya4snkoka.b32.i2p:8333"
- raised = False
- try:
- with node.assert_debug_log(expected_msgs=[f"Error connecting to {addr}"]):
- node.addnode(node=addr, command="onetry")
- except AssertionError as e:
- raised = True
- if not re.search(r"Expected messages .* does not partially match log", str(e)):
- raise AssertionError(f"Assertion raised as expected, but with an unexpected message: {str(e)}")
- if not raised:
- raise AssertionError("Assertion should have been raised")
+ with node.assert_debug_log(expected_msgs=[f"Error connecting to {addr}, connection refused due to arbitrary port 8333"]):
+ node.addnode(node=addr, command="onetry")
self.log.info("Ensure we try to connect if port=0 and get an error due to missing I2P proxy")
addr = "h3r6bkn46qxftwja53pxiykntegfyfjqtnzbm6iv6r5mungmqgmq.b32.i2p:0"
- with node.assert_debug_log(expected_msgs=[f"Error connecting to {addr}"]):
+ with node.assert_debug_log(expected_msgs=[f"Error connecting to {addr}: Cannot connect to {PROXY}"]):
node.addnode(node=addr, command="onetry")
diff --git a/test/functional/p2p_ibd_stalling.py b/test/functional/p2p_ibd_stalling.py
index 0eb37fa92f..830f374d63 100755
--- a/test/functional/p2p_ibd_stalling.py
+++ b/test/functional/p2p_ibd_stalling.py
@@ -80,7 +80,8 @@ class P2PIBDStallingTest(BitcoinTestFramework):
# Need to wait until 1023 blocks are received - the magic total bytes number is a workaround in lack of an rpc
# returning the number of downloaded (but not connected) blocks.
- self.wait_until(lambda: self.total_bytes_recv_for_blocks() == 172761)
+ bytes_recv = 172761 if not self.options.v2transport else 169692
+ self.wait_until(lambda: self.total_bytes_recv_for_blocks() == bytes_recv)
self.all_sync_send_with_ping(peers)
# If there was a peer marked for stalling, it would get disconnected
diff --git a/test/functional/p2p_invalid_messages.py b/test/functional/p2p_invalid_messages.py
index 4916d36ab7..40a69936bc 100755
--- a/test/functional/p2p_invalid_messages.py
+++ b/test/functional/p2p_invalid_messages.py
@@ -109,6 +109,9 @@ class InvalidMessagesTest(BitcoinTestFramework):
self.nodes[0].disconnect_p2ps()
def test_magic_bytes(self):
+ # Skip with v2, magic bytes are v1-specific
+ if self.options.v2transport:
+ return
self.log.info("Test message with invalid magic bytes disconnects peer")
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
with self.nodes[0].assert_debug_log(['Header error: Wrong MessageStart ffffffff received']):
@@ -120,6 +123,9 @@ class InvalidMessagesTest(BitcoinTestFramework):
self.nodes[0].disconnect_p2ps()
def test_checksum(self):
+ # Skip with v2, the checksum is v1-specific
+ if self.options.v2transport:
+ return
self.log.info("Test message with invalid checksum logs an error")
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
with self.nodes[0].assert_debug_log(['Header error: Wrong checksum (badmsg, 2 bytes), expected 78df0a04 was ffffffff']):
@@ -137,7 +143,11 @@ class InvalidMessagesTest(BitcoinTestFramework):
def test_size(self):
self.log.info("Test message with oversized payload disconnects peer")
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
- with self.nodes[0].assert_debug_log(['Header error: Size too large (badmsg, 4000001 bytes)']):
+ error_msg = (
+ ['V2 transport error: packet too large (4000014 bytes)'] if self.options.v2transport
+ else ['Header error: Size too large (badmsg, 4000001 bytes)']
+ )
+ with self.nodes[0].assert_debug_log(error_msg):
msg = msg_unrecognized(str_data="d" * (VALID_DATA_LIMIT + 1))
msg = conn.build_message(msg)
conn.send_raw_message(msg)
@@ -147,15 +157,26 @@ class InvalidMessagesTest(BitcoinTestFramework):
def test_msgtype(self):
self.log.info("Test message with invalid message type logs an error")
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
- with self.nodes[0].assert_debug_log(['Header error: Invalid message type']):
+ if self.options.v2transport:
+ msgtype = 99 # not defined
msg = msg_unrecognized(str_data="d")
- msg = conn.build_message(msg)
- # Modify msgtype
- msg = msg[:7] + b'\x00' + msg[7 + 1:]
- conn.send_raw_message(msg)
- conn.sync_with_ping(timeout=1)
- # Check that traffic is accounted for (24 bytes header + 2 bytes payload)
- assert_equal(self.nodes[0].getpeerinfo()[0]['bytesrecv_per_msg']['*other*'], 26)
+ contents = msgtype.to_bytes(1, 'big') + msg.serialize()
+ tmsg = conn.v2_state.v2_enc_packet(contents, ignore=False)
+ with self.nodes[0].assert_debug_log(['V2 transport error: invalid message type']):
+ conn.send_raw_message(tmsg)
+ conn.sync_with_ping(timeout=1)
+ # Check that traffic is accounted for (20 bytes plus 3 bytes contents)
+ assert_equal(self.nodes[0].getpeerinfo()[0]['bytesrecv_per_msg']['*other*'], 23)
+ else:
+ with self.nodes[0].assert_debug_log(['Header error: Invalid message type']):
+ msg = msg_unrecognized(str_data="d")
+ msg = conn.build_message(msg)
+ # Modify msgtype
+ msg = msg[:7] + b'\x00' + msg[7 + 1:]
+ conn.send_raw_message(msg)
+ conn.sync_with_ping(timeout=1)
+ # Check that traffic is accounted for (24 bytes header + 2 bytes payload)
+ assert_equal(self.nodes[0].getpeerinfo()[0]['bytesrecv_per_msg']['*other*'], 26)
self.nodes[0].disconnect_p2ps()
def test_addrv2(self, label, required_log_messages, raw_addrv2):
@@ -306,8 +327,10 @@ class InvalidMessagesTest(BitcoinTestFramework):
def test_resource_exhaustion(self):
self.log.info("Test node stays up despite many large junk messages")
- conn = self.nodes[0].add_p2p_connection(P2PDataStore())
- conn2 = self.nodes[0].add_p2p_connection(P2PDataStore())
+ # Don't use v2 here - the non-optimised encryption would take too long to encrypt
+ # the large messages
+ conn = self.nodes[0].add_p2p_connection(P2PDataStore(), supports_v2_p2p=False)
+ conn2 = self.nodes[0].add_p2p_connection(P2PDataStore(), supports_v2_p2p=False)
msg_at_size = msg_unrecognized(str_data="b" * VALID_DATA_LIMIT)
assert len(msg_at_size.serialize()) == MAX_PROTOCOL_MESSAGE_LENGTH
diff --git a/test/functional/p2p_mutated_blocks.py b/test/functional/p2p_mutated_blocks.py
new file mode 100755
index 0000000000..737edaf5bf
--- /dev/null
+++ b/test/functional/p2p_mutated_blocks.py
@@ -0,0 +1,116 @@
+#!/usr/bin/env python3
+# Copyright (c) The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+"""
+Test that an attacker can't degrade compact block relay by sending unsolicited
+mutated blocks to clear in-flight blocktxn requests from other honest peers.
+"""
+
+from test_framework.p2p import P2PInterface
+from test_framework.messages import (
+ BlockTransactions,
+ msg_cmpctblock,
+ msg_block,
+ msg_blocktxn,
+ HeaderAndShortIDs,
+)
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.blocktools import (
+ COINBASE_MATURITY,
+ create_block,
+ add_witness_commitment,
+ NORMAL_GBT_REQUEST_PARAMS,
+)
+from test_framework.util import assert_equal
+from test_framework.wallet import MiniWallet
+import copy
+
+class MutatedBlocksTest(BitcoinTestFramework):
+ def set_test_params(self):
+ self.setup_clean_chain = True
+ self.num_nodes = 1
+ self.extra_args = [
+ [
+ "-testactivationheight=segwit@1", # causes unconnected headers/blocks to not have segwit considered deployed
+ ],
+ ]
+
+ def run_test(self):
+ self.wallet = MiniWallet(self.nodes[0])
+ self.generate(self.wallet, COINBASE_MATURITY)
+
+ honest_relayer = self.nodes[0].add_outbound_p2p_connection(P2PInterface(), p2p_idx=0, connection_type="outbound-full-relay")
+ attacker = self.nodes[0].add_p2p_connection(P2PInterface())
+
+ # Create new block with two transactions (coinbase + 1 self-transfer).
+ # The self-transfer transaction is needed to trigger a compact block
+ # `getblocktxn` roundtrip.
+ tx = self.wallet.create_self_transfer()["tx"]
+ block = create_block(tmpl=self.nodes[0].getblocktemplate(NORMAL_GBT_REQUEST_PARAMS), txlist=[tx])
+ add_witness_commitment(block)
+ block.solve()
+
+ # Create mutated version of the block by changing the transaction
+ # version on the self-transfer.
+ mutated_block = copy.deepcopy(block)
+ mutated_block.vtx[1].nVersion = 4
+
+ # Announce the new block via a compact block through the honest relayer
+ cmpctblock = HeaderAndShortIDs()
+ cmpctblock.initialize_from_block(block, use_witness=True)
+ honest_relayer.send_message(msg_cmpctblock(cmpctblock.to_p2p()))
+
+ # Wait for a `getblocktxn` that attempts to fetch the self-transfer
+ def self_transfer_requested():
+ if not honest_relayer.last_message.get('getblocktxn'):
+ return False
+
+ get_block_txn = honest_relayer.last_message['getblocktxn']
+ return get_block_txn.block_txn_request.blockhash == block.sha256 and \
+ get_block_txn.block_txn_request.indexes == [1]
+ honest_relayer.wait_until(self_transfer_requested, timeout=5)
+
+ # Block at height 101 should be the only one in flight from peer 0
+ peer_info_prior_to_attack = self.nodes[0].getpeerinfo()
+ assert_equal(peer_info_prior_to_attack[0]['id'], 0)
+ assert_equal([101], peer_info_prior_to_attack[0]["inflight"])
+
+ # Attempt to clear the honest relayer's download request by sending the
+ # mutated block (as the attacker).
+ with self.nodes[0].assert_debug_log(expected_msgs=["Block mutated: bad-txnmrklroot, hashMerkleRoot mismatch"]):
+ attacker.send_message(msg_block(mutated_block))
+ # Attacker should get disconnected for sending a mutated block
+ attacker.wait_for_disconnect(timeout=5)
+
+ # Block at height 101 should *still* be the only block in-flight from
+ # peer 0
+ peer_info_after_attack = self.nodes[0].getpeerinfo()
+ assert_equal(peer_info_after_attack[0]['id'], 0)
+ assert_equal([101], peer_info_after_attack[0]["inflight"])
+
+ # The honest relayer should be able to complete relaying the block by
+ # sending the blocktxn that was requested.
+ block_txn = msg_blocktxn()
+ block_txn.block_transactions = BlockTransactions(blockhash=block.sha256, transactions=[tx])
+ honest_relayer.send_and_ping(block_txn)
+ assert_equal(self.nodes[0].getbestblockhash(), block.hash)
+
+ # Check that unexpected-witness mutation check doesn't trigger on a header that doesn't connect to anything
+ assert_equal(len(self.nodes[0].getpeerinfo()), 1)
+ attacker = self.nodes[0].add_p2p_connection(P2PInterface())
+ block_missing_prev = copy.deepcopy(block)
+ block_missing_prev.hashPrevBlock = 123
+ block_missing_prev.solve()
+
+ # Attacker gets a DoS score of 10, not immediately disconnected, so we do it 10 times to get to 100
+ for _ in range(10):
+ assert_equal(len(self.nodes[0].getpeerinfo()), 2)
+ with self.nodes[0].assert_debug_log(expected_msgs=["AcceptBlock FAILED (prev-blk-not-found)"]):
+ attacker.send_message(msg_block(block_missing_prev))
+ attacker.wait_for_disconnect(timeout=5)
+
+
+if __name__ == '__main__':
+ MutatedBlocksTest().main()
diff --git a/test/functional/p2p_sendtxrcncl.py b/test/functional/p2p_sendtxrcncl.py
index 0e349ef70c..8f5e6c0387 100755
--- a/test/functional/p2p_sendtxrcncl.py
+++ b/test/functional/p2p_sendtxrcncl.py
@@ -29,6 +29,7 @@ class PeerNoVerack(P2PInterface):
# Avoid sending verack in response to version.
# When calling add_p2p_connection, wait_for_verack=False must be set (see
# comment in add_p2p_connection).
+ self.send_version()
if message.nVersion >= 70016 and self.wtxidrelay:
self.send_message(msg_wtxidrelay())
@@ -43,7 +44,8 @@ class SendTxrcnclReceiver(P2PInterface):
class P2PFeelerReceiver(SendTxrcnclReceiver):
def on_version(self, message):
- pass # feeler connections can not send any message other than their own version
+ # feeler connections can not send any message other than their own version
+ self.send_version()
class PeerTrackMsgOrder(P2PInterface):
diff --git a/test/functional/p2p_timeouts.py b/test/functional/p2p_timeouts.py
index b4fa5099d8..80d7b6e9ae 100755
--- a/test/functional/p2p_timeouts.py
+++ b/test/functional/p2p_timeouts.py
@@ -69,11 +69,8 @@ class TimeoutsTest(BitcoinTestFramework):
with self.nodes[0].assert_debug_log(['Unsupported message "ping" prior to verack from peer=0']):
no_verack_node.send_message(msg_ping())
- # With v2, non-version messages before the handshake would be interpreted as part of the key exchange.
- # Therefore, don't execute this part of the test if v2transport is chosen.
- if not self.options.v2transport:
- with self.nodes[0].assert_debug_log(['non-version message before version handshake. Message "ping" from peer=1']):
- no_version_node.send_message(msg_ping())
+ with self.nodes[0].assert_debug_log(['non-version message before version handshake. Message "ping" from peer=1']):
+ no_version_node.send_message(msg_ping())
self.mock_forward(1)
assert "version" in no_verack_node.last_message
@@ -83,14 +80,20 @@ class TimeoutsTest(BitcoinTestFramework):
assert no_send_node.is_connected
no_verack_node.send_message(msg_ping())
- if not self.options.v2transport:
- no_version_node.send_message(msg_ping())
-
- expected_timeout_logs = [
- "version handshake timeout peer=0",
- f"socket no message in first 3 seconds, {'0' if self.options.v2transport else '1'} 0 peer=1",
- "socket no message in first 3 seconds, 0 0 peer=2",
- ]
+ no_version_node.send_message(msg_ping())
+
+ if self.options.v2transport:
+ expected_timeout_logs = [
+ "version handshake timeout peer=0",
+ "version handshake timeout peer=1",
+ "version handshake timeout peer=2",
+ ]
+ else:
+ expected_timeout_logs = [
+ "version handshake timeout peer=0",
+ "socket no message in first 3 seconds, 1 0 peer=1",
+ "socket no message in first 3 seconds, 0 0 peer=2",
+ ]
with self.nodes[0].assert_debug_log(expected_msgs=expected_timeout_logs):
self.mock_forward(2)
diff --git a/test/functional/p2p_v2_earlykeyresponse.py b/test/functional/p2p_v2_earlykeyresponse.py
new file mode 100755
index 0000000000..32d2e1148a
--- /dev/null
+++ b/test/functional/p2p_v2_earlykeyresponse.py
@@ -0,0 +1,89 @@
+#!/usr/bin/env python3
+# Copyright (c) 2022 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+
+import random
+
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.crypto.ellswift import ellswift_create
+from test_framework.p2p import P2PInterface
+from test_framework.v2_p2p import EncryptedP2PState
+
+
+class TestEncryptedP2PState(EncryptedP2PState):
+ """ Modify v2 P2P protocol functions for testing that "The responder waits until one byte is received which does
+ not match the 16 bytes consisting of the network magic followed by "version\x00\x00\x00\x00\x00"." (see BIP 324)
+
+ - if `send_net_magic` is True, send first 4 bytes of ellswift (match network magic) else send remaining 60 bytes
+ - `can_data_be_received` is a variable used to assert if data is received on recvbuf.
+ - v2 TestNode shouldn't respond back if we send V1_PREFIX and data shouldn't be received on recvbuf.
+ This state is represented using `can_data_be_received` = False.
+ - v2 TestNode responds back when mismatch from V1_PREFIX happens and data can be received on recvbuf.
+ This state is represented using `can_data_be_received` = True.
+ """
+
+ def __init__(self):
+ super().__init__(initiating=True, net='regtest')
+ self.send_net_magic = True
+ self.can_data_be_received = False
+
+ def initiate_v2_handshake(self, garbage_len=random.randrange(4096)):
+ """Initiator begins the v2 handshake by sending its ellswift bytes and garbage.
+ Here, the 64 bytes ellswift is assumed to have it's 4 bytes match network magic bytes. It is sent in 2 phases:
+ 1. when `send_network_magic` = True, send first 4 bytes of ellswift (matches network magic bytes)
+ 2. when `send_network_magic` = False, send remaining 60 bytes of ellswift
+ """
+ if self.send_net_magic:
+ self.privkey_ours, self.ellswift_ours = ellswift_create()
+ self.sent_garbage = random.randbytes(garbage_len)
+ self.send_net_magic = False
+ return b"\xfa\xbf\xb5\xda"
+ else:
+ self.can_data_be_received = True
+ return self.ellswift_ours[4:] + self.sent_garbage
+
+
+class PeerEarlyKey(P2PInterface):
+ """Custom implementation of P2PInterface which uses modified v2 P2P protocol functions for testing purposes."""
+ def __init__(self):
+ super().__init__()
+ self.v2_state = None
+ self.connection_opened = False
+
+ def connection_made(self, transport):
+ """64 bytes ellswift is sent in 2 parts during `initial_v2_handshake()`"""
+ self.v2_state = TestEncryptedP2PState()
+ super().connection_made(transport)
+
+ def data_received(self, t):
+ # check that data can be received on recvbuf only when mismatch from V1_PREFIX happens (send_net_magic = False)
+ assert self.v2_state.can_data_be_received and not self.v2_state.send_net_magic
+
+ def on_open(self):
+ self.connection_opened = True
+
+class P2PEarlyKey(BitcoinTestFramework):
+ def set_test_params(self):
+ self.num_nodes = 1
+ self.extra_args = [["-v2transport=1", "-peertimeout=3"]]
+
+ def run_test(self):
+ self.log.info('Sending ellswift bytes in parts to ensure that response from responder is received only when')
+ self.log.info('ellswift bytes have a mismatch from the 16 bytes(network magic followed by "version\\x00\\x00\\x00\\x00\\x00")')
+ node0 = self.nodes[0]
+ self.log.info('Sending first 4 bytes of ellswift which match network magic')
+ self.log.info('If a response is received, assertion failure would happen in our custom data_received() function')
+ # send happens in `initiate_v2_handshake()` in `connection_made()`
+ peer1 = node0.add_p2p_connection(PeerEarlyKey(), wait_for_verack=False, send_version=False, supports_v2_p2p=True, wait_for_v2_handshake=False)
+ self.wait_until(lambda: peer1.connection_opened)
+ self.log.info('Sending remaining ellswift and garbage which are different from V1_PREFIX. Since a response is')
+ self.log.info('expected now, our custom data_received() function wouldn\'t result in assertion failure')
+ ellswift_and_garbage_data = peer1.v2_state.initiate_v2_handshake()
+ peer1.send_raw_message(ellswift_and_garbage_data)
+ peer1.wait_for_disconnect(timeout=5)
+ self.log.info('successful disconnection when MITM happens in the key exchange phase')
+
+
+if __name__ == '__main__':
+ P2PEarlyKey().main()
diff --git a/test/functional/p2p_v2_encrypted.py b/test/functional/p2p_v2_encrypted.py
new file mode 100755
index 0000000000..05755dece0
--- /dev/null
+++ b/test/functional/p2p_v2_encrypted.py
@@ -0,0 +1,134 @@
+#!/usr/bin/env python3
+# Copyright (c) 2022 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+"""
+Test encrypted v2 p2p proposed in BIP 324
+"""
+from test_framework.blocktools import (
+ create_block,
+ create_coinbase,
+)
+from test_framework.p2p import (
+ P2PDataStore,
+ P2PInterface,
+)
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import (
+ assert_equal,
+ assert_greater_than,
+ check_node_connections,
+)
+from test_framework.crypto.chacha20 import REKEY_INTERVAL
+
+
+class P2PEncrypted(BitcoinTestFramework):
+ def set_test_params(self):
+ self.num_nodes = 2
+ self.extra_args = [["-v2transport=1"], ["-v2transport=1"]]
+
+ def setup_network(self):
+ self.setup_nodes()
+
+ def generate_blocks(self, node, number):
+ test_blocks = []
+ last_block = node.getbestblockhash()
+ tip = int(last_block, 16)
+ tipheight = node.getblockcount()
+ last_block_time = node.getblock(last_block)['time']
+ for _ in range(number):
+ # Create some blocks
+ block = create_block(tip, create_coinbase(tipheight + 1), last_block_time + 1)
+ block.solve()
+ test_blocks.append(block)
+ tip = block.sha256
+ tipheight += 1
+ last_block_time += 1
+ return test_blocks
+
+ def create_test_block(self, txs):
+ block = create_block(self.tip, create_coinbase(self.tipheight + 1), self.last_block_time + 600, txlist=txs)
+ block.solve()
+ return block
+
+ def run_test(self):
+ node0, node1 = self.nodes[0], self.nodes[1]
+ self.log.info("Check inbound connection to v2 TestNode from v2 P2PConnection is v2")
+ peer1 = node0.add_p2p_connection(P2PInterface(), wait_for_verack=True, supports_v2_p2p=True)
+ assert peer1.supports_v2_p2p
+ assert_equal(node0.getpeerinfo()[-1]["transport_protocol_type"], "v2")
+
+ self.log.info("Check inbound connection to v2 TestNode from v1 P2PConnection is v1")
+ peer2 = node0.add_p2p_connection(P2PInterface(), wait_for_verack=True, supports_v2_p2p=False)
+ assert not peer2.supports_v2_p2p
+ assert_equal(node0.getpeerinfo()[-1]["transport_protocol_type"], "v1")
+
+ self.log.info("Check outbound connection from v2 TestNode to v1 P2PConnection advertised as v1 is v1")
+ peer3 = node0.add_outbound_p2p_connection(P2PInterface(), p2p_idx=0, supports_v2_p2p=False, advertise_v2_p2p=False)
+ assert not peer3.supports_v2_p2p
+ assert_equal(node0.getpeerinfo()[-1]["transport_protocol_type"], "v1")
+
+ # v2 TestNode performs downgrading here
+ self.log.info("Check outbound connection from v2 TestNode to v1 P2PConnection advertised as v2 is v1")
+ peer4 = node0.add_outbound_p2p_connection(P2PInterface(), p2p_idx=1, supports_v2_p2p=False, advertise_v2_p2p=True)
+ assert not peer4.supports_v2_p2p
+ assert_equal(node0.getpeerinfo()[-1]["transport_protocol_type"], "v1")
+
+ self.log.info("Check outbound connection from v2 TestNode to v2 P2PConnection advertised as v2 is v2")
+ peer5 = node0.add_outbound_p2p_connection(P2PInterface(), p2p_idx=2, supports_v2_p2p=True, advertise_v2_p2p=True)
+ assert peer5.supports_v2_p2p
+ assert_equal(node0.getpeerinfo()[-1]["transport_protocol_type"], "v2")
+
+ self.log.info("Check if version is sent and verack is received in inbound/outbound connections")
+ assert_equal(len(node0.getpeerinfo()), 5) # check if above 5 connections are present in node0's getpeerinfo()
+ for peer in node0.getpeerinfo():
+ assert_greater_than(peer['bytessent_per_msg']['version'], 0)
+ assert_greater_than(peer['bytesrecv_per_msg']['verack'], 0)
+
+ self.log.info("Testing whether blocks propagate - check if tips sync when number of blocks >= REKEY_INTERVAL")
+ # tests whether rekeying (which happens every REKEY_INTERVAL packets) works correctly
+ test_blocks = self.generate_blocks(node0, REKEY_INTERVAL+1)
+
+ for i in range(2):
+ peer6 = node0.add_p2p_connection(P2PDataStore(), supports_v2_p2p=True)
+ assert peer6.supports_v2_p2p
+ assert_equal(node0.getpeerinfo()[-1]["transport_protocol_type"], "v2")
+
+ # Consider: node0 <-- peer6. node0 and node1 aren't connected here.
+ # Construct the following topology: node1 <--> node0 <-- peer6
+ # and test that blocks produced by peer6 will be received by node1 if sent normally
+ # and won't be received by node1 if sent as decoy messages
+
+ # First, check whether blocks produced be peer6 are received by node0 if sent normally
+ # and not received by node0 if sent as decoy messages.
+ if i:
+ # check that node0 receives blocks produced by peer6
+ self.log.info("Check if blocks produced by node0's p2p connection is received by node0")
+ peer6.send_blocks_and_test(test_blocks, node0, success=True) # node0's tip advances
+ else:
+ # check that node0 doesn't receive blocks produced by peer6 since they are sent as decoy messages
+ self.log.info("Check if blocks produced by node0's p2p connection sent as decoys aren't received by node0")
+ peer6.send_blocks_and_test(test_blocks, node0, success=False, is_decoy=True) # node0's tip doesn't advance
+
+ # Then, connect node0 and node1 using v2 and check whether the blocks are received by node1
+ self.connect_nodes(0, 1, peer_advertises_v2=True)
+ self.log.info("Wait for node1 to receive all the blocks from node0")
+ self.sync_all()
+ self.log.info("Make sure node0 and node1 have same block tips")
+ assert_equal(node0.getbestblockhash(), node1.getbestblockhash())
+
+ self.disconnect_nodes(0, 1)
+
+ self.log.info("Check the connections opened as expected")
+ check_node_connections(node=node0, num_in=4, num_out=3)
+
+ self.log.info("Check inbound connection to v1 TestNode from v2 P2PConnection is v1")
+ self.restart_node(0, ["-v2transport=0"])
+ peer1 = node0.add_p2p_connection(P2PInterface(), wait_for_verack=True, supports_v2_p2p=True)
+ assert not peer1.supports_v2_p2p
+ assert_equal(node0.getpeerinfo()[-1]["transport_protocol_type"], "v1")
+ check_node_connections(node=node0, num_in=1, num_out=0)
+
+
+if __name__ == '__main__':
+ P2PEncrypted().main()
diff --git a/test/functional/p2p_v2_transport.py b/test/functional/p2p_v2_transport.py
index 72d22cb77f..fe2449124d 100755
--- a/test/functional/p2p_v2_transport.py
+++ b/test/functional/p2p_v2_transport.py
@@ -7,12 +7,12 @@ Test v2 transport
"""
import socket
-from test_framework.messages import NODE_P2P_V2
-from test_framework.p2p import MAGIC_BYTES
+from test_framework.messages import MAGIC_BYTES, NODE_P2P_V2
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
assert_equal,
p2p_port,
+ assert_raises_rpc_error
)
@@ -60,6 +60,11 @@ class V2TransportTest(BitcoinTestFramework):
# V1 nodes can sync with each other
assert_equal(self.nodes[2].getblockcount(), 0)
assert_equal(self.nodes[3].getblockcount(), 0)
+
+ # addnode rpc error when v2transport requested but not enabled
+ ip_port = "127.0.0.1:{}".format(p2p_port(3))
+ assert_raises_rpc_error(-8, "Error: v2transport requested but not enabled (see -v2transport)", self.nodes[2].addnode, node=ip_port, command='add', v2transport=True)
+
with self.nodes[2].assert_debug_log(expected_msgs=[],
unexpected_msgs=[sending_handshake, downgrading_to_v1]):
self.connect_nodes(2, 3, peer_advertises_v2=False)
diff --git a/test/functional/rpc_bind.py b/test/functional/rpc_bind.py
index 43cd23fc7a..3106419e5c 100755
--- a/test/functional/rpc_bind.py
+++ b/test/functional/rpc_bind.py
@@ -4,8 +4,6 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test running bitcoind with the -rpcbind and -rpcallowip options."""
-import sys
-
from test_framework.netutil import all_interfaces, addr_to_hex, get_bind_addrs, test_ipv6_local
from test_framework.test_framework import BitcoinTestFramework, SkipTest
from test_framework.util import assert_equal, assert_raises_rpc_error, get_rpc_proxy, rpc_port, rpc_url
@@ -17,6 +15,10 @@ class RPCBindTest(BitcoinTestFramework):
self.num_nodes = 1
self.supports_cli = False
+ def skip_test_if_missing_module(self):
+ # due to OS-specific network stats queries, this test works only on Linux
+ self.skip_if_platform_not_linux()
+
def setup_network(self):
self.add_nodes(self.num_nodes, None)
@@ -61,14 +63,9 @@ class RPCBindTest(BitcoinTestFramework):
self.stop_nodes()
def run_test(self):
- # due to OS-specific network stats queries, this test works only on Linux
if sum([self.options.run_ipv4, self.options.run_ipv6, self.options.run_nonloopback]) > 1:
raise AssertionError("Only one of --ipv4, --ipv6 and --nonloopback can be set")
- self.log.info("Check for linux")
- if not sys.platform.startswith('linux'):
- raise SkipTest("This test can only be run on linux.")
-
self.log.info("Check for ipv6")
have_ipv6 = test_ipv6_local()
if not have_ipv6 and not (self.options.run_ipv4 or self.options.run_nonloopback):
diff --git a/test/functional/rpc_net.py b/test/functional/rpc_net.py
index e1820b0f55..accb2439f2 100755
--- a/test/functional/rpc_net.py
+++ b/test/functional/rpc_net.py
@@ -113,10 +113,15 @@ class NetTest(BitcoinTestFramework):
self.nodes[0].setmocktime(no_version_peer_conntime)
with self.nodes[0].wait_for_new_peer():
no_version_peer = self.nodes[0].add_p2p_connection(P2PInterface(), send_version=False, wait_for_verack=False)
+ if self.options.v2transport:
+ self.wait_until(lambda: self.nodes[0].getpeerinfo()[no_version_peer_id]["transport_protocol_type"] == "v2")
self.nodes[0].setmocktime(0)
peer_info = self.nodes[0].getpeerinfo()[no_version_peer_id]
peer_info.pop("addr")
peer_info.pop("addrbind")
+ # The next two fields will vary for v2 connections because we send a rng-based number of decoy messages
+ peer_info.pop("bytesrecv")
+ peer_info.pop("bytessent")
assert_equal(
peer_info,
{
@@ -125,9 +130,7 @@ class NetTest(BitcoinTestFramework):
"addr_relay_enabled": False,
"bip152_hb_from": False,
"bip152_hb_to": False,
- "bytesrecv": 0,
"bytesrecv_per_msg": {},
- "bytessent": 0,
"bytessent_per_msg": {},
"connection_type": "inbound",
"conntime": no_version_peer_conntime,
@@ -136,8 +139,8 @@ class NetTest(BitcoinTestFramework):
"inflight": [],
"last_block": 0,
"last_transaction": 0,
- "lastrecv": 0,
- "lastsend": 0,
+ "lastrecv": 0 if not self.options.v2transport else no_version_peer_conntime,
+ "lastsend": 0 if not self.options.v2transport else no_version_peer_conntime,
"minfeefilter": Decimal("0E-8"),
"network": "not_publicly_routable",
"permissions": [],
@@ -145,13 +148,13 @@ class NetTest(BitcoinTestFramework):
"relaytxes": False,
"services": "0000000000000000",
"servicesnames": [],
- "session_id": "",
+ "session_id": "" if not self.options.v2transport else no_version_peer.v2_state.peer['session_id'].hex(),
"startingheight": -1,
"subver": "",
"synced_blocks": -1,
"synced_headers": -1,
"timeoffset": 0,
- "transport_protocol_type": "v1" if not self.options.v2transport else "detecting",
+ "transport_protocol_type": "v1" if not self.options.v2transport else "v2",
"version": 0,
},
)
@@ -244,7 +247,10 @@ class NetTest(BitcoinTestFramework):
def test_service_flags(self):
self.log.info("Test service flags")
self.nodes[0].add_p2p_connection(P2PInterface(), services=(1 << 4) | (1 << 63))
- assert_equal(['UNKNOWN[2^4]', 'UNKNOWN[2^63]'], self.nodes[0].getpeerinfo()[-1]['servicesnames'])
+ if self.options.v2transport:
+ assert_equal(['UNKNOWN[2^4]', 'P2P_V2', 'UNKNOWN[2^63]'], self.nodes[0].getpeerinfo()[-1]['servicesnames'])
+ else:
+ assert_equal(['UNKNOWN[2^4]', 'UNKNOWN[2^63]'], self.nodes[0].getpeerinfo()[-1]['servicesnames'])
self.nodes[0].disconnect_p2ps()
def test_getnodeaddresses(self):
diff --git a/test/functional/rpc_psbt.py b/test/functional/rpc_psbt.py
index 1fd938d18a..016aa3ba11 100755
--- a/test/functional/rpc_psbt.py
+++ b/test/functional/rpc_psbt.py
@@ -753,11 +753,16 @@ class PSBTTest(BitcoinTestFramework):
break
psbt_in = dec["inputs"][input_idx]
# Calculate the input weight
- # (prevout + sequence + length of scriptSig + scriptsig + 1 byte buffer) * WITNESS_SCALE_FACTOR + num scriptWitness stack items + (length of stack item + stack item) * N stack items + 1 byte buffer
+ # (prevout + sequence + length of scriptSig + scriptsig) * WITNESS_SCALE_FACTOR + len of num scriptWitness stack items + (length of stack item + stack item) * N stack items
+ # Note that occasionally this weight estimate may be slightly larger or smaller than the real weight
+ # as sometimes ECDSA signatures are one byte shorter than expected with a probability of 1/128
len_scriptsig = len(psbt_in["final_scriptSig"]["hex"]) // 2 if "final_scriptSig" in psbt_in else 0
- len_scriptsig += len(ser_compact_size(len_scriptsig)) + 1
- len_scriptwitness = (sum([(len(x) // 2) + len(ser_compact_size(len(x) // 2)) for x in psbt_in["final_scriptwitness"]]) + len(psbt_in["final_scriptwitness"]) + 1) if "final_scriptwitness" in psbt_in else 0
- input_weight = ((40 + len_scriptsig) * WITNESS_SCALE_FACTOR) + len_scriptwitness
+ len_scriptsig += len(ser_compact_size(len_scriptsig))
+ len_scriptwitness = (sum([(len(x) // 2) + len(ser_compact_size(len(x) // 2)) for x in psbt_in["final_scriptwitness"]]) + len(ser_compact_size(len(psbt_in["final_scriptwitness"])))) if "final_scriptwitness" in psbt_in else 0
+ len_prevout_txid = 32
+ len_prevout_index = 4
+ len_sequence = 4
+ input_weight = ((len_prevout_txid + len_prevout_index + len_sequence + len_scriptsig) * WITNESS_SCALE_FACTOR) + len_scriptwitness
low_input_weight = input_weight // 2
high_input_weight = input_weight * 2
diff --git a/test/functional/rpc_setban.py b/test/functional/rpc_setban.py
index b4f3d77e5b..bc426d7371 100755
--- a/test/functional/rpc_setban.py
+++ b/test/functional/rpc_setban.py
@@ -4,6 +4,7 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test the setban rpc call."""
+from contextlib import ExitStack
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
p2p_port,
@@ -29,7 +30,13 @@ class SetBanTests(BitcoinTestFramework):
self.nodes[1].setban("127.0.0.1", "add")
# Node 0 should not be able to reconnect
- with self.nodes[1].assert_debug_log(expected_msgs=['dropped (banned)\n'], timeout=50):
+ context = ExitStack()
+ context.enter_context(self.nodes[1].assert_debug_log(expected_msgs=['dropped (banned)\n'], timeout=50))
+ # When disconnected right after connecting, a v2 node will attempt to reconnect with v1.
+ # Wait for that to happen so that it cannot mess with later tests.
+ if self.options.v2transport:
+ context.enter_context(self.nodes[0].assert_debug_log(expected_msgs=['trying v1 connection'], timeout=50))
+ with context:
self.restart_node(1, [])
self.nodes[0].addnode("127.0.0.1:" + str(p2p_port(1)), "onetry")
diff --git a/test/functional/test_framework/crypto/bip324_cipher.py b/test/functional/test_framework/crypto/bip324_cipher.py
index 56190647f2..c9f0fa0151 100644
--- a/test/functional/test_framework/crypto/bip324_cipher.py
+++ b/test/functional/test_framework/crypto/bip324_cipher.py
@@ -25,6 +25,8 @@ def pad16(x):
def aead_chacha20_poly1305_encrypt(key, nonce, aad, plaintext):
"""Encrypt a plaintext using ChaCha20Poly1305."""
+ if plaintext is None:
+ return None
ret = bytearray()
msg_len = len(plaintext)
for i in range((msg_len + 63) // 64):
@@ -42,7 +44,7 @@ def aead_chacha20_poly1305_encrypt(key, nonce, aad, plaintext):
def aead_chacha20_poly1305_decrypt(key, nonce, aad, ciphertext):
"""Decrypt a ChaCha20Poly1305 ciphertext."""
- if len(ciphertext) < 16:
+ if ciphertext is None or len(ciphertext) < 16:
return None
msg_len = len(ciphertext) - 16
poly1305 = Poly1305(chacha20_block(key, nonce, 0)[:32])
@@ -191,11 +193,11 @@ class TestFrameworkAEAD(unittest.TestCase):
dec_aead = FSChaCha20Poly1305(key)
for _ in range(msg_idx):
- enc_aead.encrypt(b"", b"")
+ enc_aead.encrypt(b"", None)
ciphertext = enc_aead.encrypt(aad, plain)
self.assertEqual(hex_cipher, ciphertext.hex())
for _ in range(msg_idx):
- dec_aead.decrypt(b"", bytes(16))
+ dec_aead.decrypt(b"", None)
plaintext = dec_aead.decrypt(aad, ciphertext)
self.assertEqual(plain, plaintext)
diff --git a/test/functional/test_framework/messages.py b/test/functional/test_framework/messages.py
index d008cb39aa..1780678de1 100755
--- a/test/functional/test_framework/messages.py
+++ b/test/functional/test_framework/messages.py
@@ -25,7 +25,6 @@ from io import BytesIO
import math
import random
import socket
-import struct
import time
import unittest
@@ -75,6 +74,13 @@ MAX_OP_RETURN_RELAY = 83
DEFAULT_MEMPOOL_EXPIRY_HOURS = 336 # hours
+MAGIC_BYTES = {
+ "mainnet": b"\xf9\xbe\xb4\xd9", # mainnet
+ "testnet3": b"\x0b\x11\x09\x07", # testnet3
+ "regtest": b"\xfa\xbf\xb5\xda", # regtest
+ "signet": b"\x0a\x03\xcf\x40", # signet
+}
+
def sha256(s):
return hashlib.sha256(s).digest()
@@ -90,24 +96,24 @@ def hash256(s):
def ser_compact_size(l):
r = b""
if l < 253:
- r = struct.pack("B", l)
+ r = l.to_bytes(1, "little")
elif l < 0x10000:
- r = struct.pack("<BH", 253, l)
+ r = (253).to_bytes(1, "little") + l.to_bytes(2, "little")
elif l < 0x100000000:
- r = struct.pack("<BI", 254, l)
+ r = (254).to_bytes(1, "little") + l.to_bytes(4, "little")
else:
- r = struct.pack("<BQ", 255, l)
+ r = (255).to_bytes(1, "little") + l.to_bytes(8, "little")
return r
def deser_compact_size(f):
- nit = struct.unpack("<B", f.read(1))[0]
+ nit = int.from_bytes(f.read(1), "little")
if nit == 253:
- nit = struct.unpack("<H", f.read(2))[0]
+ nit = int.from_bytes(f.read(2), "little")
elif nit == 254:
- nit = struct.unpack("<I", f.read(4))[0]
+ nit = int.from_bytes(f.read(4), "little")
elif nit == 255:
- nit = struct.unpack("<Q", f.read(8))[0]
+ nit = int.from_bytes(f.read(8), "little")
return nit
@@ -272,13 +278,13 @@ class CAddress:
"""Deserialize from addrv1 format (pre-BIP155)"""
if with_time:
# VERSION messages serialize CAddress objects without time
- self.time = struct.unpack("<I", f.read(4))[0]
- self.nServices = struct.unpack("<Q", f.read(8))[0]
+ self.time = int.from_bytes(f.read(4), "little")
+ self.nServices = int.from_bytes(f.read(8), "little")
# We only support IPv4 which means skip 12 bytes and read the next 4 as IPv4 address.
f.read(12)
self.net = self.NET_IPV4
self.ip = socket.inet_ntoa(f.read(4))
- self.port = struct.unpack(">H", f.read(2))[0]
+ self.port = int.from_bytes(f.read(2), "big")
def serialize(self, *, with_time=True):
"""Serialize in addrv1 format (pre-BIP155)"""
@@ -286,20 +292,20 @@ class CAddress:
r = b""
if with_time:
# VERSION messages serialize CAddress objects without time
- r += struct.pack("<I", self.time)
- r += struct.pack("<Q", self.nServices)
+ r += self.time.to_bytes(4, "little")
+ r += self.nServices.to_bytes(8, "little")
r += b"\x00" * 10 + b"\xff" * 2
r += socket.inet_aton(self.ip)
- r += struct.pack(">H", self.port)
+ r += self.port.to_bytes(2, "big")
return r
def deserialize_v2(self, f):
"""Deserialize from addrv2 format (BIP155)"""
- self.time = struct.unpack("<I", f.read(4))[0]
+ self.time = int.from_bytes(f.read(4), "little")
self.nServices = deser_compact_size(f)
- self.net = struct.unpack("B", f.read(1))[0]
+ self.net = int.from_bytes(f.read(1), "little")
assert self.net in self.ADDRV2_NET_NAME
address_length = deser_compact_size(f)
@@ -322,15 +328,15 @@ class CAddress:
else:
raise Exception(f"Address type not supported")
- self.port = struct.unpack(">H", f.read(2))[0]
+ self.port = int.from_bytes(f.read(2), "big")
def serialize_v2(self):
"""Serialize in addrv2 format (BIP155)"""
assert self.net in self.ADDRV2_NET_NAME
r = b""
- r += struct.pack("<I", self.time)
+ r += self.time.to_bytes(4, "little")
r += ser_compact_size(self.nServices)
- r += struct.pack("B", self.net)
+ r += self.net.to_bytes(1, "little")
r += ser_compact_size(self.ADDRV2_ADDRESS_LENGTH[self.net])
if self.net == self.NET_IPV4:
r += socket.inet_aton(self.ip)
@@ -348,7 +354,7 @@ class CAddress:
r += socket.inet_pton(socket.AF_INET6, self.ip)
else:
raise Exception(f"Address type not supported")
- r += struct.pack(">H", self.port)
+ r += self.port.to_bytes(2, "big")
return r
def __repr__(self):
@@ -375,12 +381,12 @@ class CInv:
self.hash = h
def deserialize(self, f):
- self.type = struct.unpack("<I", f.read(4))[0]
+ self.type = int.from_bytes(f.read(4), "little")
self.hash = deser_uint256(f)
def serialize(self):
r = b""
- r += struct.pack("<I", self.type)
+ r += self.type.to_bytes(4, "little")
r += ser_uint256(self.hash)
return r
@@ -399,12 +405,12 @@ class CBlockLocator:
self.vHave = []
def deserialize(self, f):
- struct.unpack("<i", f.read(4))[0] # Ignore version field.
+ int.from_bytes(f.read(4), "little", signed=True) # Ignore version field.
self.vHave = deser_uint256_vector(f)
def serialize(self):
r = b""
- r += struct.pack("<i", 0) # Bitcoin Core ignores version field. Set it to 0.
+ r += (0).to_bytes(4, "little", signed=True) # Bitcoin Core ignores the version field. Set it to 0.
r += ser_uint256_vector(self.vHave)
return r
@@ -421,12 +427,12 @@ class COutPoint:
def deserialize(self, f):
self.hash = deser_uint256(f)
- self.n = struct.unpack("<I", f.read(4))[0]
+ self.n = int.from_bytes(f.read(4), "little")
def serialize(self):
r = b""
r += ser_uint256(self.hash)
- r += struct.pack("<I", self.n)
+ r += self.n.to_bytes(4, "little")
return r
def __repr__(self):
@@ -448,13 +454,13 @@ class CTxIn:
self.prevout = COutPoint()
self.prevout.deserialize(f)
self.scriptSig = deser_string(f)
- self.nSequence = struct.unpack("<I", f.read(4))[0]
+ self.nSequence = int.from_bytes(f.read(4), "little")
def serialize(self):
r = b""
r += self.prevout.serialize()
r += ser_string(self.scriptSig)
- r += struct.pack("<I", self.nSequence)
+ r += self.nSequence.to_bytes(4, "little")
return r
def __repr__(self):
@@ -471,12 +477,12 @@ class CTxOut:
self.scriptPubKey = scriptPubKey
def deserialize(self, f):
- self.nValue = struct.unpack("<q", f.read(8))[0]
+ self.nValue = int.from_bytes(f.read(8), "little", signed=True)
self.scriptPubKey = deser_string(f)
def serialize(self):
r = b""
- r += struct.pack("<q", self.nValue)
+ r += self.nValue.to_bytes(8, "little", signed=True)
r += ser_string(self.scriptPubKey)
return r
@@ -575,11 +581,11 @@ class CTransaction:
self.wit = copy.deepcopy(tx.wit)
def deserialize(self, f):
- self.nVersion = struct.unpack("<i", f.read(4))[0]
+ self.nVersion = int.from_bytes(f.read(4), "little", signed=True)
self.vin = deser_vector(f, CTxIn)
flags = 0
if len(self.vin) == 0:
- flags = struct.unpack("<B", f.read(1))[0]
+ flags = int.from_bytes(f.read(1), "little")
# Not sure why flags can't be zero, but this
# matches the implementation in bitcoind
if (flags != 0):
@@ -592,16 +598,16 @@ class CTransaction:
self.wit.deserialize(f)
else:
self.wit = CTxWitness()
- self.nLockTime = struct.unpack("<I", f.read(4))[0]
+ self.nLockTime = int.from_bytes(f.read(4), "little")
self.sha256 = None
self.hash = None
def serialize_without_witness(self):
r = b""
- r += struct.pack("<i", self.nVersion)
+ r += self.nVersion.to_bytes(4, "little", signed=True)
r += ser_vector(self.vin)
r += ser_vector(self.vout)
- r += struct.pack("<I", self.nLockTime)
+ r += self.nLockTime.to_bytes(4, "little")
return r
# Only serialize with witness when explicitly called for
@@ -610,11 +616,11 @@ class CTransaction:
if not self.wit.is_null():
flags |= 1
r = b""
- r += struct.pack("<i", self.nVersion)
+ r += self.nVersion.to_bytes(4, "little", signed=True)
if flags:
dummy = []
r += ser_vector(dummy)
- r += struct.pack("<B", flags)
+ r += flags.to_bytes(1, "little")
r += ser_vector(self.vin)
r += ser_vector(self.vout)
if flags & 1:
@@ -624,7 +630,7 @@ class CTransaction:
for _ in range(len(self.wit.vtxinwit), len(self.vin)):
self.wit.vtxinwit.append(CTxInWitness())
r += self.wit.serialize()
- r += struct.pack("<I", self.nLockTime)
+ r += self.nLockTime.to_bytes(4, "little")
return r
# Regular serialization is with witness -- must explicitly
@@ -703,34 +709,34 @@ class CBlockHeader:
self.hash = None
def deserialize(self, f):
- self.nVersion = struct.unpack("<i", f.read(4))[0]
+ self.nVersion = int.from_bytes(f.read(4), "little", signed=True)
self.hashPrevBlock = deser_uint256(f)
self.hashMerkleRoot = deser_uint256(f)
- self.nTime = struct.unpack("<I", f.read(4))[0]
- self.nBits = struct.unpack("<I", f.read(4))[0]
- self.nNonce = struct.unpack("<I", f.read(4))[0]
+ self.nTime = int.from_bytes(f.read(4), "little")
+ self.nBits = int.from_bytes(f.read(4), "little")
+ self.nNonce = int.from_bytes(f.read(4), "little")
self.sha256 = None
self.hash = None
def serialize(self):
r = b""
- r += struct.pack("<i", self.nVersion)
+ r += self.nVersion.to_bytes(4, "little", signed=True)
r += ser_uint256(self.hashPrevBlock)
r += ser_uint256(self.hashMerkleRoot)
- r += struct.pack("<I", self.nTime)
- r += struct.pack("<I", self.nBits)
- r += struct.pack("<I", self.nNonce)
+ r += self.nTime.to_bytes(4, "little")
+ r += self.nBits.to_bytes(4, "little")
+ r += self.nNonce.to_bytes(4, "little")
return r
def calc_sha256(self):
if self.sha256 is None:
r = b""
- r += struct.pack("<i", self.nVersion)
+ r += self.nVersion.to_bytes(4, "little", signed=True)
r += ser_uint256(self.hashPrevBlock)
r += ser_uint256(self.hashMerkleRoot)
- r += struct.pack("<I", self.nTime)
- r += struct.pack("<I", self.nBits)
- r += struct.pack("<I", self.nNonce)
+ r += self.nTime.to_bytes(4, "little")
+ r += self.nBits.to_bytes(4, "little")
+ r += self.nNonce.to_bytes(4, "little")
self.sha256 = uint256_from_str(hash256(r))
self.hash = hash256(r)[::-1].hex()
@@ -874,12 +880,12 @@ class P2PHeaderAndShortIDs:
def deserialize(self, f):
self.header.deserialize(f)
- self.nonce = struct.unpack("<Q", f.read(8))[0]
+ self.nonce = int.from_bytes(f.read(8), "little")
self.shortids_length = deser_compact_size(f)
for _ in range(self.shortids_length):
# shortids are defined to be 6 bytes in the spec, so append
# two zero bytes and read it in as an 8-byte number
- self.shortids.append(struct.unpack("<Q", f.read(6) + b'\x00\x00')[0])
+ self.shortids.append(int.from_bytes(f.read(6) + b'\x00\x00', "little"))
self.prefilled_txn = deser_vector(f, PrefilledTransaction)
self.prefilled_txn_length = len(self.prefilled_txn)
@@ -887,11 +893,11 @@ class P2PHeaderAndShortIDs:
def serialize(self, with_witness=False):
r = b""
r += self.header.serialize()
- r += struct.pack("<Q", self.nonce)
+ r += self.nonce.to_bytes(8, "little")
r += ser_compact_size(self.shortids_length)
for x in self.shortids:
# We only want the first 6 bytes
- r += struct.pack("<Q", x)[0:6]
+ r += x.to_bytes(8, "little")[0:6]
if with_witness:
r += ser_vector(self.prefilled_txn, "serialize_with_witness")
else:
@@ -956,10 +962,10 @@ class HeaderAndShortIDs:
def get_siphash_keys(self):
header_nonce = self.header.serialize()
- header_nonce += struct.pack("<Q", self.nonce)
+ header_nonce += self.nonce.to_bytes(8, "little")
hash_header_nonce_as_str = sha256(header_nonce)
- key0 = struct.unpack("<Q", hash_header_nonce_as_str[0:8])[0]
- key1 = struct.unpack("<Q", hash_header_nonce_as_str[8:16])[0]
+ key0 = int.from_bytes(hash_header_nonce_as_str[0:8], "little")
+ key1 = int.from_bytes(hash_header_nonce_as_str[8:16], "little")
return [ key0, key1 ]
# Version 2 compact blocks use wtxid in shortids (rather than txid)
@@ -1057,7 +1063,7 @@ class CPartialMerkleTree:
self.vBits = []
def deserialize(self, f):
- self.nTransactions = struct.unpack("<i", f.read(4))[0]
+ self.nTransactions = int.from_bytes(f.read(4), "little")
self.vHash = deser_uint256_vector(f)
vBytes = deser_string(f)
self.vBits = []
@@ -1066,7 +1072,7 @@ class CPartialMerkleTree:
def serialize(self):
r = b""
- r += struct.pack("<i", self.nTransactions)
+ r += self.nTransactions.to_bytes(4, "little")
r += ser_uint256_vector(self.vHash)
vBytesArray = bytearray([0x00] * ((len(self.vBits) + 7)//8))
for i in range(len(self.vBits)):
@@ -1117,37 +1123,34 @@ class msg_version:
self.relay = 0
def deserialize(self, f):
- self.nVersion = struct.unpack("<i", f.read(4))[0]
- self.nServices = struct.unpack("<Q", f.read(8))[0]
- self.nTime = struct.unpack("<q", f.read(8))[0]
+ self.nVersion = int.from_bytes(f.read(4), "little", signed=True)
+ self.nServices = int.from_bytes(f.read(8), "little")
+ self.nTime = int.from_bytes(f.read(8), "little", signed=True)
self.addrTo = CAddress()
self.addrTo.deserialize(f, with_time=False)
self.addrFrom = CAddress()
self.addrFrom.deserialize(f, with_time=False)
- self.nNonce = struct.unpack("<Q", f.read(8))[0]
+ self.nNonce = int.from_bytes(f.read(8), "little")
self.strSubVer = deser_string(f).decode('utf-8')
- self.nStartingHeight = struct.unpack("<i", f.read(4))[0]
+ self.nStartingHeight = int.from_bytes(f.read(4), "little", signed=True)
# Relay field is optional for version 70001 onwards
# But, unconditionally check it to match behaviour in bitcoind
- try:
- self.relay = struct.unpack("<b", f.read(1))[0]
- except struct.error:
- self.relay = 0
+ self.relay = int.from_bytes(f.read(1), "little") # f.read(1) may return an empty b''
def serialize(self):
r = b""
- r += struct.pack("<i", self.nVersion)
- r += struct.pack("<Q", self.nServices)
- r += struct.pack("<q", self.nTime)
+ r += self.nVersion.to_bytes(4, "little", signed=True)
+ r += self.nServices.to_bytes(8, "little")
+ r += self.nTime.to_bytes(8, "little", signed=True)
r += self.addrTo.serialize(with_time=False)
r += self.addrFrom.serialize(with_time=False)
- r += struct.pack("<Q", self.nNonce)
+ r += self.nNonce.to_bytes(8, "little")
r += ser_string(self.strSubVer.encode('utf-8'))
- r += struct.pack("<i", self.nStartingHeight)
- r += struct.pack("<b", self.relay)
+ r += self.nStartingHeight.to_bytes(4, "little", signed=True)
+ r += self.relay.to_bytes(1, "little")
return r
def __repr__(self):
@@ -1393,11 +1396,11 @@ class msg_ping:
self.nonce = nonce
def deserialize(self, f):
- self.nonce = struct.unpack("<Q", f.read(8))[0]
+ self.nonce = int.from_bytes(f.read(8), "little")
def serialize(self):
r = b""
- r += struct.pack("<Q", self.nonce)
+ r += self.nonce.to_bytes(8, "little")
return r
def __repr__(self):
@@ -1412,11 +1415,11 @@ class msg_pong:
self.nonce = nonce
def deserialize(self, f):
- self.nonce = struct.unpack("<Q", f.read(8))[0]
+ self.nonce = int.from_bytes(f.read(8), "little")
def serialize(self):
r = b""
- r += struct.pack("<Q", self.nonce)
+ r += self.nonce.to_bytes(8, "little")
return r
def __repr__(self):
@@ -1557,16 +1560,16 @@ class msg_filterload:
def deserialize(self, f):
self.data = deser_string(f)
- self.nHashFuncs = struct.unpack("<I", f.read(4))[0]
- self.nTweak = struct.unpack("<I", f.read(4))[0]
- self.nFlags = struct.unpack("<B", f.read(1))[0]
+ self.nHashFuncs = int.from_bytes(f.read(4), "little")
+ self.nTweak = int.from_bytes(f.read(4), "little")
+ self.nFlags = int.from_bytes(f.read(1), "little")
def serialize(self):
r = b""
r += ser_string(self.data)
- r += struct.pack("<I", self.nHashFuncs)
- r += struct.pack("<I", self.nTweak)
- r += struct.pack("<B", self.nFlags)
+ r += self.nHashFuncs.to_bytes(4, "little")
+ r += self.nTweak.to_bytes(4, "little")
+ r += self.nFlags.to_bytes(1, "little")
return r
def __repr__(self):
@@ -1618,11 +1621,11 @@ class msg_feefilter:
self.feerate = feerate
def deserialize(self, f):
- self.feerate = struct.unpack("<Q", f.read(8))[0]
+ self.feerate = int.from_bytes(f.read(8), "little")
def serialize(self):
r = b""
- r += struct.pack("<Q", self.feerate)
+ r += self.feerate.to_bytes(8, "little")
return r
def __repr__(self):
@@ -1638,13 +1641,13 @@ class msg_sendcmpct:
self.version = version
def deserialize(self, f):
- self.announce = struct.unpack("<?", f.read(1))[0]
- self.version = struct.unpack("<Q", f.read(8))[0]
+ self.announce = bool(int.from_bytes(f.read(1), "little"))
+ self.version = int.from_bytes(f.read(8), "little")
def serialize(self):
r = b""
- r += struct.pack("<?", self.announce)
- r += struct.pack("<Q", self.version)
+ r += int(self.announce).to_bytes(1, "little")
+ r += self.version.to_bytes(8, "little")
return r
def __repr__(self):
@@ -1727,14 +1730,14 @@ class msg_getcfilters:
self.stop_hash = stop_hash
def deserialize(self, f):
- self.filter_type = struct.unpack("<B", f.read(1))[0]
- self.start_height = struct.unpack("<I", f.read(4))[0]
+ self.filter_type = int.from_bytes(f.read(1), "little")
+ self.start_height = int.from_bytes(f.read(4), "little")
self.stop_hash = deser_uint256(f)
def serialize(self):
r = b""
- r += struct.pack("<B", self.filter_type)
- r += struct.pack("<I", self.start_height)
+ r += self.filter_type.to_bytes(1, "little")
+ r += self.start_height.to_bytes(4, "little")
r += ser_uint256(self.stop_hash)
return r
@@ -1752,13 +1755,13 @@ class msg_cfilter:
self.filter_data = filter_data
def deserialize(self, f):
- self.filter_type = struct.unpack("<B", f.read(1))[0]
+ self.filter_type = int.from_bytes(f.read(1), "little")
self.block_hash = deser_uint256(f)
self.filter_data = deser_string(f)
def serialize(self):
r = b""
- r += struct.pack("<B", self.filter_type)
+ r += self.filter_type.to_bytes(1, "little")
r += ser_uint256(self.block_hash)
r += ser_string(self.filter_data)
return r
@@ -1777,14 +1780,14 @@ class msg_getcfheaders:
self.stop_hash = stop_hash
def deserialize(self, f):
- self.filter_type = struct.unpack("<B", f.read(1))[0]
- self.start_height = struct.unpack("<I", f.read(4))[0]
+ self.filter_type = int.from_bytes(f.read(1), "little")
+ self.start_height = int.from_bytes(f.read(4), "little")
self.stop_hash = deser_uint256(f)
def serialize(self):
r = b""
- r += struct.pack("<B", self.filter_type)
- r += struct.pack("<I", self.start_height)
+ r += self.filter_type.to_bytes(1, "little")
+ r += self.start_height.to_bytes(4, "little")
r += ser_uint256(self.stop_hash)
return r
@@ -1803,14 +1806,14 @@ class msg_cfheaders:
self.hashes = hashes
def deserialize(self, f):
- self.filter_type = struct.unpack("<B", f.read(1))[0]
+ self.filter_type = int.from_bytes(f.read(1), "little")
self.stop_hash = deser_uint256(f)
self.prev_header = deser_uint256(f)
self.hashes = deser_uint256_vector(f)
def serialize(self):
r = b""
- r += struct.pack("<B", self.filter_type)
+ r += self.filter_type.to_bytes(1, "little")
r += ser_uint256(self.stop_hash)
r += ser_uint256(self.prev_header)
r += ser_uint256_vector(self.hashes)
@@ -1829,12 +1832,12 @@ class msg_getcfcheckpt:
self.stop_hash = stop_hash
def deserialize(self, f):
- self.filter_type = struct.unpack("<B", f.read(1))[0]
+ self.filter_type = int.from_bytes(f.read(1), "little")
self.stop_hash = deser_uint256(f)
def serialize(self):
r = b""
- r += struct.pack("<B", self.filter_type)
+ r += self.filter_type.to_bytes(1, "little")
r += ser_uint256(self.stop_hash)
return r
@@ -1852,13 +1855,13 @@ class msg_cfcheckpt:
self.headers = headers
def deserialize(self, f):
- self.filter_type = struct.unpack("<B", f.read(1))[0]
+ self.filter_type = int.from_bytes(f.read(1), "little")
self.stop_hash = deser_uint256(f)
self.headers = deser_uint256_vector(f)
def serialize(self):
r = b""
- r += struct.pack("<B", self.filter_type)
+ r += self.filter_type.to_bytes(1, "little")
r += ser_uint256(self.stop_hash)
r += ser_uint256_vector(self.headers)
return r
@@ -1876,13 +1879,13 @@ class msg_sendtxrcncl:
self.salt = 0
def deserialize(self, f):
- self.version = struct.unpack("<I", f.read(4))[0]
- self.salt = struct.unpack("<Q", f.read(8))[0]
+ self.version = int.from_bytes(f.read(4), "little")
+ self.salt = int.from_bytes(f.read(8), "little")
def serialize(self):
r = b""
- r += struct.pack("<I", self.version)
- r += struct.pack("<Q", self.salt)
+ r += self.version.to_bytes(4, "little")
+ r += self.salt.to_bytes(8, "little")
return r
def __repr__(self):
diff --git a/test/functional/test_framework/netutil.py b/test/functional/test_framework/netutil.py
index 838f40fcaa..30a4a58d6f 100644
--- a/test/functional/test_framework/netutil.py
+++ b/test/functional/test_framework/netutil.py
@@ -4,7 +4,7 @@
# file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Linux network utilities.
-Roughly based on http://voorloopnul.com/blog/a-python-netstat-in-less-than-100-lines-of-code/ by Ricardo Pascal
+Roughly based on https://web.archive.org/web/20190424172231/http://voorloopnul.com/blog/a-python-netstat-in-less-than-100-lines-of-code/ by Ricardo Pascal
"""
import sys
diff --git a/test/functional/test_framework/p2p.py b/test/functional/test_framework/p2p.py
index b1ed97b794..dc04696114 100755
--- a/test/functional/test_framework/p2p.py
+++ b/test/functional/test_framework/p2p.py
@@ -24,6 +24,7 @@ import asyncio
from collections import defaultdict
from io import BytesIO
import logging
+import platform
import struct
import sys
import threading
@@ -72,6 +73,7 @@ from test_framework.messages import (
msg_wtxidrelay,
NODE_NETWORK,
NODE_WITNESS,
+ MAGIC_BYTES,
sha256,
)
from test_framework.util import (
@@ -79,6 +81,11 @@ from test_framework.util import (
p2p_port,
wait_until_helper_internal,
)
+from test_framework.v2_p2p import (
+ EncryptedP2PState,
+ MSGTYPE_TO_SHORTID,
+ SHORTID,
+)
logger = logging.getLogger("TestFramework.p2p")
@@ -140,13 +147,6 @@ MESSAGEMAP = {
b"wtxidrelay": msg_wtxidrelay,
}
-MAGIC_BYTES = {
- "mainnet": b"\xf9\xbe\xb4\xd9", # mainnet
- "testnet3": b"\x0b\x11\x09\x07", # testnet3
- "regtest": b"\xfa\xbf\xb5\xda", # regtest
- "signet": b"\x0a\x03\xcf\x40", # signet
-}
-
class P2PConnection(asyncio.Protocol):
"""A low-level connection object to a node's P2P interface.
@@ -165,11 +165,20 @@ class P2PConnection(asyncio.Protocol):
# The underlying transport of the connection.
# Should only call methods on this from the NetworkThread, c.f. call_soon_threadsafe
self._transport = None
+ # This lock is acquired before sending messages over the socket. There's an implied lock order and
+ # p2p_lock must not be acquired after _send_lock as it could result in deadlocks.
+ self._send_lock = threading.Lock()
+ self.v2_state = None # EncryptedP2PState object needed for v2 p2p connections
+ self.reconnect = False # set if reconnection needs to happen
@property
def is_connected(self):
return self._transport is not None
+ @property
+ def supports_v2_p2p(self):
+ return self.v2_state is not None
+
def peer_connect_helper(self, dstaddr, dstport, net, timeout_factor):
assert not self.is_connected
self.timeout_factor = timeout_factor
@@ -180,16 +189,21 @@ class P2PConnection(asyncio.Protocol):
self.recvbuf = b""
self.magic_bytes = MAGIC_BYTES[net]
- def peer_connect(self, dstaddr, dstport, *, net, timeout_factor):
+ def peer_connect(self, dstaddr, dstport, *, net, timeout_factor, supports_v2_p2p):
self.peer_connect_helper(dstaddr, dstport, net, timeout_factor)
+ if supports_v2_p2p:
+ self.v2_state = EncryptedP2PState(initiating=True, net=net)
loop = NetworkThread.network_event_loop
logger.debug('Connecting to Bitcoin Node: %s:%d' % (self.dstaddr, self.dstport))
coroutine = loop.create_connection(lambda: self, host=self.dstaddr, port=self.dstport)
return lambda: loop.call_soon_threadsafe(loop.create_task, coroutine)
- def peer_accept_connection(self, connect_id, connect_cb=lambda: None, *, net, timeout_factor):
+ def peer_accept_connection(self, connect_id, connect_cb=lambda: None, *, net, timeout_factor, supports_v2_p2p, reconnect):
self.peer_connect_helper('0', 0, net, timeout_factor)
+ self.reconnect = reconnect
+ if supports_v2_p2p:
+ self.v2_state = EncryptedP2PState(initiating=False, net=net)
logger.debug('Listening for Bitcoin Node with id: {}'.format(connect_id))
return lambda: NetworkThread.listen(self, connect_cb, idx=connect_id)
@@ -205,14 +219,21 @@ class P2PConnection(asyncio.Protocol):
assert not self._transport
logger.debug("Connected & Listening: %s:%d" % (self.dstaddr, self.dstport))
self._transport = transport
- if self.on_connection_send_msg:
- self.send_message(self.on_connection_send_msg)
- self.on_connection_send_msg = None # Never used again
+ # in an inbound connection to the TestNode with P2PConnection as the initiator, [TestNode <---- P2PConnection]
+ # send the initial handshake immediately
+ if self.supports_v2_p2p and self.v2_state.initiating and not self.v2_state.tried_v2_handshake:
+ send_handshake_bytes = self.v2_state.initiate_v2_handshake()
+ self.send_raw_message(send_handshake_bytes)
+ # for v1 outbound connections, send version message immediately after opening
+ # (for v2 outbound connections, send it after the initial v2 handshake)
+ if self.p2p_connected_to_node and not self.supports_v2_p2p:
+ self.send_version()
self.on_open()
def connection_lost(self, exc):
"""asyncio callback when a connection is closed."""
- if exc:
+ # don't display warning if reconnection needs to be attempted using v1 P2P
+ if exc and not self.reconnect:
logger.warning("Connection lost to {}:{} due to {}".format(self.dstaddr, self.dstport, exc))
else:
logger.debug("Closed connection to: %s:%d" % (self.dstaddr, self.dstport))
@@ -220,13 +241,66 @@ class P2PConnection(asyncio.Protocol):
self.recvbuf = b""
self.on_close()
+ # v2 handshake method
+ def _on_data_v2_handshake(self):
+ """v2 handshake performed before P2P messages are exchanged (see BIP324). P2PConnection is the initiator
+ (in inbound connections to TestNode) and the responder (in outbound connections from TestNode).
+ Performed by:
+ * initiator using `initiate_v2_handshake()`, `complete_handshake()` and `authenticate_handshake()`
+ * responder using `respond_v2_handshake()`, `complete_handshake()` and `authenticate_handshake()`
+
+ `initiate_v2_handshake()` is immediately done by the initiator when the connection is established in
+ `connection_made()`. The rest of the initial v2 handshake functions are handled here.
+ """
+ if not self.v2_state.peer:
+ if not self.v2_state.initiating and not self.v2_state.sent_garbage:
+ # if the responder hasn't sent garbage yet, the responder is still reading ellswift bytes
+ # reads ellswift bytes till the first mismatch from 12 bytes V1_PREFIX
+ length, send_handshake_bytes = self.v2_state.respond_v2_handshake(BytesIO(self.recvbuf))
+ self.recvbuf = self.recvbuf[length:]
+ if send_handshake_bytes == -1:
+ self.v2_state = None
+ return
+ elif send_handshake_bytes:
+ self.send_raw_message(send_handshake_bytes)
+ elif send_handshake_bytes == b"":
+ return # only after send_handshake_bytes are sent can `complete_handshake()` be done
+
+ # `complete_handshake()` reads the remaining ellswift bytes from recvbuf
+ # and sends response after deriving shared ECDH secret using received ellswift bytes
+ length, response = self.v2_state.complete_handshake(BytesIO(self.recvbuf))
+ self.recvbuf = self.recvbuf[length:]
+ if response:
+ self.send_raw_message(response)
+ else:
+ return # only after response is sent can `authenticate_handshake()` be done
+
+ # `self.v2_state.peer` is instantiated only after shared ECDH secret/BIP324 derived keys and ciphers
+ # is derived in `complete_handshake()`.
+ # so `authenticate_handshake()` which uses the BIP324 derived ciphers gets called after `complete_handshake()`.
+ assert self.v2_state.peer
+ length, is_mac_auth = self.v2_state.authenticate_handshake(self.recvbuf)
+ if not is_mac_auth:
+ raise ValueError("invalid v2 mac tag in handshake authentication")
+ self.recvbuf = self.recvbuf[length:]
+ if self.v2_state.tried_v2_handshake:
+ # for v2 outbound connections, send version message immediately after v2 handshake
+ if self.p2p_connected_to_node:
+ self.send_version()
+ # process post-v2-handshake data immediately, if available
+ if len(self.recvbuf) > 0:
+ self._on_data()
+
# Socket read methods
def data_received(self, t):
"""asyncio callback when data is read from the socket."""
if len(t) > 0:
self.recvbuf += t
- self._on_data()
+ if self.supports_v2_p2p and not self.v2_state.tried_v2_handshake:
+ self._on_data_v2_handshake()
+ else:
+ self._on_data()
def _on_data(self):
"""Try to read P2P messages from the recv buffer.
@@ -236,23 +310,48 @@ class P2PConnection(asyncio.Protocol):
the on_message callback for processing."""
try:
while True:
- if len(self.recvbuf) < 4:
- return
- if self.recvbuf[:4] != self.magic_bytes:
- raise ValueError("magic bytes mismatch: {} != {}".format(repr(self.magic_bytes), repr(self.recvbuf)))
- if len(self.recvbuf) < 4 + 12 + 4 + 4:
- return
- msgtype = self.recvbuf[4:4+12].split(b"\x00", 1)[0]
- msglen = struct.unpack("<i", self.recvbuf[4+12:4+12+4])[0]
- checksum = self.recvbuf[4+12+4:4+12+4+4]
- if len(self.recvbuf) < 4 + 12 + 4 + 4 + msglen:
- return
- msg = self.recvbuf[4+12+4+4:4+12+4+4+msglen]
- th = sha256(msg)
- h = sha256(th)
- if checksum != h[:4]:
- raise ValueError("got bad checksum " + repr(self.recvbuf))
- self.recvbuf = self.recvbuf[4+12+4+4+msglen:]
+ if self.supports_v2_p2p:
+ # v2 P2P messages are read
+ msglen, msg = self.v2_state.v2_receive_packet(self.recvbuf)
+ if msglen == -1:
+ raise ValueError("invalid v2 mac tag " + repr(self.recvbuf))
+ elif msglen == 0: # need to receive more bytes in recvbuf
+ return
+ self.recvbuf = self.recvbuf[msglen:]
+
+ if msg is None: # ignore decoy messages
+ return
+ assert msg # application layer messages (which aren't decoy messages) are non-empty
+ shortid = msg[0] # 1-byte short message type ID
+ if shortid == 0:
+ # next 12 bytes are interpreted as ASCII message type if shortid is b'\x00'
+ if len(msg) < 13:
+ raise IndexError("msg needs minimum required length of 13 bytes")
+ msgtype = msg[1:13].rstrip(b'\x00')
+ msg = msg[13:] # msg is set to be payload
+ else:
+ # a 1-byte short message type ID
+ msgtype = SHORTID.get(shortid, f"unknown-{shortid}")
+ msg = msg[1:]
+ else:
+ # v1 P2P messages are read
+ if len(self.recvbuf) < 4:
+ return
+ if self.recvbuf[:4] != self.magic_bytes:
+ raise ValueError("magic bytes mismatch: {} != {}".format(repr(self.magic_bytes), repr(self.recvbuf)))
+ if len(self.recvbuf) < 4 + 12 + 4 + 4:
+ return
+ msgtype = self.recvbuf[4:4+12].split(b"\x00", 1)[0]
+ msglen = struct.unpack("<i", self.recvbuf[4+12:4+12+4])[0]
+ checksum = self.recvbuf[4+12+4:4+12+4+4]
+ if len(self.recvbuf) < 4 + 12 + 4 + 4 + msglen:
+ return
+ msg = self.recvbuf[4+12+4+4:4+12+4+4+msglen]
+ th = sha256(msg)
+ h = sha256(th)
+ if checksum != h[:4]:
+ raise ValueError("got bad checksum " + repr(self.recvbuf))
+ self.recvbuf = self.recvbuf[4+12+4+4+msglen:]
if msgtype not in MESSAGEMAP:
raise ValueError("Received unknown msgtype from %s:%d: '%s' %s" % (self.dstaddr, self.dstport, msgtype, repr(msg)))
f = BytesIO(msg)
@@ -261,7 +360,8 @@ class P2PConnection(asyncio.Protocol):
self._log_message("receive", t)
self.on_message(t)
except Exception as e:
- logger.exception('Error reading message:', repr(e))
+ if not self.reconnect:
+ logger.exception('Error reading message:', repr(e))
raise
def on_message(self, message):
@@ -270,14 +370,15 @@ class P2PConnection(asyncio.Protocol):
# Socket write methods
- def send_message(self, message):
+ def send_message(self, message, is_decoy=False):
"""Send a P2P message over the socket.
This method takes a P2P payload, builds the P2P header and adds
the message to the send buffer to be sent over the socket."""
- tmsg = self.build_message(message)
- self._log_message("send", message)
- return self.send_raw_message(tmsg)
+ with self._send_lock:
+ tmsg = self.build_message(message, is_decoy)
+ self._log_message("send", message)
+ return self.send_raw_message(tmsg)
def send_raw_message(self, raw_message_bytes):
if not self.is_connected:
@@ -293,19 +394,29 @@ class P2PConnection(asyncio.Protocol):
# Class utility methods
- def build_message(self, message):
+ def build_message(self, message, is_decoy=False):
"""Build a serialized P2P message"""
msgtype = message.msgtype
data = message.serialize()
- tmsg = self.magic_bytes
- tmsg += msgtype
- tmsg += b"\x00" * (12 - len(msgtype))
- tmsg += struct.pack("<I", len(data))
- th = sha256(data)
- h = sha256(th)
- tmsg += h[:4]
- tmsg += data
- return tmsg
+ if self.supports_v2_p2p:
+ if msgtype in SHORTID.values():
+ tmsg = MSGTYPE_TO_SHORTID.get(msgtype).to_bytes(1, 'big')
+ else:
+ tmsg = b"\x00"
+ tmsg += msgtype
+ tmsg += b"\x00" * (12 - len(msgtype))
+ tmsg += data
+ return self.v2_state.v2_enc_packet(tmsg, ignore=is_decoy)
+ else:
+ tmsg = self.magic_bytes
+ tmsg += msgtype
+ tmsg += b"\x00" * (12 - len(msgtype))
+ tmsg += struct.pack("<I", len(data))
+ th = sha256(data)
+ h = sha256(th)
+ tmsg += h[:4]
+ tmsg += data
+ return tmsg
def _log_message(self, direction, msg):
"""Logs a message being sent or received over the connection."""
@@ -449,6 +560,11 @@ class P2PInterface(P2PConnection):
def on_version(self, message):
assert message.nVersion >= MIN_P2P_VERSION_SUPPORTED, "Version {} received. Test framework only supports versions greater than {}".format(message.nVersion, MIN_P2P_VERSION_SUPPORTED)
+ # for inbound connections, reply to version with own version message
+ # (could be due to v1 reconnect after a failed v2 handshake)
+ if not self.p2p_connected_to_node:
+ self.send_version()
+ self.reconnect = False
if message.nVersion >= 70016 and self.wtxidrelay:
self.send_message(msg_wtxidrelay())
if self.support_addrv2:
@@ -477,6 +593,11 @@ class P2PInterface(P2PConnection):
test_function = lambda: not self.is_connected
self.wait_until(test_function, timeout=timeout, check_connected=False)
+ def wait_for_reconnect(self, timeout=60):
+ def test_function():
+ return self.is_connected and self.last_message.get('version') and not self.supports_v2_p2p
+ self.wait_until(test_function, timeout=timeout, check_connected=False)
+
# Message receiving helper methods
def wait_for_tx(self, txid, timeout=60):
@@ -555,6 +676,11 @@ class P2PInterface(P2PConnection):
# Message sending helper functions
+ def send_version(self):
+ if self.on_connection_send_msg:
+ self.send_message(self.on_connection_send_msg)
+ self.on_connection_send_msg = None # Never used again
+
def send_and_ping(self, message, timeout=60):
self.send_message(message)
self.sync_with_ping(timeout=timeout)
@@ -592,7 +718,7 @@ class NetworkThread(threading.Thread):
NetworkThread.listeners = {}
NetworkThread.protos = {}
- if sys.platform == 'win32':
+ if platform.system() == 'Windows':
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
NetworkThread.network_event_loop = asyncio.new_event_loop()
@@ -621,6 +747,11 @@ class NetworkThread(threading.Thread):
if addr is None:
addr = '127.0.0.1'
+ def exception_handler(loop, context):
+ if not p2p.reconnect:
+ loop.default_exception_handler(context)
+
+ cls.network_event_loop.set_exception_handler(exception_handler)
coroutine = cls.create_listen_server(addr, port, callback, p2p)
cls.network_event_loop.call_soon_threadsafe(cls.network_event_loop.create_task, coroutine)
@@ -634,7 +765,9 @@ class NetworkThread(threading.Thread):
protocol function from that dict, and returns it so the event loop
can start executing it."""
response = cls.protos.get((addr, port))
- cls.protos[(addr, port)] = None
+ # remove protocol function from dict only when reconnection doesn't need to happen/already happened
+ if not proto.reconnect:
+ cls.protos[(addr, port)] = None
return response
if (addr, port) not in cls.listeners:
@@ -707,7 +840,7 @@ class P2PDataStore(P2PInterface):
if response is not None:
self.send_message(response)
- def send_blocks_and_test(self, blocks, node, *, success=True, force_send=False, reject_reason=None, expect_disconnect=False, timeout=60):
+ def send_blocks_and_test(self, blocks, node, *, success=True, force_send=False, reject_reason=None, expect_disconnect=False, timeout=60, is_decoy=False):
"""Send blocks to test node and test whether the tip advances.
- add all blocks to our block_store
@@ -726,9 +859,11 @@ class P2PDataStore(P2PInterface):
reject_reason = [reject_reason] if reject_reason else []
with node.assert_debug_log(expected_msgs=reject_reason):
+ if is_decoy: # since decoy messages are ignored by the recipient - no need to wait for response
+ force_send = True
if force_send:
for b in blocks:
- self.send_message(msg_block(block=b))
+ self.send_message(msg_block(block=b), is_decoy)
else:
self.send_message(msg_headers([CBlockHeader(block) for block in blocks]))
self.wait_until(
diff --git a/test/functional/test_framework/script.py b/test/functional/test_framework/script.py
index 78d8580794..3275517888 100644
--- a/test/functional/test_framework/script.py
+++ b/test/functional/test_framework/script.py
@@ -747,7 +747,7 @@ def SegwitV0SignatureMsg(script, txTo, inIdx, hashtype, amount):
ss += struct.pack("<q", amount)
ss += struct.pack("<I", txTo.vin[inIdx].nSequence)
ss += ser_uint256(hashOutputs)
- ss += struct.pack("<i", txTo.nLockTime)
+ ss += txTo.nLockTime.to_bytes(4, "little")
ss += struct.pack("<I", hashtype)
return ss
diff --git a/test/functional/test_framework/test_framework.py b/test/functional/test_framework/test_framework.py
index 0ee332b75b..d8ae20981d 100755
--- a/test/functional/test_framework/test_framework.py
+++ b/test/functional/test_framework/test_framework.py
@@ -602,10 +602,10 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
if peer_advertises_v2 is None:
peer_advertises_v2 = from_connection.use_v2transport
- if peer_advertises_v2:
- from_connection.addnode(node=ip_port, command="onetry", v2transport=True)
+ if peer_advertises_v2 != from_connection.use_v2transport:
+ from_connection.addnode(node=ip_port, command="onetry", v2transport=peer_advertises_v2)
else:
- # skip the optional third argument (default false) for
+ # skip the optional third argument if it matches the default, for
# compatibility with older clients
from_connection.addnode(ip_port, "onetry")
@@ -1021,5 +1021,4 @@ class BitcoinTestFramework(metaclass=BitcoinTestMetaClass):
return self.config["components"].getboolean("USE_BDB")
def has_blockfile(self, node, filenum: str):
- blocksdir = node.datadir_path / self.chain / 'blocks'
- return (blocksdir / f"blk{filenum}.dat").is_file()
+ return (node.blocks_path/ f"blk{filenum}.dat").is_file()
diff --git a/test/functional/test_framework/test_node.py b/test/functional/test_framework/test_node.py
index b3f777b9df..3baa78fd79 100755
--- a/test/functional/test_framework/test_node.py
+++ b/test/functional/test_framework/test_node.py
@@ -12,6 +12,7 @@ import http.client
import json
import logging
import os
+import platform
import re
import subprocess
import tempfile
@@ -19,7 +20,6 @@ import time
import urllib.parse
import collections
import shlex
-import sys
from pathlib import Path
from .authproxy import (
@@ -27,7 +27,8 @@ from .authproxy import (
serialization_fallback,
)
from .descriptors import descsum_create
-from .p2p import P2P_SUBVERSION
+from .messages import NODE_P2P_V2
+from .p2p import P2P_SERVICES, P2P_SUBVERSION
from .util import (
MAX_NODES,
assert_equal,
@@ -129,8 +130,15 @@ class TestNode():
# Default behavior from global -v2transport flag is added to args to persist it over restarts.
# May be overwritten in individual tests, using extra_args.
self.default_to_v2 = v2transport
- if self.default_to_v2:
- self.args.append("-v2transport=1")
+ if self.version_is_at_least(260000):
+ # 26.0 and later support v2transport
+ if v2transport:
+ self.args.append("-v2transport=1")
+ else:
+ self.args.append("-v2transport=0")
+ else:
+ # v2transport requested but not supported for node
+ assert not v2transport
self.cli = TestNodeCLI(bitcoin_cli, self.datadir_path)
self.use_cli = use_cli
@@ -566,7 +574,7 @@ class TestNode():
cmd, shell=True,
stderr=subprocess.DEVNULL, stdout=subprocess.DEVNULL) == 0
- if not sys.platform.startswith('linux'):
+ if platform.system() != 'Linux':
self.log.warning("Can't profile with perf; only available on Linux platforms")
return None
@@ -659,20 +667,37 @@ class TestNode():
assert_msg += "with expected error " + expected_msg
self._raise_assertion_error(assert_msg)
- def add_p2p_connection(self, p2p_conn, *, wait_for_verack=True, send_version=True, **kwargs):
+ def add_p2p_connection(self, p2p_conn, *, wait_for_verack=True, send_version=True, supports_v2_p2p=None, wait_for_v2_handshake=True, **kwargs):
"""Add an inbound p2p connection to the node.
This method adds the p2p connection to the self.p2ps list and also
- returns the connection to the caller."""
+ returns the connection to the caller.
+
+ When self.use_v2transport is True, TestNode advertises NODE_P2P_V2 service flag
+
+ An inbound connection is made from TestNode <------ P2PConnection
+ - if TestNode doesn't advertise NODE_P2P_V2 service, P2PConnection sends version message and v1 P2P is followed
+ - if TestNode advertises NODE_P2P_V2 service, (and if P2PConnections supports v2 P2P)
+ P2PConnection sends ellswift bytes and v2 P2P is followed
+ """
if 'dstport' not in kwargs:
kwargs['dstport'] = p2p_port(self.index)
if 'dstaddr' not in kwargs:
kwargs['dstaddr'] = '127.0.0.1'
+ if supports_v2_p2p is None:
+ supports_v2_p2p = self.use_v2transport
+
p2p_conn.p2p_connected_to_node = True
- p2p_conn.peer_connect(**kwargs, send_version=send_version, net=self.chain, timeout_factor=self.timeout_factor)()
+ if self.use_v2transport:
+ kwargs['services'] = kwargs.get('services', P2P_SERVICES) | NODE_P2P_V2
+ supports_v2_p2p = self.use_v2transport and supports_v2_p2p
+ p2p_conn.peer_connect(**kwargs, send_version=send_version, net=self.chain, timeout_factor=self.timeout_factor, supports_v2_p2p=supports_v2_p2p)()
+
self.p2ps.append(p2p_conn)
p2p_conn.wait_until(lambda: p2p_conn.is_connected, check_connected=False)
+ if supports_v2_p2p and wait_for_v2_handshake:
+ p2p_conn.wait_until(lambda: p2p_conn.v2_state.tried_v2_handshake)
if send_version:
p2p_conn.wait_until(lambda: not p2p_conn.on_connection_send_msg)
if wait_for_verack:
@@ -701,7 +726,7 @@ class TestNode():
return p2p_conn
- def add_outbound_p2p_connection(self, p2p_conn, *, wait_for_verack=True, p2p_idx, connection_type="outbound-full-relay", **kwargs):
+ def add_outbound_p2p_connection(self, p2p_conn, *, wait_for_verack=True, p2p_idx, connection_type="outbound-full-relay", supports_v2_p2p=None, advertise_v2_p2p=None, **kwargs):
"""Add an outbound p2p connection from node. Must be an
"outbound-full-relay", "block-relay-only", "addr-fetch" or "feeler" connection.
@@ -711,14 +736,42 @@ class TestNode():
p2p_idx must be different for simultaneously connected peers. When reusing it for the next peer
after disconnecting the previous one, it is necessary to wait for the disconnect to finish to avoid
a race condition.
+
+ Parameters:
+ supports_v2_p2p: whether p2p_conn supports v2 P2P or not
+ advertise_v2_p2p: whether p2p_conn is advertised to support v2 P2P or not
+
+ An outbound connection is made from TestNode -------> P2PConnection
+ - if P2PConnection doesn't advertise_v2_p2p, TestNode sends version message and v1 P2P is followed
+ - if P2PConnection both supports_v2_p2p and advertise_v2_p2p, TestNode sends ellswift bytes and v2 P2P is followed
+ - if P2PConnection doesn't supports_v2_p2p but advertise_v2_p2p,
+ TestNode sends ellswift bytes and P2PConnection disconnects,
+ TestNode reconnects by sending version message and v1 P2P is followed
"""
def addconnection_callback(address, port):
self.log.debug("Connecting to %s:%d %s" % (address, port, connection_type))
- self.addconnection('%s:%d' % (address, port), connection_type)
+ self.addconnection('%s:%d' % (address, port), connection_type, advertise_v2_p2p)
p2p_conn.p2p_connected_to_node = False
- p2p_conn.peer_accept_connection(connect_cb=addconnection_callback, connect_id=p2p_idx + 1, net=self.chain, timeout_factor=self.timeout_factor, **kwargs)()
+ if supports_v2_p2p is None:
+ supports_v2_p2p = self.use_v2transport
+ if advertise_v2_p2p is None:
+ advertise_v2_p2p = self.use_v2transport
+
+ if advertise_v2_p2p:
+ kwargs['services'] = kwargs.get('services', P2P_SERVICES) | NODE_P2P_V2
+ assert self.use_v2transport # only a v2 TestNode could make a v2 outbound connection
+
+ # if P2PConnection is advertised to support v2 P2P when it doesn't actually support v2 P2P,
+ # reconnection needs to be attempted using v1 P2P by sending version message
+ reconnect = advertise_v2_p2p and not supports_v2_p2p
+ # P2PConnection needs to be advertised to support v2 P2P so that ellswift bytes are sent instead of msg_version
+ supports_v2_p2p = supports_v2_p2p and advertise_v2_p2p
+ p2p_conn.peer_accept_connection(connect_cb=addconnection_callback, connect_id=p2p_idx + 1, net=self.chain, timeout_factor=self.timeout_factor, supports_v2_p2p=supports_v2_p2p, reconnect=reconnect, **kwargs)()
+
+ if reconnect:
+ p2p_conn.wait_for_reconnect()
if connection_type == "feeler":
# feeler connections are closed as soon as the node receives a `version` message
@@ -728,6 +781,8 @@ class TestNode():
p2p_conn.wait_for_connect()
self.p2ps.append(p2p_conn)
+ if supports_v2_p2p:
+ p2p_conn.wait_until(lambda: p2p_conn.v2_state.tried_v2_handshake)
p2p_conn.wait_until(lambda: not p2p_conn.on_connection_send_msg)
if wait_for_verack:
p2p_conn.wait_for_verack()
diff --git a/test/functional/test_framework/util.py b/test/functional/test_framework/util.py
index c65e3e38e6..b4b05b1597 100644
--- a/test/functional/test_framework/util.py
+++ b/test/functional/test_framework/util.py
@@ -13,8 +13,8 @@ import json
import logging
import os
import pathlib
+import platform
import re
-import sys
import time
from . import coverage
@@ -414,12 +414,12 @@ def get_temp_default_datadir(temp_dir: pathlib.Path) -> tuple[dict, pathlib.Path
"""Return os-specific environment variables that can be set to make the
GetDefaultDataDir() function return a datadir path under the provided
temp_dir, as well as the complete path it would return."""
- if sys.platform == "win32":
+ if platform.system() == "Windows":
env = dict(APPDATA=str(temp_dir))
datadir = temp_dir / "Bitcoin"
else:
env = dict(HOME=str(temp_dir))
- if sys.platform == "darwin":
+ if platform.system() == "Darwin":
datadir = temp_dir / "Library/Application Support/Bitcoin"
else:
datadir = temp_dir / ".bitcoin"
diff --git a/test/functional/test_framework/v2_p2p.py b/test/functional/test_framework/v2_p2p.py
new file mode 100644
index 0000000000..8f79623bd8
--- /dev/null
+++ b/test/functional/test_framework/v2_p2p.py
@@ -0,0 +1,285 @@
+#!/usr/bin/env python3
+# Copyright (c) 2022 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+"""Class for v2 P2P protocol (see BIP 324)"""
+
+import logging
+import random
+
+from .crypto.bip324_cipher import FSChaCha20Poly1305
+from .crypto.chacha20 import FSChaCha20
+from .crypto.ellswift import ellswift_create, ellswift_ecdh_xonly
+from .crypto.hkdf import hkdf_sha256
+from .key import TaggedHash
+from .messages import MAGIC_BYTES
+
+logger = logging.getLogger("TestFramework.v2_p2p")
+
+CHACHA20POLY1305_EXPANSION = 16
+HEADER_LEN = 1
+IGNORE_BIT_POS = 7
+LENGTH_FIELD_LEN = 3
+MAX_GARBAGE_LEN = 4095
+TRANSPORT_VERSION = b''
+
+SHORTID = {
+ 1: b"addr",
+ 2: b"block",
+ 3: b"blocktxn",
+ 4: b"cmpctblock",
+ 5: b"feefilter",
+ 6: b"filteradd",
+ 7: b"filterclear",
+ 8: b"filterload",
+ 9: b"getblocks",
+ 10: b"getblocktxn",
+ 11: b"getdata",
+ 12: b"getheaders",
+ 13: b"headers",
+ 14: b"inv",
+ 15: b"mempool",
+ 16: b"merkleblock",
+ 17: b"notfound",
+ 18: b"ping",
+ 19: b"pong",
+ 20: b"sendcmpct",
+ 21: b"tx",
+ 22: b"getcfilters",
+ 23: b"cfilter",
+ 24: b"getcfheaders",
+ 25: b"cfheaders",
+ 26: b"getcfcheckpt",
+ 27: b"cfcheckpt",
+ 28: b"addrv2",
+}
+
+# Dictionary which contains short message type ID for the P2P message
+MSGTYPE_TO_SHORTID = {msgtype: shortid for shortid, msgtype in SHORTID.items()}
+
+
+class EncryptedP2PState:
+ """A class for managing the state when v2 P2P protocol is used. Performs initial v2 handshake and encrypts/decrypts
+ P2P messages. P2PConnection uses an object of this class.
+
+
+ Args:
+ initiating (bool): defines whether the P2PConnection is an initiator or responder.
+ - initiating = True for inbound connections in the test framework [TestNode <------- P2PConnection]
+ - initiating = False for outbound connections in the test framework [TestNode -------> P2PConnection]
+
+ net (string): chain used (regtest, signet etc..)
+
+ Methods:
+ perform an advanced form of diffie-hellman handshake to instantiate the encrypted transport. before exchanging
+ any P2P messages, 2 nodes perform this handshake in order to determine a shared secret that is unique to both
+ of them and use it to derive keys to encrypt/decrypt P2P messages.
+ - initial v2 handshakes is performed by: (see BIP324 section #overall-handshake-pseudocode)
+ 1. initiator using initiate_v2_handshake(), complete_handshake() and authenticate_handshake()
+ 2. responder using respond_v2_handshake(), complete_handshake() and authenticate_handshake()
+ - initialize_v2_transport() sets various BIP324 derived keys and ciphers.
+
+ encrypt/decrypt v2 P2P messages using v2_enc_packet() and v2_receive_packet().
+ """
+ def __init__(self, *, initiating, net):
+ self.initiating = initiating # True if initiator
+ self.net = net
+ self.peer = {} # object with various BIP324 derived keys and ciphers
+ self.privkey_ours = None
+ self.ellswift_ours = None
+ self.sent_garbage = b""
+ self.received_garbage = b""
+ self.received_prefix = b"" # received ellswift bytes till the first mismatch from 16 bytes v1_prefix
+ self.tried_v2_handshake = False # True when the initial handshake is over
+ # stores length of packet contents to detect whether first 3 bytes (which contains length of packet contents)
+ # has been decrypted. set to -1 if decryption hasn't been done yet.
+ self.contents_len = -1
+ self.found_garbage_terminator = False
+
+ @staticmethod
+ def v2_ecdh(priv, ellswift_theirs, ellswift_ours, initiating):
+ """Compute BIP324 shared secret.
+
+ Returns:
+ bytes - BIP324 shared secret
+ """
+ ecdh_point_x32 = ellswift_ecdh_xonly(ellswift_theirs, priv)
+ if initiating:
+ # Initiating, place our public key encoding first.
+ return TaggedHash("bip324_ellswift_xonly_ecdh", ellswift_ours + ellswift_theirs + ecdh_point_x32)
+ else:
+ # Responding, place their public key encoding first.
+ return TaggedHash("bip324_ellswift_xonly_ecdh", ellswift_theirs + ellswift_ours + ecdh_point_x32)
+
+ def generate_keypair_and_garbage(self):
+ """Generates ellswift keypair and 4095 bytes garbage at max"""
+ self.privkey_ours, self.ellswift_ours = ellswift_create()
+ garbage_len = random.randrange(MAX_GARBAGE_LEN + 1)
+ self.sent_garbage = random.randbytes(garbage_len)
+ logger.debug(f"sending {garbage_len} bytes of garbage data")
+ return self.ellswift_ours + self.sent_garbage
+
+ def initiate_v2_handshake(self):
+ """Initiator begins the v2 handshake by sending its ellswift bytes and garbage
+
+ Returns:
+ bytes - bytes to be sent to the peer when starting the v2 handshake as an initiator
+ """
+ return self.generate_keypair_and_garbage()
+
+ def respond_v2_handshake(self, response):
+ """Responder begins the v2 handshake by sending its ellswift bytes and garbage. However, the responder
+ sends this after having received at least one byte that mismatches 16-byte v1_prefix.
+
+ Returns:
+ 1. int - length of bytes that were consumed so that recvbuf can be updated
+ 2. bytes - bytes to be sent to the peer when starting the v2 handshake as a responder.
+ - returns b"" if more bytes need to be received before we can respond and start the v2 handshake.
+ - returns -1 to downgrade the connection to v1 P2P.
+ """
+ v1_prefix = MAGIC_BYTES[self.net] + b'version\x00\x00\x00\x00\x00'
+ while len(self.received_prefix) < 16:
+ byte = response.read(1)
+ # return b"" if we need to receive more bytes
+ if not byte:
+ return len(self.received_prefix), b""
+ self.received_prefix += byte
+ if self.received_prefix[-1] != v1_prefix[len(self.received_prefix) - 1]:
+ return len(self.received_prefix), self.generate_keypair_and_garbage()
+ # return -1 to decide v1 only after all 16 bytes processed
+ return len(self.received_prefix), -1
+
+ def complete_handshake(self, response):
+ """ Instantiates the encrypted transport and
+ sends garbage terminator + optional decoy packets + transport version packet.
+ Done by both initiator and responder.
+
+ Returns:
+ 1. int - length of bytes that were consumed. returns 0 if all 64 bytes from ellswift haven't been received yet.
+ 2. bytes - bytes to be sent to the peer when completing the v2 handshake
+ """
+ ellswift_theirs = self.received_prefix + response.read(64 - len(self.received_prefix))
+ # return b"" if we need to receive more bytes
+ if len(ellswift_theirs) != 64:
+ return 0, b""
+ ecdh_secret = self.v2_ecdh(self.privkey_ours, ellswift_theirs, self.ellswift_ours, self.initiating)
+ self.initialize_v2_transport(ecdh_secret)
+ # Send garbage terminator
+ msg_to_send = self.peer['send_garbage_terminator']
+ # Optionally send decoy packets after garbage terminator.
+ aad = self.sent_garbage
+ for decoy_content_len in [random.randint(1, 100) for _ in range(random.randint(0, 10))]:
+ msg_to_send += self.v2_enc_packet(decoy_content_len * b'\x00', aad=aad, ignore=True)
+ aad = b''
+ # Send version packet.
+ msg_to_send += self.v2_enc_packet(TRANSPORT_VERSION, aad=aad)
+ return 64 - len(self.received_prefix), msg_to_send
+
+ def authenticate_handshake(self, response):
+ """ Ensures that the received optional decoy packets and transport version packet are authenticated.
+ Marks the v2 handshake as complete. Done by both initiator and responder.
+
+ Returns:
+ 1. int - length of bytes that were processed so that recvbuf can be updated
+ 2. bool - True if the authentication was successful/more bytes need to be received and False otherwise
+ """
+ processed_length = 0
+
+ # Detect garbage terminator in the received bytes
+ if not self.found_garbage_terminator:
+ received_garbage = response[:16]
+ response = response[16:]
+ processed_length = len(received_garbage)
+ for i in range(MAX_GARBAGE_LEN + 1):
+ if received_garbage[-16:] == self.peer['recv_garbage_terminator']:
+ # Receive, decode, and ignore version packet.
+ # This includes skipping decoys and authenticating the received garbage.
+ self.found_garbage_terminator = True
+ self.received_garbage = received_garbage[:-16]
+ break
+ else:
+ # don't update recvbuf since more bytes need to be received
+ if len(response) == 0:
+ return 0, True
+ received_garbage += response[:1]
+ processed_length += 1
+ response = response[1:]
+ else:
+ # disconnect since garbage terminator was not seen after 4 KiB of garbage.
+ return processed_length, False
+
+ # Process optional decoy packets and transport version packet
+ while not self.tried_v2_handshake:
+ length, contents = self.v2_receive_packet(response, aad=self.received_garbage)
+ if length == -1:
+ return processed_length, False
+ elif length == 0:
+ return processed_length, True
+ processed_length += length
+ self.received_garbage = b""
+ # decoy packets have contents = None. v2 handshake is complete only when version packet
+ # (can be empty with contents = b"") with contents != None is received.
+ if contents is not None:
+ assert contents == b"" # currently TestNode sends an empty version packet
+ self.tried_v2_handshake = True
+ return processed_length, True
+ response = response[length:]
+
+ def initialize_v2_transport(self, ecdh_secret):
+ """Sets the peer object with various BIP324 derived keys and ciphers."""
+ peer = {}
+ salt = b'bitcoin_v2_shared_secret' + MAGIC_BYTES[self.net]
+ for name in ('initiator_L', 'initiator_P', 'responder_L', 'responder_P', 'garbage_terminators', 'session_id'):
+ peer[name] = hkdf_sha256(salt=salt, ikm=ecdh_secret, info=name.encode('utf-8'), length=32)
+ if self.initiating:
+ self.peer['send_L'] = FSChaCha20(peer['initiator_L'])
+ self.peer['send_P'] = FSChaCha20Poly1305(peer['initiator_P'])
+ self.peer['send_garbage_terminator'] = peer['garbage_terminators'][:16]
+ self.peer['recv_L'] = FSChaCha20(peer['responder_L'])
+ self.peer['recv_P'] = FSChaCha20Poly1305(peer['responder_P'])
+ self.peer['recv_garbage_terminator'] = peer['garbage_terminators'][16:]
+ else:
+ self.peer['send_L'] = FSChaCha20(peer['responder_L'])
+ self.peer['send_P'] = FSChaCha20Poly1305(peer['responder_P'])
+ self.peer['send_garbage_terminator'] = peer['garbage_terminators'][16:]
+ self.peer['recv_L'] = FSChaCha20(peer['initiator_L'])
+ self.peer['recv_P'] = FSChaCha20Poly1305(peer['initiator_P'])
+ self.peer['recv_garbage_terminator'] = peer['garbage_terminators'][:16]
+ self.peer['session_id'] = peer['session_id']
+
+ def v2_enc_packet(self, contents, aad=b'', ignore=False):
+ """Encrypt a BIP324 packet.
+
+ Returns:
+ bytes - encrypted packet contents
+ """
+ assert len(contents) <= 2**24 - 1
+ header = (ignore << IGNORE_BIT_POS).to_bytes(HEADER_LEN, 'little')
+ plaintext = header + contents
+ aead_ciphertext = self.peer['send_P'].encrypt(aad, plaintext)
+ enc_plaintext_len = self.peer['send_L'].crypt(len(contents).to_bytes(LENGTH_FIELD_LEN, 'little'))
+ return enc_plaintext_len + aead_ciphertext
+
+ def v2_receive_packet(self, response, aad=b''):
+ """Decrypt a BIP324 packet
+
+ Returns:
+ 1. int - number of bytes consumed (or -1 if error)
+ 2. bytes - contents of decrypted non-decoy packet if any (or None otherwise)
+ """
+ if self.contents_len == -1:
+ if len(response) < LENGTH_FIELD_LEN:
+ return 0, None
+ enc_contents_len = response[:LENGTH_FIELD_LEN]
+ self.contents_len = int.from_bytes(self.peer['recv_L'].crypt(enc_contents_len), 'little')
+ response = response[LENGTH_FIELD_LEN:]
+ if len(response) < HEADER_LEN + self.contents_len + CHACHA20POLY1305_EXPANSION:
+ return 0, None
+ aead_ciphertext = response[:HEADER_LEN + self.contents_len + CHACHA20POLY1305_EXPANSION]
+ plaintext = self.peer['recv_P'].decrypt(aad, aead_ciphertext)
+ if plaintext is None:
+ return -1, None # disconnect
+ header = plaintext[:HEADER_LEN]
+ length = LENGTH_FIELD_LEN + HEADER_LEN + self.contents_len + CHACHA20POLY1305_EXPANSION
+ self.contents_len = -1
+ return length, None if (header[0] & (1 << IGNORE_BIT_POS)) else plaintext[HEADER_LEN:]
diff --git a/test/functional/test_framework/wallet.py b/test/functional/test_framework/wallet.py
index 53c8e1b0cc..470ed08ed4 100644
--- a/test/functional/test_framework/wallet.py
+++ b/test/functional/test_framework/wallet.py
@@ -286,11 +286,12 @@ class MiniWallet:
utxos_to_spend: Optional[list[dict]] = None,
num_outputs=1,
amount_per_output=0,
+ version=2,
locktime=0,
sequence=0,
fee_per_output=1000,
target_weight=0,
- confirmed_only=False
+ confirmed_only=False,
):
"""
Create and return a transaction that spends the given UTXOs and creates a
@@ -313,6 +314,7 @@ class MiniWallet:
tx = CTransaction()
tx.vin = [CTxIn(COutPoint(int(utxo_to_spend['txid'], 16), utxo_to_spend['vout']), nSequence=seq) for utxo_to_spend, seq in zip(utxos_to_spend, sequence)]
tx.vout = [CTxOut(amount_per_output, bytearray(self._scriptPubKey)) for _ in range(num_outputs)]
+ tx.nVersion = version
tx.nLockTime = locktime
self.sign_tx(tx)
@@ -337,14 +339,15 @@ class MiniWallet:
"tx": tx,
}
- def create_self_transfer(self, *,
+ def create_self_transfer(
+ self,
+ *,
fee_rate=Decimal("0.003"),
fee=Decimal("0"),
utxo_to_spend=None,
- locktime=0,
- sequence=0,
target_weight=0,
- confirmed_only=False
+ confirmed_only=False,
+ **kwargs,
):
"""Create and return a tx with the specified fee. If fee is 0, use fee_rate, where the resulting fee may be exact or at most one satoshi higher than needed."""
utxo_to_spend = utxo_to_spend or self.get_utxo(confirmed_only=confirmed_only)
@@ -360,7 +363,12 @@ class MiniWallet:
send_value = utxo_to_spend["value"] - (fee or (fee_rate * vsize / 1000))
# create tx
- tx = self.create_self_transfer_multi(utxos_to_spend=[utxo_to_spend], locktime=locktime, sequence=sequence, amount_per_output=int(COIN * send_value), target_weight=target_weight)
+ tx = self.create_self_transfer_multi(
+ utxos_to_spend=[utxo_to_spend],
+ amount_per_output=int(COIN * send_value),
+ target_weight=target_weight,
+ **kwargs,
+ )
if not target_weight:
assert_equal(tx["tx"].get_vsize(), vsize)
tx["new_utxo"] = tx.pop("new_utxos")[0]
diff --git a/test/functional/test_runner.py b/test/functional/test_runner.py
index 2460b2e3e6..4d66ea97c8 100755
--- a/test/functional/test_runner.py
+++ b/test/functional/test_runner.py
@@ -17,6 +17,7 @@ from collections import deque
import configparser
import datetime
import os
+import platform
import time
import shutil
import signal
@@ -42,8 +43,8 @@ except UnicodeDecodeError:
CROSS = "x "
CIRCLE = "o "
-if os.name != 'nt' or sys.getwindowsversion() >= (10, 0, 14393): #type:ignore
- if os.name == 'nt':
+if platform.system() != 'Windows' or sys.getwindowsversion() >= (10, 0, 14393): #type:ignore
+ if platform.system() == 'Windows':
import ctypes
kernel32 = ctypes.windll.kernel32 # type: ignore
ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4
@@ -253,6 +254,7 @@ BASE_SCRIPTS = [
'p2p_nobloomfilter_messages.py',
'p2p_filter.py',
'rpc_setban.py',
+ 'rpc_setban.py --v2transport',
'p2p_blocksonly.py',
'mining_prioritisetransaction.py',
'p2p_invalid_locator.py',
@@ -261,7 +263,10 @@ BASE_SCRIPTS = [
'p2p_invalid_tx.py',
'p2p_invalid_tx.py --v2transport',
'p2p_v2_transport.py',
+ 'p2p_v2_encrypted.py',
+ 'p2p_v2_earlykeyresponse.py',
'example_test.py',
+ 'mempool_accept_v3.py',
'wallet_txn_doublespend.py --legacy-wallet',
'wallet_multisig_descriptor_psbt.py --descriptors',
'wallet_txn_doublespend.py --descriptors',
@@ -303,6 +308,7 @@ BASE_SCRIPTS = [
'wallet_crosschain.py',
'mining_basic.py',
'feature_signet.py',
+ 'p2p_mutated_blocks.py',
'wallet_implicitsegwit.py --legacy-wallet',
'rpc_named_arguments.py',
'feature_startupnotify.py',
@@ -332,9 +338,12 @@ BASE_SCRIPTS = [
'wallet_send.py --descriptors',
'wallet_sendall.py --legacy-wallet',
'wallet_sendall.py --descriptors',
+ 'wallet_sendmany.py --descriptors',
+ 'wallet_sendmany.py --legacy-wallet',
'wallet_create_tx.py --descriptors',
'wallet_inactive_hdchains.py --legacy-wallet',
'wallet_spend_unconfirmed.py',
+ 'wallet_rescan_unconfirmed.py --descriptors',
'p2p_fingerprint.py',
'feature_uacomment.py',
'feature_init.py',
@@ -343,6 +352,7 @@ BASE_SCRIPTS = [
'feature_filelock.py',
'feature_loadblock.py',
'feature_assumeutxo.py',
+ 'wallet_assumeutxo.py --descriptors',
'p2p_dos_header_tree.py',
'p2p_add_connections.py',
'feature_bind_port_discover.py',
@@ -425,6 +435,8 @@ def main():
parser.add_argument('--tmpdirprefix', '-t', default=tempfile.gettempdir(), help="Root directory for datadirs")
parser.add_argument('--failfast', '-F', action='store_true', help='stop execution after the first test failure')
parser.add_argument('--filter', help='filter scripts to run by regular expression')
+ parser.add_argument('--skipunit', '-u', action='store_true', help='skip unit tests for the test framework')
+
args, unknown_args = parser.parse_known_args()
if not args.ansi:
@@ -461,7 +473,7 @@ def main():
if not enable_bitcoind:
print("No functional tests to run.")
print("Rerun ./configure with --with-daemon and then make")
- sys.exit(0)
+ sys.exit(1)
# Build list of tests
test_list = []
@@ -510,7 +522,7 @@ def main():
if not test_list:
print("No valid test scripts specified. Check that your test is in one "
"of the test lists in test_runner.py, or run test_runner.py with no arguments to run all tests")
- sys.exit(0)
+ sys.exit(1)
if args.help:
# Print help for test_runner.py, then print help of the first script (with args removed) and exit.
@@ -535,9 +547,10 @@ def main():
combined_logs_len=args.combinedlogslen,
failfast=args.failfast,
use_term_control=args.ansi,
+ skipunit=args.skipunit,
)
-def run_tests(*, test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=False, args=None, combined_logs_len=0, failfast=False, use_term_control):
+def run_tests(*, test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=False, args=None, combined_logs_len=0, failfast=False, use_term_control, skipunit=False):
args = args or []
# Warn if bitcoind is already running
@@ -554,20 +567,20 @@ def run_tests(*, test_list, src_dir, build_dir, tmpdir, jobs=1, enable_coverage=
if os.path.isdir(cache_dir):
print("%sWARNING!%s There is a cache directory here: %s. If tests fail unexpectedly, try deleting the cache directory." % (BOLD[1], BOLD[0], cache_dir))
- # Test Framework Tests
- print("Running Unit Tests for Test Framework Modules")
tests_dir = src_dir + '/test/functional/'
# This allows `test_runner.py` to work from an out-of-source build directory using a symlink,
# a hard link or a copy on any platform. See https://github.com/bitcoin/bitcoin/pull/27561.
sys.path.append(tests_dir)
- test_framework_tests = unittest.TestSuite()
- for module in TEST_FRAMEWORK_MODULES:
- test_framework_tests.addTest(unittest.TestLoader().loadTestsFromName("test_framework.{}".format(module)))
- result = unittest.TextTestRunner(verbosity=1, failfast=True).run(test_framework_tests)
- if not result.wasSuccessful():
- sys.exit("Early exiting after failure in TestFramework unit tests")
+ if not skipunit:
+ print("Running Unit Tests for Test Framework Modules")
+ test_framework_tests = unittest.TestSuite()
+ for module in TEST_FRAMEWORK_MODULES:
+ test_framework_tests.addTest(unittest.TestLoader().loadTestsFromName("test_framework.{}".format(module)))
+ result = unittest.TextTestRunner(verbosity=1, failfast=True).run(test_framework_tests)
+ if not result.wasSuccessful():
+ sys.exit("Early exiting after failure in TestFramework unit tests")
flags = ['--cachedir={}'.format(cache_dir)] + args
diff --git a/test/functional/wallet_assumeutxo.py b/test/functional/wallet_assumeutxo.py
new file mode 100755
index 0000000000..3c1a997bd1
--- /dev/null
+++ b/test/functional/wallet_assumeutxo.py
@@ -0,0 +1,169 @@
+#!/usr/bin/env python3
+# Copyright (c) 2023-present The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+"""Test for assumeutxo wallet related behavior.
+See feature_assumeutxo.py for background.
+
+## Possible test improvements
+
+- TODO: test import descriptors while background sync is in progress
+- TODO: test loading a wallet (backup) on a pruned node
+
+"""
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import (
+ assert_equal,
+ assert_raises_rpc_error,
+)
+from test_framework.wallet import MiniWallet
+
+START_HEIGHT = 199
+SNAPSHOT_BASE_HEIGHT = 299
+FINAL_HEIGHT = 399
+
+
+class AssumeutxoTest(BitcoinTestFramework):
+ def skip_test_if_missing_module(self):
+ self.skip_if_no_wallet()
+
+ def add_options(self, parser):
+ self.add_wallet_options(parser, legacy=False)
+
+ def set_test_params(self):
+ """Use the pregenerated, deterministic chain up to height 199."""
+ self.num_nodes = 2
+ self.rpc_timeout = 120
+ self.extra_args = [
+ [],
+ [],
+ ]
+
+ def setup_network(self):
+ """Start with the nodes disconnected so that one can generate a snapshot
+ including blocks the other hasn't yet seen."""
+ self.add_nodes(2)
+ self.start_nodes(extra_args=self.extra_args)
+
+ def run_test(self):
+ """
+ Bring up two (disconnected) nodes, mine some new blocks on the first,
+ and generate a UTXO snapshot.
+
+ Load the snapshot into the second, ensure it syncs to tip and completes
+ background validation when connected to the first.
+ """
+ n0 = self.nodes[0]
+ n1 = self.nodes[1]
+
+ self.mini_wallet = MiniWallet(n0)
+
+ # Mock time for a deterministic chain
+ for n in self.nodes:
+ n.setmocktime(n.getblockheader(n.getbestblockhash())['time'])
+
+ self.sync_blocks()
+
+ n0.createwallet('w')
+ w = n0.get_wallet_rpc("w")
+
+ # Generate a series of blocks that `n0` will have in the snapshot,
+ # but that n1 doesn't yet see. In order for the snapshot to activate,
+ # though, we have to ferry over the new headers to n1 so that it
+ # isn't waiting forever to see the header of the snapshot's base block
+ # while disconnected from n0.
+ for i in range(100):
+ if i % 3 == 0:
+ self.mini_wallet.send_self_transfer(from_node=n0)
+ self.generate(n0, nblocks=1, sync_fun=self.no_op)
+ newblock = n0.getblock(n0.getbestblockhash(), 0)
+
+ # make n1 aware of the new header, but don't give it the block.
+ n1.submitheader(newblock)
+
+ # Ensure everyone is seeing the same headers.
+ for n in self.nodes:
+ assert_equal(n.getblockchaininfo()[
+ "headers"], SNAPSHOT_BASE_HEIGHT)
+
+ w.backupwallet("backup_w.dat")
+
+ self.log.info("-- Testing assumeutxo")
+
+ assert_equal(n0.getblockcount(), SNAPSHOT_BASE_HEIGHT)
+ assert_equal(n1.getblockcount(), START_HEIGHT)
+
+ self.log.info(
+ f"Creating a UTXO snapshot at height {SNAPSHOT_BASE_HEIGHT}")
+ dump_output = n0.dumptxoutset('utxos.dat')
+
+ assert_equal(
+ dump_output['txoutset_hash'],
+ "a4bf3407ccb2cc0145c49ebba8fa91199f8a3903daf0883875941497d2493c27")
+ assert_equal(dump_output["nchaintx"], 334)
+ assert_equal(n0.getblockchaininfo()["blocks"], SNAPSHOT_BASE_HEIGHT)
+
+ # Mine more blocks on top of the snapshot that n1 hasn't yet seen. This
+ # will allow us to test n1's sync-to-tip on top of a snapshot.
+ self.generate(n0, nblocks=100, sync_fun=self.no_op)
+
+ assert_equal(n0.getblockcount(), FINAL_HEIGHT)
+ assert_equal(n1.getblockcount(), START_HEIGHT)
+
+ assert_equal(n0.getblockchaininfo()["blocks"], FINAL_HEIGHT)
+
+ self.log.info(
+ f"Loading snapshot into second node from {dump_output['path']}")
+ loaded = n1.loadtxoutset(dump_output['path'])
+ assert_equal(loaded['coins_loaded'], SNAPSHOT_BASE_HEIGHT)
+ assert_equal(loaded['base_height'], SNAPSHOT_BASE_HEIGHT)
+
+ normal, snapshot = n1.getchainstates()["chainstates"]
+ assert_equal(normal['blocks'], START_HEIGHT)
+ assert_equal(normal.get('snapshot_blockhash'), None)
+ assert_equal(normal['validated'], True)
+ assert_equal(snapshot['blocks'], SNAPSHOT_BASE_HEIGHT)
+ assert_equal(snapshot['snapshot_blockhash'], dump_output['base_hash'])
+ assert_equal(snapshot['validated'], False)
+
+ assert_equal(n1.getblockchaininfo()["blocks"], SNAPSHOT_BASE_HEIGHT)
+
+ self.log.info("Backup can't be loaded during background sync")
+ assert_raises_rpc_error(-4, "Wallet loading failed. Error loading wallet. Wallet requires blocks to be downloaded, and software does not currently support loading wallets while blocks are being downloaded out of order when using assumeutxo snapshots. Wallet should be able to load successfully after node sync reaches height 299", n1.restorewallet, "w", "backup_w.dat")
+
+ PAUSE_HEIGHT = FINAL_HEIGHT - 40
+
+ self.log.info("Restarting node to stop at height %d", PAUSE_HEIGHT)
+ self.restart_node(1, extra_args=[
+ f"-stopatheight={PAUSE_HEIGHT}", *self.extra_args[1]])
+
+ # Finally connect the nodes and let them sync.
+ #
+ # Set `wait_for_connect=False` to avoid a race between performing connection
+ # assertions and the -stopatheight tripping.
+ self.connect_nodes(0, 1, wait_for_connect=False)
+
+ n1.wait_until_stopped(timeout=5)
+
+ self.log.info(
+ "Restarted node before snapshot validation completed, reloading...")
+ self.restart_node(1, extra_args=self.extra_args[1])
+
+ # TODO: inspect state of e.g. the wallet before reconnecting
+ self.connect_nodes(0, 1)
+
+ self.log.info(
+ f"Ensuring snapshot chain syncs to tip. ({FINAL_HEIGHT})")
+ self.wait_until(lambda: n1.getchainstates()[
+ 'chainstates'][-1]['blocks'] == FINAL_HEIGHT)
+ self.sync_blocks(nodes=(n0, n1))
+
+ self.log.info("Ensuring background validation completes")
+ self.wait_until(lambda: len(n1.getchainstates()['chainstates']) == 1)
+
+ self.log.info("Ensuring wallet can be restored from backup")
+ n1.restorewallet("w", "backup_w.dat")
+
+
+if __name__ == '__main__':
+ AssumeutxoTest().main()
diff --git a/test/functional/wallet_descriptor.py b/test/functional/wallet_descriptor.py
index e9321b72e2..cbd3898f92 100755
--- a/test/functional/wallet_descriptor.py
+++ b/test/functional/wallet_descriptor.py
@@ -9,7 +9,10 @@ try:
except ImportError:
pass
+import concurrent.futures
+
from test_framework.blocktools import COINBASE_MATURITY
+from test_framework.descriptors import descsum_create
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
assert_equal,
@@ -33,6 +36,41 @@ class WalletDescriptorTest(BitcoinTestFramework):
self.skip_if_no_sqlite()
self.skip_if_no_py_sqlite3()
+ def test_concurrent_writes(self):
+ self.log.info("Test sqlite concurrent writes are in the correct order")
+ self.restart_node(0, extra_args=["-unsafesqlitesync=0"])
+ self.nodes[0].createwallet(wallet_name="concurrency", blank=True)
+ wallet = self.nodes[0].get_wallet_rpc("concurrency")
+ # First import a descriptor that uses hardened dervation so that topping up
+ # Will require writing a ton to db
+ wallet.importdescriptors([{"desc":descsum_create("wpkh(tprv8ZgxMBicQKsPeuVhWwi6wuMQGfPKi9Li5GtX35jVNknACgqe3CY4g5xgkfDDJcmtF7o1QnxWDRYw4H5P26PXq7sbcUkEqeR4fg3Kxp2tigg/0h/0h/*h)"), "timestamp": "now", "active": True}])
+ with concurrent.futures.ThreadPoolExecutor(max_workers=1) as thread:
+ topup = thread.submit(wallet.keypoolrefill, newsize=1000)
+
+ # Then while the topup is running, we need to do something that will call
+ # ChainStateFlushed which will trigger a write to the db, hopefully at the
+ # same time that the topup still has an open db transaction.
+ self.nodes[0].cli.gettxoutsetinfo()
+ assert_equal(topup.result(), None)
+
+ wallet.unloadwallet()
+
+ # Check that everything was written
+ wallet_db = self.nodes[0].wallets_path / "concurrency" / self.wallet_data_filename
+ conn = sqlite3.connect(wallet_db)
+ with conn:
+ # Retrieve the bestblock_nomerkle record
+ bestblock_rec = conn.execute("SELECT value FROM main WHERE hex(key) = '1262657374626C6F636B5F6E6F6D65726B6C65'").fetchone()[0]
+ # Retrieve the number of descriptor cache records
+ # Since we store binary data, sqlite's comparison operators don't work everywhere
+ # so just retrieve all records and process them ourselves.
+ db_keys = conn.execute("SELECT key FROM main").fetchall()
+ cache_records = len([k[0] for k in db_keys if b"walletdescriptorcache" in k[0]])
+ conn.close()
+
+ assert_equal(bestblock_rec[5:37][::-1].hex(), self.nodes[0].getbestblockhash())
+ assert_equal(cache_records, 1000)
+
def run_test(self):
if self.is_bdb_compiled():
# Make a legacy wallet and check it is BDB
@@ -240,6 +278,8 @@ class WalletDescriptorTest(BitcoinTestFramework):
conn.close()
assert_raises_rpc_error(-4, "Unexpected legacy entry in descriptor wallet found.", self.nodes[0].loadwallet, "crashme")
+ self.test_concurrent_writes()
+
if __name__ == '__main__':
WalletDescriptorTest().main ()
diff --git a/test/functional/wallet_fundrawtransaction.py b/test/functional/wallet_fundrawtransaction.py
index a331ba997e..d886a59ac1 100755
--- a/test/functional/wallet_fundrawtransaction.py
+++ b/test/functional/wallet_fundrawtransaction.py
@@ -8,10 +8,13 @@
from decimal import Decimal
from itertools import product
from math import ceil
+from test_framework.address import address_to_scriptpubkey
from test_framework.descriptors import descsum_create
from test_framework.messages import (
COIN,
+ CTransaction,
+ CTxOut,
)
from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import (
@@ -147,6 +150,34 @@ class RawTransactionsTest(BitcoinTestFramework):
self.test_22670()
self.test_feerate_rounding()
self.test_input_confs_control()
+ self.test_duplicate_outputs()
+
+ def test_duplicate_outputs(self):
+ self.log.info("Test deserializing and funding a transaction with duplicate outputs")
+ self.nodes[1].createwallet("fundtx_duplicate_outputs")
+ w = self.nodes[1].get_wallet_rpc("fundtx_duplicate_outputs")
+
+ addr = w.getnewaddress(address_type="bech32")
+ self.nodes[0].sendtoaddress(addr, 5)
+ self.generate(self.nodes[0], 1)
+
+ address = self.nodes[0].getnewaddress("bech32")
+ tx = CTransaction()
+ tx.vin = []
+ tx.vout = [CTxOut(1 * COIN, bytearray(address_to_scriptpubkey(address)))] * 2
+ tx.nLockTime = 0
+ tx_hex = tx.serialize().hex()
+ res = w.fundrawtransaction(tx_hex, add_inputs=True)
+ signed_res = w.signrawtransactionwithwallet(res["hex"])
+ txid = w.sendrawtransaction(signed_res["hex"])
+ assert self.nodes[1].getrawtransaction(txid)
+
+ self.log.info("Test SFFO with duplicate outputs")
+
+ res_sffo = w.fundrawtransaction(tx_hex, add_inputs=True, subtractFeeFromOutputs=[0,1])
+ signed_res_sffo = w.signrawtransactionwithwallet(res_sffo["hex"])
+ txid_sffo = w.sendrawtransaction(signed_res_sffo["hex"])
+ assert self.nodes[1].getrawtransaction(txid_sffo)
def test_change_position(self):
"""Ensure setting changePosition in fundraw with an exact match is handled properly."""
diff --git a/test/functional/wallet_import_rescan.py b/test/functional/wallet_import_rescan.py
index 0ac67607e1..e647fb2d5c 100755
--- a/test/functional/wallet_import_rescan.py
+++ b/test/functional/wallet_import_rescan.py
@@ -20,7 +20,11 @@ happened previously.
"""
from test_framework.test_framework import BitcoinTestFramework
-from test_framework.address import AddressType
+from test_framework.address import (
+ AddressType,
+ ADDRESS_BCRT1_UNSPENDABLE,
+)
+from test_framework.messages import COIN
from test_framework.util import (
assert_equal,
set_node_times,
@@ -109,7 +113,7 @@ class Variant(collections.namedtuple("Variant", "call data address_type rescan p
address, = [ad for ad in addresses if txid in ad["txids"]]
assert_equal(address["address"], self.address["address"])
- assert_equal(address["amount"], self.expected_balance)
+ assert_equal(address["amount"], self.amount_received)
assert_equal(address["confirmations"], confirmations)
# Verify the transaction is correctly marked watchonly depending on
# whether the transaction pays to an imported public key or
@@ -141,8 +145,10 @@ TIMESTAMP_WINDOW = 2 * 60 * 60
AMOUNT_DUST = 0.00000546
-def get_rand_amount():
- r = random.uniform(AMOUNT_DUST, 1)
+def get_rand_amount(min_amount=AMOUNT_DUST):
+ assert min_amount <= 1
+ r = random.uniform(min_amount, 1)
+ # note: min_amount can get rounded down here
return Decimal(str(round(r, 8)))
@@ -223,11 +229,11 @@ class ImportRescanTest(BitcoinTestFramework):
variant.node = self.nodes[2 + IMPORT_NODES.index(ImportNode(variant.prune, expect_rescan))]
variant.do_import(variant.timestamp)
if expect_rescan:
- variant.expected_balance = variant.initial_amount
+ variant.amount_received = variant.initial_amount
variant.expected_txs = 1
variant.check(variant.initial_txid, variant.initial_amount, variant.confirmation_height)
else:
- variant.expected_balance = 0
+ variant.amount_received = 0
variant.expected_txs = 0
variant.check()
@@ -247,7 +253,7 @@ class ImportRescanTest(BitcoinTestFramework):
# Check the latest results from getbalance and listtransactions.
for variant in IMPORT_VARIANTS:
self.log.info('Run check for variant {}'.format(variant))
- variant.expected_balance += variant.sent_amount
+ variant.amount_received += variant.sent_amount
variant.expected_txs += 1
variant.check(variant.sent_txid, variant.sent_amount, variant.confirmation_height)
@@ -267,14 +273,47 @@ class ImportRescanTest(BitcoinTestFramework):
address_type=variant.address_type.value,
))
variant.key = self.nodes[1].dumpprivkey(variant.address["address"])
- variant.initial_amount = get_rand_amount()
+ # Ensure output is large enough to pay for fees: conservatively assuming txsize of
+ # 500 vbytes and feerate of 20 sats/vbytes
+ variant.initial_amount = get_rand_amount(min_amount=((500 * 20 / COIN) + AMOUNT_DUST))
variant.initial_txid = self.nodes[0].sendtoaddress(variant.address["address"], variant.initial_amount)
variant.confirmation_height = 0
variant.timestamp = timestamp
+ # Mine a block so these parents are confirmed
+ assert_equal(len(self.nodes[0].getrawmempool()), len(mempool_variants))
+ self.sync_mempools()
+ block_to_disconnect = self.generate(self.nodes[0], 1)[0]
+ assert_equal(len(self.nodes[0].getrawmempool()), 0)
+
+ # For each variant, create an unconfirmed child transaction from initial_txid, sending all
+ # the funds to an unspendable address. Importantly, no change output is created so the
+ # transaction can't be recognized using its outputs. The wallet rescan needs to know the
+ # inputs of the transaction to detect it, so the parent must be processed before the child.
+ # An equivalent test for descriptors exists in wallet_rescan_unconfirmed.py.
+ unspent_txid_map = {txin["txid"] : txin for txin in self.nodes[1].listunspent()}
+ for variant in mempool_variants:
+ # Send full amount, subtracting fee from outputs, to ensure no change is created.
+ child = self.nodes[1].send(
+ add_to_wallet=False,
+ inputs=[unspent_txid_map[variant.initial_txid]],
+ outputs=[{ADDRESS_BCRT1_UNSPENDABLE : variant.initial_amount}],
+ subtract_fee_from_outputs=[0]
+ )
+ variant.child_txid = child["txid"]
+ variant.amount_received = 0
+ self.nodes[0].sendrawtransaction(child["hex"])
+
+ # Mempools should contain the child transactions for each variant.
assert_equal(len(self.nodes[0].getrawmempool()), len(mempool_variants))
self.sync_mempools()
+ # Mock a reorg so the parent transactions are added back to the mempool
+ for node in self.nodes:
+ node.invalidateblock(block_to_disconnect)
+ # Mempools should now contain the parent and child for each variant.
+ assert_equal(len(node.getrawmempool()), 2 * len(mempool_variants))
+
# For each variation of wallet key import, invoke the import RPC and
# check the results from getbalance and listtransactions.
for variant in mempool_variants:
@@ -283,11 +322,15 @@ class ImportRescanTest(BitcoinTestFramework):
variant.node = self.nodes[2 + IMPORT_NODES.index(ImportNode(variant.prune, expect_rescan))]
variant.do_import(variant.timestamp)
if expect_rescan:
- variant.expected_balance = variant.initial_amount
+ # Ensure both transactions were rescanned. This would raise a JSONRPCError if the
+ # transactions were not identified as belonging to the wallet.
+ assert_equal(variant.node.gettransaction(variant.initial_txid)['confirmations'], 0)
+ assert_equal(variant.node.gettransaction(variant.child_txid)['confirmations'], 0)
+ variant.amount_received = variant.initial_amount
variant.expected_txs = 1
- variant.check(variant.initial_txid, variant.initial_amount)
+ variant.check(variant.initial_txid, variant.initial_amount, 0)
else:
- variant.expected_balance = 0
+ variant.amount_received = 0
variant.expected_txs = 0
variant.check()
diff --git a/test/functional/wallet_importprunedfunds.py b/test/functional/wallet_importprunedfunds.py
index 5fe7c4b591..b3ae22cc44 100755
--- a/test/functional/wallet_importprunedfunds.py
+++ b/test/functional/wallet_importprunedfunds.py
@@ -120,7 +120,7 @@ class ImportPrunedFundsTest(BitcoinTestFramework):
assert_equal(address_info['ismine'], True)
# Remove transactions
- assert_raises_rpc_error(-8, "Transaction does not exist in wallet.", w1.removeprunedfunds, txnid1)
+ assert_raises_rpc_error(-4, f'Transaction {txnid1} does not belong to this wallet', w1.removeprunedfunds, txnid1)
assert not [tx for tx in w1.listtransactions(include_watchonly=True) if tx['txid'] == txnid1]
wwatch.removeprunedfunds(txnid2)
diff --git a/test/functional/wallet_keypool.py b/test/functional/wallet_keypool.py
index d2341fb12e..6ed8572347 100755
--- a/test/functional/wallet_keypool.py
+++ b/test/functional/wallet_keypool.py
@@ -103,11 +103,18 @@ class KeyPoolTest(BitcoinTestFramework):
nodes[0].getrawchangeaddress()
nodes[0].getrawchangeaddress()
nodes[0].getrawchangeaddress()
- addr = set()
+ # remember keypool sizes
+ wi = nodes[0].getwalletinfo()
+ kp_size_before = [wi['keypoolsize_hd_internal'], wi['keypoolsize']]
# the next one should fail
assert_raises_rpc_error(-12, "Keypool ran out", nodes[0].getrawchangeaddress)
+ # check that keypool sizes did not change
+ wi = nodes[0].getwalletinfo()
+ kp_size_after = [wi['keypoolsize_hd_internal'], wi['keypoolsize']]
+ assert_equal(kp_size_before, kp_size_after)
# drain the external keys
+ addr = set()
addr.add(nodes[0].getnewaddress(address_type="bech32"))
addr.add(nodes[0].getnewaddress(address_type="bech32"))
addr.add(nodes[0].getnewaddress(address_type="bech32"))
@@ -115,8 +122,15 @@ class KeyPoolTest(BitcoinTestFramework):
addr.add(nodes[0].getnewaddress(address_type="bech32"))
addr.add(nodes[0].getnewaddress(address_type="bech32"))
assert len(addr) == 6
+ # remember keypool sizes
+ wi = nodes[0].getwalletinfo()
+ kp_size_before = [wi['keypoolsize_hd_internal'], wi['keypoolsize']]
# the next one should fail
assert_raises_rpc_error(-12, "Error: Keypool ran out, please call keypoolrefill first", nodes[0].getnewaddress)
+ # check that keypool sizes did not change
+ wi = nodes[0].getwalletinfo()
+ kp_size_after = [wi['keypoolsize_hd_internal'], wi['keypoolsize']]
+ assert_equal(kp_size_before, kp_size_after)
# refill keypool with three new addresses
nodes[0].walletpassphrase('test', 1)
diff --git a/test/functional/wallet_migration.py b/test/functional/wallet_migration.py
index e2edaef4da..f9919716be 100755
--- a/test/functional/wallet_migration.py
+++ b/test/functional/wallet_migration.py
@@ -52,15 +52,26 @@ class WalletMigrationTest(BitcoinTestFramework):
assert_equal(file_magic, b'SQLite format 3\x00')
assert_equal(self.nodes[0].get_wallet_rpc(wallet_name).getwalletinfo()["format"], "sqlite")
- def create_legacy_wallet(self, wallet_name, disable_private_keys=False):
- self.nodes[0].createwallet(wallet_name=wallet_name, descriptors=False, disable_private_keys=disable_private_keys)
+ def create_legacy_wallet(self, wallet_name, **kwargs):
+ self.nodes[0].createwallet(wallet_name=wallet_name, descriptors=False, **kwargs)
wallet = self.nodes[0].get_wallet_rpc(wallet_name)
info = wallet.getwalletinfo()
assert_equal(info["descriptors"], False)
assert_equal(info["format"], "bdb")
- assert_equal(info["private_keys_enabled"], not disable_private_keys)
return wallet
+ def migrate_wallet(self, wallet_rpc, *args, **kwargs):
+ # Helper to ensure that only migration happens
+ # Since we may rescan on loading of a wallet, make sure that the best block
+ # is written before beginning migration
+ # Reload to force write that record
+ wallet_name = wallet_rpc.getwalletinfo()["walletname"]
+ wallet_rpc.unloadwallet()
+ self.nodes[0].loadwallet(wallet_name)
+ # Migrate, checking that rescan does not occur
+ with self.nodes[0].assert_debug_log(expected_msgs=[], unexpected_msgs=["Rescanning"]):
+ return wallet_rpc.migratewallet(*args, **kwargs)
+
def assert_addr_info_equal(self, addr_info, addr_info_old):
assert_equal(addr_info["address"], addr_info_old["address"])
assert_equal(addr_info["scriptPubKey"], addr_info_old["scriptPubKey"])
@@ -105,7 +116,7 @@ class WalletMigrationTest(BitcoinTestFramework):
assert_equal(old_change_addr_info["hdkeypath"], "m/0'/1'/0'")
# Note: migration could take a while.
- basic0.migratewallet()
+ self.migrate_wallet(basic0)
# Verify created descriptors
assert_equal(basic0.getwalletinfo()["descriptors"], True)
@@ -146,7 +157,7 @@ class WalletMigrationTest(BitcoinTestFramework):
txs = basic1.listtransactions()
addr_gps = basic1.listaddressgroupings()
- basic1_migrate = basic1.migratewallet()
+ basic1_migrate = self.migrate_wallet(basic1)
assert_equal(basic1.getwalletinfo()["descriptors"], True)
self.assert_is_sqlite("basic1")
assert_equal(basic1.getbalance(), bal)
@@ -187,7 +198,7 @@ class WalletMigrationTest(BitcoinTestFramework):
basic2_txs = basic2.listtransactions()
# Now migrate and test that we still see have the same balance/transactions
- basic2.migratewallet()
+ self.migrate_wallet(basic2)
assert_equal(basic2.getwalletinfo()["descriptors"], True)
self.assert_is_sqlite("basic2")
assert_equal(basic2.getbalance(), basic2_balance)
@@ -209,7 +220,7 @@ class WalletMigrationTest(BitcoinTestFramework):
ms_info = multisig0.addmultisigaddress(2, [addr1, addr2, addr3])
- multisig0.migratewallet()
+ self.migrate_wallet(multisig0)
assert_equal(multisig0.getwalletinfo()["descriptors"], True)
self.assert_is_sqlite("multisig0")
ms_addr_info = multisig0.getaddressinfo(ms_info["address"])
@@ -244,7 +255,7 @@ class WalletMigrationTest(BitcoinTestFramework):
# Migrating multisig1 should see the multisig is no longer part of multisig1
# A new wallet multisig1_watchonly is created which has the multisig address
# Transaction to multisig is in multisig1_watchonly and not multisig1
- multisig1.migratewallet()
+ self.migrate_wallet(multisig1)
assert_equal(multisig1.getwalletinfo()["descriptors"], True)
self.assert_is_sqlite("multisig1")
assert_equal(multisig1.getaddressinfo(addr1)["ismine"], False)
@@ -314,27 +325,31 @@ class WalletMigrationTest(BitcoinTestFramework):
send = default.sendall(recipients=[default.getnewaddress()], inputs=[received_sent_watchonly_utxo])
sent_watchonly_txid = send["txid"]
- self.generate(self.nodes[0], 1)
+ # Tx that has both a watchonly and spendable output
+ watchonly_spendable_txid = default.send(outputs=[{received_addr: 1}, {import_addr:1}])["txid"]
+
+ self.generate(self.nodes[0], 2)
received_watchonly_tx_info = imports0.gettransaction(received_watchonly_txid, True)
received_sent_watchonly_tx_info = imports0.gettransaction(received_sent_watchonly_utxo["txid"], True)
balances = imports0.getbalances()
spendable_bal = balances["mine"]["trusted"]
watchonly_bal = balances["watchonly"]["trusted"]
- assert_equal(len(imports0.listtransactions(include_watchonly=True)), 4)
+ assert_equal(len(imports0.listtransactions(include_watchonly=True)), 6)
# Mock time forward a bit so we can check that tx metadata is preserved
self.nodes[0].setmocktime(int(time.time()) + 100)
# Migrate
- imports0.migratewallet()
+ self.migrate_wallet(imports0)
assert_equal(imports0.getwalletinfo()["descriptors"], True)
self.assert_is_sqlite("imports0")
assert_raises_rpc_error(-5, "Invalid or non-wallet transaction id", imports0.gettransaction, received_watchonly_txid)
assert_raises_rpc_error(-5, "Invalid or non-wallet transaction id", imports0.gettransaction, received_sent_watchonly_utxo['txid'])
assert_raises_rpc_error(-5, "Invalid or non-wallet transaction id", imports0.gettransaction, sent_watchonly_txid)
- assert_equal(len(imports0.listtransactions(include_watchonly=True)), 1)
+ assert_equal(len(imports0.listtransactions(include_watchonly=True)), 2)
imports0.gettransaction(received_txid)
+ imports0.gettransaction(watchonly_spendable_txid)
assert_equal(imports0.getbalance(), spendable_bal)
assert_equal("imports0_watchonly" in self.nodes[0].listwallets(), True)
@@ -350,9 +365,10 @@ class WalletMigrationTest(BitcoinTestFramework):
assert_equal(received_sent_watchonly_tx_info["time"], received_sent_migrated_watchonly_tx_info["time"])
assert_equal(received_sent_watchonly_tx_info["timereceived"], received_sent_migrated_watchonly_tx_info["timereceived"])
watchonly.gettransaction(sent_watchonly_txid)
+ watchonly.gettransaction(watchonly_spendable_txid)
assert_equal(watchonly.getbalance(), watchonly_bal)
assert_raises_rpc_error(-5, "Invalid or non-wallet transaction id", watchonly.gettransaction, received_txid)
- assert_equal(len(watchonly.listtransactions(include_watchonly=True)), 3)
+ assert_equal(len(watchonly.listtransactions(include_watchonly=True)), 4)
# Check that labels were migrated and persisted to watchonly wallet
self.nodes[0].unloadwallet("imports0_watchonly")
@@ -380,7 +396,7 @@ class WalletMigrationTest(BitcoinTestFramework):
default.sendtoaddress(addr, 10)
self.generate(self.nodes[0], 1)
- watchonly0.migratewallet()
+ self.migrate_wallet(watchonly0)
assert_equal("watchonly0_watchonly" in self.nodes[0].listwallets(), False)
info = watchonly0.getwalletinfo()
assert_equal(info["descriptors"], True)
@@ -412,7 +428,7 @@ class WalletMigrationTest(BitcoinTestFramework):
# Before migrating, we can fetch addr1 from the keypool
assert_equal(watchonly1.getnewaddress(address_type="bech32"), addr1)
- watchonly1.migratewallet()
+ self.migrate_wallet(watchonly1)
info = watchonly1.getwalletinfo()
assert_equal(info["descriptors"], True)
assert_equal(info["private_keys_enabled"], False)
@@ -432,7 +448,7 @@ class WalletMigrationTest(BitcoinTestFramework):
bals = wallet.getbalances()
- wallet.migratewallet()
+ self.migrate_wallet(wallet)
assert_equal(bals, wallet.getbalances())
@@ -451,7 +467,7 @@ class WalletMigrationTest(BitcoinTestFramework):
assert_raises_rpc_error(-4, "Error: Wallet decryption failed, the wallet passphrase was not provided or was incorrect", wallet.migratewallet, None, "badpass")
assert_raises_rpc_error(-4, "The passphrase contains a null character", wallet.migratewallet, None, "pass\0with\0null")
- wallet.migratewallet(passphrase="pass")
+ self.migrate_wallet(wallet, passphrase="pass")
info = wallet.getwalletinfo()
assert_equal(info["descriptors"], True)
@@ -513,7 +529,7 @@ class WalletMigrationTest(BitcoinTestFramework):
self.log.info("Test migration of the wallet named as the empty string")
wallet = self.create_legacy_wallet("")
- wallet.migratewallet()
+ self.migrate_wallet(wallet)
info = wallet.getwalletinfo()
assert_equal(info["descriptors"], True)
assert_equal(info["format"], "sqlite")
@@ -535,7 +551,7 @@ class WalletMigrationTest(BitcoinTestFramework):
assert_equal(info["descriptors"], False)
assert_equal(info["format"], "bdb")
- wallet.migratewallet()
+ self.migrate_wallet(wallet)
info = wallet.getwalletinfo()
assert_equal(info["descriptors"], True)
assert_equal(info["format"], "sqlite")
@@ -623,7 +639,7 @@ class WalletMigrationTest(BitcoinTestFramework):
check(addr_info, wallet)
# Migrate wallet
- info_migration = wallet.migratewallet()
+ info_migration = self.migrate_wallet(wallet)
wallet_wo = self.nodes[0].get_wallet_rpc(info_migration["watchonly_name"])
wallet_solvables = self.nodes[0].get_wallet_rpc(info_migration["solvables_name"])
@@ -718,7 +734,7 @@ class WalletMigrationTest(BitcoinTestFramework):
wallet.rpc.importaddress(address=script_sh_pkh.hex(), label=label_sh_pkh, rescan=False, p2sh=True)
# Migrate wallet and re-check balance
- info_migration = wallet.migratewallet()
+ info_migration = self.migrate_wallet(wallet)
wallet_wo = self.nodes[0].get_wallet_rpc(info_migration["watchonly_name"])
# Watch-only balance is under "mine".
@@ -781,7 +797,7 @@ class WalletMigrationTest(BitcoinTestFramework):
assert_equal(wallet.gettransaction(txid=child_txid)["confirmations"], -1)
assert_equal(wallet.gettransaction(txid=conflict_txid)["confirmations"], 1)
- wallet.migratewallet()
+ self.migrate_wallet(wallet)
assert_equal(wallet.gettransaction(txid=parent_txid)["confirmations"], -1)
assert_equal(wallet.gettransaction(txid=child_txid)["confirmations"], -1)
assert_equal(wallet.gettransaction(txid=conflict_txid)["confirmations"], 1)
@@ -814,7 +830,7 @@ class WalletMigrationTest(BitcoinTestFramework):
p2wpkh_addr = key_to_p2wpkh(hybrid_pubkey)
wallet.importaddress(p2wpkh_addr)
- migrate_info = wallet.migratewallet()
+ migrate_info = self.migrate_wallet(wallet)
# Both addresses should only appear in the watchonly wallet
p2pkh_addr_info = wallet.getaddressinfo(p2pkh_addr)
@@ -876,6 +892,102 @@ class WalletMigrationTest(BitcoinTestFramework):
_, _, magic = struct.unpack("QII", data)
assert_equal(magic, BTREE_MAGIC)
+ def test_blank(self):
+ self.log.info("Test that a blank wallet is migrated")
+ wallet = self.create_legacy_wallet("blank", blank=True)
+ assert_equal(wallet.getwalletinfo()["blank"], True)
+ wallet.migratewallet()
+ assert_equal(wallet.getwalletinfo()["blank"], True)
+ assert_equal(wallet.getwalletinfo()["descriptors"], True)
+
+ def test_avoidreuse(self):
+ self.log.info("Test that avoidreuse persists after migration")
+ def_wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
+
+ wallet = self.create_legacy_wallet("avoidreuse")
+ wallet.setwalletflag("avoid_reuse", True)
+
+ # Import a pubkey to the test wallet and send some funds to it
+ reused_imported_addr = def_wallet.getnewaddress()
+ wallet.importpubkey(def_wallet.getaddressinfo(reused_imported_addr)["pubkey"])
+ imported_utxos = self.create_outpoints(def_wallet, outputs=[{reused_imported_addr: 2}])
+ def_wallet.lockunspent(False, imported_utxos)
+
+ # Send funds to the test wallet
+ reused_addr = wallet.getnewaddress()
+ def_wallet.sendtoaddress(reused_addr, 2)
+
+ self.generate(self.nodes[0], 1)
+
+ # Send funds from the test wallet with both its own and the imported
+ wallet.sendall([def_wallet.getnewaddress()])
+ def_wallet.sendall(recipients=[def_wallet.getnewaddress()], inputs=imported_utxos)
+ self.generate(self.nodes[0], 1)
+ balances = wallet.getbalances()
+ assert_equal(balances["mine"]["trusted"], 0)
+ assert_equal(balances["watchonly"]["trusted"], 0)
+
+ # Reuse the addresses
+ def_wallet.sendtoaddress(reused_addr, 1)
+ def_wallet.sendtoaddress(reused_imported_addr, 1)
+ self.generate(self.nodes[0], 1)
+ balances = wallet.getbalances()
+ assert_equal(balances["mine"]["used"], 1)
+ # Reused watchonly will not show up in balances
+ assert_equal(balances["watchonly"]["trusted"], 0)
+ assert_equal(balances["watchonly"]["untrusted_pending"], 0)
+ assert_equal(balances["watchonly"]["immature"], 0)
+
+ utxos = wallet.listunspent()
+ assert_equal(len(utxos), 2)
+ for utxo in utxos:
+ assert_equal(utxo["reused"], True)
+
+ # Migrate
+ migrate_res = wallet.migratewallet()
+ watchonly_wallet = self.nodes[0].get_wallet_rpc(migrate_res["watchonly_name"])
+
+ # One utxo in each wallet, marked used
+ utxos = wallet.listunspent()
+ assert_equal(len(utxos), 1)
+ assert_equal(utxos[0]["reused"], True)
+ watchonly_utxos = watchonly_wallet.listunspent()
+ assert_equal(len(watchonly_utxos), 1)
+ assert_equal(watchonly_utxos[0]["reused"], True)
+
+ def test_preserve_tx_extra_info(self):
+ self.log.info("Test that tx extra data is preserved after migration")
+ def_wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
+
+ # Create and fund wallet
+ wallet = self.create_legacy_wallet("persist_comments")
+ def_wallet.sendtoaddress(wallet.getnewaddress(), 2)
+
+ self.generate(self.nodes[0], 6)
+
+ # Create tx and bump it to store 'replaced_by_txid' and 'replaces_txid' data within the transactions.
+ # Additionally, store an extra comment within the original tx.
+ extra_comment = "don't discard me"
+ original_tx_id = wallet.sendtoaddress(address=wallet.getnewaddress(), amount=1, comment=extra_comment)
+ bumped_tx = wallet.bumpfee(txid=original_tx_id)
+
+ def check_comments():
+ for record in wallet.listtransactions():
+ if record["txid"] == original_tx_id:
+ assert_equal(record["replaced_by_txid"], bumped_tx["txid"])
+ assert_equal(record['comment'], extra_comment)
+ elif record["txid"] == bumped_tx["txid"]:
+ assert_equal(record["replaces_txid"], original_tx_id)
+
+ # Pre-migration verification
+ check_comments()
+ # Migrate
+ wallet.migratewallet()
+ # Post-migration verification
+ check_comments()
+
+ wallet.unloadwallet()
+
def run_test(self):
self.generate(self.nodes[0], 101)
@@ -896,6 +1008,9 @@ class WalletMigrationTest(BitcoinTestFramework):
self.test_conflict_txs()
self.test_hybrid_pubkey()
self.test_failed_migration_cleanup()
+ self.test_avoidreuse()
+ self.test_preserve_tx_extra_info()
+ self.test_blank()
if __name__ == '__main__':
WalletMigrationTest().main()
diff --git a/test/functional/wallet_multiwallet.py b/test/functional/wallet_multiwallet.py
index 10bc516d8f..ee866ee59b 100755
--- a/test/functional/wallet_multiwallet.py
+++ b/test/functional/wallet_multiwallet.py
@@ -9,9 +9,9 @@ Verify that a bitcoind node can load multiple wallet files
from decimal import Decimal
from threading import Thread
import os
+import platform
import shutil
import stat
-import sys
import time
from test_framework.authproxy import JSONRPCException
@@ -143,7 +143,7 @@ class MultiWalletTest(BitcoinTestFramework):
# should raise rpc error if wallet path can't be created
err_code = -4 if self.options.descriptors else -1
- assert_raises_rpc_error(err_code, "filesystem error:" if sys.platform != 'win32' else "create_directories:", self.nodes[0].createwallet, "w8/bad")
+ assert_raises_rpc_error(err_code, "filesystem error:" if platform.system() != 'Windows' else "create_directories:", self.nodes[0].createwallet, "w8/bad")
# check that all requested wallets were created
self.stop_node(0)
diff --git a/test/functional/wallet_reorgsrestore.py b/test/functional/wallet_reorgsrestore.py
index 86a2905c72..4271f3e481 100755
--- a/test/functional/wallet_reorgsrestore.py
+++ b/test/functional/wallet_reorgsrestore.py
@@ -45,6 +45,7 @@ class ReorgsRestoreTest(BitcoinTestFramework):
txid = self.nodes[0].sendtoaddress(self.nodes[0].getnewaddress(), Decimal("10"))
tx = self.nodes[0].gettransaction(txid)
self.generate(self.nodes[0], 4, sync_fun=self.no_op)
+ self.sync_blocks([self.nodes[0], self.nodes[2]])
tx_before_reorg = self.nodes[0].gettransaction(txid)
assert_equal(tx_before_reorg["confirmations"], 4)
diff --git a/test/functional/wallet_rescan_unconfirmed.py b/test/functional/wallet_rescan_unconfirmed.py
new file mode 100755
index 0000000000..ad9fa081c2
--- /dev/null
+++ b/test/functional/wallet_rescan_unconfirmed.py
@@ -0,0 +1,83 @@
+#!/usr/bin/env python3
+# Copyright (c) 2024 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+"""Test that descriptor wallets rescan mempool transactions properly when importing."""
+
+from test_framework.address import (
+ address_to_scriptpubkey,
+ ADDRESS_BCRT1_UNSPENDABLE,
+)
+from test_framework.messages import COIN
+from test_framework.test_framework import BitcoinTestFramework
+from test_framework.util import assert_equal
+from test_framework.wallet import MiniWallet
+from test_framework.wallet_util import test_address
+
+
+class WalletRescanUnconfirmed(BitcoinTestFramework):
+ def add_options(self, parser):
+ self.add_wallet_options(parser, legacy=False)
+
+ def set_test_params(self):
+ self.num_nodes = 1
+
+ def skip_test_if_missing_module(self):
+ self.skip_if_no_wallet()
+ self.skip_if_no_sqlite()
+
+ def run_test(self):
+ self.log.info("Create wallets and mine initial chain")
+ node = self.nodes[0]
+ tester_wallet = MiniWallet(node)
+
+ node.createwallet(wallet_name='w0', disable_private_keys=False)
+ w0 = node.get_wallet_rpc('w0')
+
+ self.log.info("Create a parent tx and mine it in a block that will later be disconnected")
+ parent_address = w0.getnewaddress()
+ tx_parent_to_reorg = tester_wallet.send_to(
+ from_node=node,
+ scriptPubKey=address_to_scriptpubkey(parent_address),
+ amount=COIN,
+ )
+ assert tx_parent_to_reorg["txid"] in node.getrawmempool()
+ block_to_reorg = self.generate(tester_wallet, 1)[0]
+ assert_equal(len(node.getrawmempool()), 0)
+ node.syncwithvalidationinterfacequeue()
+ assert_equal(w0.gettransaction(tx_parent_to_reorg["txid"])["confirmations"], 1)
+
+ # Create an unconfirmed child transaction from the parent tx, sending all
+ # the funds to an unspendable address. Importantly, no change output is created so the
+ # transaction can't be recognized using its outputs. The wallet rescan needs to know the
+ # inputs of the transaction to detect it, so the parent must be processed before the child.
+ w0_utxos = w0.listunspent()
+
+ self.log.info("Create a child tx and wait for it to propagate to all mempools")
+ # The only UTXO available to spend is tx_parent_to_reorg.
+ assert_equal(len(w0_utxos), 1)
+ assert_equal(w0_utxos[0]["txid"], tx_parent_to_reorg["txid"])
+ tx_child_unconfirmed_sweep = w0.sendall([ADDRESS_BCRT1_UNSPENDABLE])
+ assert tx_child_unconfirmed_sweep["txid"] in node.getrawmempool()
+ node.syncwithvalidationinterfacequeue()
+
+ self.log.info("Mock a reorg, causing parent to re-enter mempools after its child")
+ node.invalidateblock(block_to_reorg)
+ assert tx_parent_to_reorg["txid"] in node.getrawmempool()
+
+ self.log.info("Import descriptor wallet on another node")
+ descriptors_to_import = [{"desc": w0.getaddressinfo(parent_address)['parent_desc'], "timestamp": 0, "label": "w0 import"}]
+
+ node.createwallet(wallet_name="w1", disable_private_keys=True)
+ w1 = node.get_wallet_rpc("w1")
+ w1.importdescriptors(descriptors_to_import)
+
+ self.log.info("Check that the importing node has properly rescanned mempool transactions")
+ # Check that parent address is correctly determined as ismine
+ test_address(w1, parent_address, solvable=True, ismine=True)
+ # This would raise a JSONRPCError if the transactions were not identified as belonging to the wallet.
+ assert_equal(w1.gettransaction(tx_parent_to_reorg["txid"])["confirmations"], 0)
+ assert_equal(w1.gettransaction(tx_child_unconfirmed_sweep["txid"])["confirmations"], 0)
+
+if __name__ == '__main__':
+ WalletRescanUnconfirmed().main()
diff --git a/test/functional/wallet_send.py b/test/functional/wallet_send.py
index 6ce2a56bfc..580a9d2b22 100755
--- a/test/functional/wallet_send.py
+++ b/test/functional/wallet_send.py
@@ -543,11 +543,16 @@ class WalletSendTest(BitcoinTestFramework):
break
psbt_in = dec["inputs"][input_idx]
# Calculate the input weight
- # (prevout + sequence + length of scriptSig + scriptsig + 1 byte buffer) * WITNESS_SCALE_FACTOR + num scriptWitness stack items + (length of stack item + stack item) * N stack items + 1 byte buffer
+ # (prevout + sequence + length of scriptSig + scriptsig) * WITNESS_SCALE_FACTOR + len of num scriptWitness stack items + (length of stack item + stack item) * N stack items
+ # Note that occasionally this weight estimate may be slightly larger or smaller than the real weight
+ # as sometimes ECDSA signatures are one byte shorter than expected with a probability of 1/128
len_scriptsig = len(psbt_in["final_scriptSig"]["hex"]) // 2 if "final_scriptSig" in psbt_in else 0
- len_scriptsig += len(ser_compact_size(len_scriptsig)) + 1
- len_scriptwitness = (sum([(len(x) // 2) + len(ser_compact_size(len(x) // 2)) for x in psbt_in["final_scriptwitness"]]) + len(psbt_in["final_scriptwitness"]) + 1) if "final_scriptwitness" in psbt_in else 0
- input_weight = ((40 + len_scriptsig) * WITNESS_SCALE_FACTOR) + len_scriptwitness
+ len_scriptsig += len(ser_compact_size(len_scriptsig))
+ len_scriptwitness = (sum([(len(x) // 2) + len(ser_compact_size(len(x) // 2)) for x in psbt_in["final_scriptwitness"]]) + len(ser_compact_size(len(psbt_in["final_scriptwitness"])))) if "final_scriptwitness" in psbt_in else 0
+ len_prevout_txid = 32
+ len_prevout_index = 4
+ len_sequence = 4
+ input_weight = ((len_prevout_txid + len_prevout_index + len_sequence + len_scriptsig) * WITNESS_SCALE_FACTOR) + len_scriptwitness
# Input weight error conditions
assert_raises_rpc_error(
@@ -558,6 +563,7 @@ class WalletSendTest(BitcoinTestFramework):
options={"inputs": [ext_utxo], "input_weights": [{"txid": ext_utxo["txid"], "vout": ext_utxo["vout"], "weight": 1000}]}
)
+ target_fee_rate_sat_vb = 10
# Funding should also work when input weights are provided
res = self.test_send(
from_wallet=ext_wallet,
@@ -567,14 +573,17 @@ class WalletSendTest(BitcoinTestFramework):
add_inputs=True,
psbt=True,
include_watching=True,
- fee_rate=10
+ fee_rate=target_fee_rate_sat_vb
)
signed = ext_wallet.walletprocesspsbt(res["psbt"])
signed = ext_fund.walletprocesspsbt(res["psbt"])
assert signed["complete"]
testres = self.nodes[0].testmempoolaccept([signed["hex"]])[0]
assert_equal(testres["allowed"], True)
- assert_fee_amount(testres["fees"]["base"], testres["vsize"], Decimal(0.0001))
+ actual_fee_rate_sat_vb = Decimal(testres["fees"]["base"]) * Decimal(1e8) / Decimal(testres["vsize"])
+ # Due to ECDSA signatures not always being the same length, the actual fee rate may be slightly different
+ # but rounded to nearest integer, it should be the same as the target fee rate
+ assert_equal(round(actual_fee_rate_sat_vb), target_fee_rate_sat_vb)
if __name__ == '__main__':
WalletSendTest().main()
diff --git a/test/functional/wallet_sendmany.py b/test/functional/wallet_sendmany.py
new file mode 100755
index 0000000000..5751993143
--- /dev/null
+++ b/test/functional/wallet_sendmany.py
@@ -0,0 +1,43 @@
+#!/usr/bin/env python3
+# Copyright (c) 2022 The Bitcoin Core developers
+# Distributed under the MIT software license, see the accompanying
+# file COPYING or http://www.opensource.org/licenses/mit-license.php.
+"""Test the sendmany RPC command."""
+
+from test_framework.test_framework import BitcoinTestFramework
+
+class SendmanyTest(BitcoinTestFramework):
+ # Setup and helpers
+ def add_options(self, parser):
+ self.add_wallet_options(parser)
+
+
+ def skip_test_if_missing_module(self):
+ self.skip_if_no_wallet()
+
+
+ def set_test_params(self):
+ self.num_nodes = 1
+ self.setup_clean_chain = True
+
+ def test_sffo_repeated_address(self):
+ addr_1 = self.wallet.getnewaddress()
+ addr_2 = self.wallet.getnewaddress()
+ addr_3 = self.wallet.getnewaddress()
+
+ self.log.info("Test using duplicate address in SFFO argument")
+ self.def_wallet.sendmany(dummy='', amounts={addr_1: 1, addr_2: 1}, subtractfeefrom=[addr_1, addr_1, addr_1])
+ self.log.info("Test using address not present in tx.vout in SFFO argument")
+ self.def_wallet.sendmany(dummy='', amounts={addr_1: 1, addr_2: 1}, subtractfeefrom=[addr_3])
+
+ def run_test(self):
+ self.nodes[0].createwallet("activewallet")
+ self.wallet = self.nodes[0].get_wallet_rpc("activewallet")
+ self.def_wallet = self.nodes[0].get_wallet_rpc(self.default_wallet_name)
+ self.generate(self.nodes[0], 101)
+
+ self.test_sffo_repeated_address()
+
+
+if __name__ == '__main__':
+ SendmanyTest().main()
diff --git a/test/fuzz/test_runner.py b/test/fuzz/test_runner.py
index e72977fac0..b3edb0e253 100755
--- a/test/fuzz/test_runner.py
+++ b/test/fuzz/test_runner.py
@@ -11,6 +11,7 @@ import argparse
import configparser
import logging
import os
+import random
import subprocess
import sys
@@ -24,6 +25,7 @@ def get_fuzz_env(*, target, source_dir):
'UBSAN_SYMBOLIZER_PATH':symbolizer,
"ASAN_OPTIONS": "detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1",
'ASAN_SYMBOLIZER_PATH':symbolizer,
+ 'MSAN_SYMBOLIZER_PATH':symbolizer,
}
@@ -103,7 +105,10 @@ def main():
sys.exit(1)
# Build list of tests
- test_list_all = parse_test_list(fuzz_bin=os.path.join(config["environment"]["BUILDDIR"], 'src', 'test', 'fuzz', 'fuzz'))
+ test_list_all = parse_test_list(
+ fuzz_bin=os.path.join(config["environment"]["BUILDDIR"], 'src', 'test', 'fuzz', 'fuzz'),
+ source_dir=config['environment']['SRCDIR'],
+ )
if not test_list_all:
logging.error("No fuzz targets found")
@@ -263,9 +268,13 @@ def generate_corpus(*, fuzz_pool, src_dir, build_dir, corpus_dir, targets):
for target, t_env in targets:
target_corpus_dir = corpus_dir / target
os.makedirs(target_corpus_dir, exist_ok=True)
+ use_value_profile = int(random.random() < .3)
command = [
os.path.join(build_dir, 'src', 'test', 'fuzz', 'fuzz'),
- "-runs=100000",
+ "-rss_limit_mb=8000",
+ "-max_total_time=6000",
+ "-reload=0",
+ f"-use_value_profile={use_value_profile}",
target_corpus_dir,
]
futures.append(fuzz_pool.submit(job, command, target, t_env))
@@ -347,13 +356,18 @@ def run_once(*, fuzz_pool, corpus, test_list, src_dir, build_dir, using_libfuzze
text=True,
)
output += result.stderr
- return output, result
+ return output, result, t
jobs.append(fuzz_pool.submit(job, t, args))
+ stats = []
for future in as_completed(jobs):
- output, result = future.result()
+ output, result, target = future.result()
logging.debug(output)
+ if using_libfuzzer:
+ done_stat = [l for l in output.splitlines() if "DONE" in l]
+ assert len(done_stat) == 1
+ stats.append((target, done_stat[0]))
try:
result.check_returncode()
except subprocess.CalledProcessError as e:
@@ -364,16 +378,24 @@ def run_once(*, fuzz_pool, corpus, test_list, src_dir, build_dir, using_libfuzze
logging.info(f"Target {result.args} failed with exit code {e.returncode}")
sys.exit(1)
+ if using_libfuzzer:
+ print("Summary:")
+ max_len = max(len(t[0]) for t in stats)
+ for t, s in sorted(stats):
+ t = t.ljust(max_len + 1)
+ print(f"{t}{s}")
+
-def parse_test_list(*, fuzz_bin):
+def parse_test_list(*, fuzz_bin, source_dir):
test_list_all = subprocess.run(
fuzz_bin,
env={
- 'PRINT_ALL_FUZZ_TARGETS_AND_ABORT': ''
+ 'PRINT_ALL_FUZZ_TARGETS_AND_ABORT': '',
+ **get_fuzz_env(target="", source_dir=source_dir)
},
stdout=subprocess.PIPE,
- stderr=subprocess.DEVNULL,
text=True,
+ check=True,
).stdout.splitlines()
return test_list_all
diff --git a/test/lint/README.md b/test/lint/README.md
index 484008298b..9cb61b484c 100644
--- a/test/lint/README.md
+++ b/test/lint/README.md
@@ -16,10 +16,34 @@ result is cached and it prevents issues when the image changes.
test runner
===========
-To run the checks in the test runner outside the docker, use:
+To run all the lint checks in the test runner outside the docker, use:
```sh
-( cd ./test/lint/test_runner/ && cargo fmt && cargo clippy && cargo run )
+( cd ./test/lint/test_runner/ && cargo fmt && cargo clippy && RUST_BACKTRACE=1 cargo run )
+```
+
+#### Dependencies
+
+| Lint test | Dependency |
+|-----------|:----------:|
+| [`lint-python.py`](lint/lint-python.py) | [flake8](https://gitlab.com/pycqa/flake8)
+| [`lint-python.py`](lint/lint-python.py) | [lief](https://github.com/lief-project/LIEF)
+| [`lint-python.py`](lint/lint-python.py) | [mypy](https://github.com/python/mypy)
+| [`lint-python.py`](lint/lint-python.py) | [pyzmq](https://github.com/zeromq/pyzmq)
+| [`lint-python-dead-code.py`](lint/lint-python-dead-code.py) | [vulture](https://github.com/jendrikseipp/vulture)
+| [`lint-shell.py`](lint/lint-shell.py) | [ShellCheck](https://github.com/koalaman/shellcheck)
+| [`lint-spelling.py`](lint/lint-spelling.py) | [codespell](https://github.com/codespell-project/codespell)
+
+In use versions and install instructions are available in the [CI setup](../../ci/lint/04_install.sh).
+
+Please be aware that on Linux distributions all dependencies are usually available as packages, but could be outdated.
+
+#### Running the tests
+
+Individual tests can be run by directly calling the test script, e.g.:
+
+```
+test/lint/lint-files.py
```
check-doc.py
@@ -59,7 +83,3 @@ To do so, add the upstream repository as remote:
```
git remote add --fetch secp256k1 https://github.com/bitcoin-core/secp256k1.git
```
-
-all-lint.py
-===========
-Calls other scripts with the `lint-` prefix.
diff --git a/test/lint/all-lint.py b/test/lint/all-lint.py
deleted file mode 100755
index c7889796c6..0000000000
--- a/test/lint/all-lint.py
+++ /dev/null
@@ -1,23 +0,0 @@
-#!/usr/bin/env python3
-#
-# Copyright (c) 2017-2022 The Bitcoin Core developers
-# Distributed under the MIT software license, see the accompanying
-# file COPYING or http://www.opensource.org/licenses/mit-license.php.
-#
-# This script runs all test/lint/lint-* files, and fails if any exit
-# with a non-zero status code.
-
-from glob import glob
-from pathlib import Path
-from subprocess import run
-from sys import executable
-
-exit_code = 0
-mod_path = Path(__file__).parent
-for lint in glob(f"{mod_path}/lint-*.py"):
- result = run([executable, lint])
- if result.returncode != 0:
- print(f"^---- failure generated from {lint.split('/')[-1]}")
- exit_code |= result.returncode
-
-exit(exit_code)
diff --git a/test/lint/lint-format-strings.py b/test/lint/lint-format-strings.py
index 5ac5840ecf..09d858e131 100755
--- a/test/lint/lint-format-strings.py
+++ b/test/lint/lint-format-strings.py
@@ -20,6 +20,11 @@ FUNCTION_NAMES_AND_NUMBER_OF_LEADING_ARGUMENTS = [
'fprintf,1',
'tfm::format,1', # Assuming tfm::::format(std::ostream&, ...
'LogConnectFailure,1',
+ 'LogError,0',
+ 'LogWarning,0',
+ 'LogInfo,0',
+ 'LogDebug,1',
+ 'LogTrace,1',
'LogPrint,1',
'LogPrintf,0',
'LogPrintfCategory,1',
diff --git a/test/lint/test_runner/src/main.rs b/test/lint/test_runner/src/main.rs
index ce94c3b628..b97e822484 100644
--- a/test/lint/test_runner/src/main.rs
+++ b/test/lint/test_runner/src/main.rs
@@ -3,7 +3,8 @@
// file COPYING or https://opensource.org/license/mit/.
use std::env;
-use std::path::PathBuf;
+use std::fs;
+use std::path::{Path, PathBuf};
use std::process::Command;
use std::process::ExitCode;
@@ -29,21 +30,34 @@ fn check_output(cmd: &mut std::process::Command) -> Result<String, LintError> {
}
/// Return the git root as utf8, or panic
-fn get_git_root() -> String {
- check_output(git().args(["rev-parse", "--show-toplevel"])).unwrap()
+fn get_git_root() -> PathBuf {
+ PathBuf::from(check_output(git().args(["rev-parse", "--show-toplevel"])).unwrap())
+}
+
+/// Return all subtree paths
+fn get_subtrees() -> Vec<&'static str> {
+ vec![
+ "src/crc32c",
+ "src/crypto/ctaes",
+ "src/leveldb",
+ "src/minisketch",
+ "src/secp256k1",
+ ]
+}
+
+/// Return the pathspecs to exclude all subtrees
+fn get_pathspecs_exclude_subtrees() -> Vec<String> {
+ get_subtrees()
+ .iter()
+ .map(|s| format!(":(exclude){}", s))
+ .collect()
}
fn lint_subtree() -> LintResult {
// This only checks that the trees are pure subtrees, it is not doing a full
// check with -r to not have to fetch all the remotes.
let mut good = true;
- for subtree in [
- "src/crypto/ctaes",
- "src/secp256k1",
- "src/minisketch",
- "src/leveldb",
- "src/crc32c",
- ] {
+ for subtree in get_subtrees() {
good &= Command::new("test/lint/git-subtree-check.sh")
.arg(subtree)
.status()
@@ -81,6 +95,102 @@ fs:: namespace, which has unsafe filesystem functions marked as deleted.
}
}
+fn lint_includes_build_config() -> LintResult {
+ let config_path = "./src/config/bitcoin-config.h.in";
+ let include_directive = "#include <config/bitcoin-config.h>";
+ if !Path::new(config_path).is_file() {
+ assert!(Command::new("./autogen.sh")
+ .status()
+ .expect("command error")
+ .success());
+ }
+ let defines_regex = format!(
+ r"^\s*(?!//).*({})",
+ check_output(Command::new("grep").args(["undef ", "--", config_path]))
+ .expect("grep failed")
+ .lines()
+ .map(|line| {
+ line.split("undef ")
+ .nth(1)
+ .unwrap_or_else(|| panic!("Could not extract name in line: {line}"))
+ })
+ .collect::<Vec<_>>()
+ .join("|")
+ );
+ let print_affected_files = |mode: bool| {
+ // * mode==true: Print files which use the define, but lack the include
+ // * mode==false: Print files which lack the define, but use the include
+ let defines_files = check_output(
+ git()
+ .args([
+ "grep",
+ "--perl-regexp",
+ if mode {
+ "--files-with-matches"
+ } else {
+ "--files-without-match"
+ },
+ &defines_regex,
+ "--",
+ "*.cpp",
+ "*.h",
+ ])
+ .args(get_pathspecs_exclude_subtrees())
+ .args([
+ // These are exceptions which don't use bitcoin-config.h, rather the Makefile.am adds
+ // these cppflags manually.
+ ":(exclude)src/crypto/sha256_arm_shani.cpp",
+ ":(exclude)src/crypto/sha256_avx2.cpp",
+ ":(exclude)src/crypto/sha256_sse41.cpp",
+ ":(exclude)src/crypto/sha256_x86_shani.cpp",
+ ]),
+ )
+ .expect("grep failed");
+ git()
+ .args([
+ "grep",
+ if mode {
+ "--files-without-match"
+ } else {
+ "--files-with-matches"
+ },
+ include_directive,
+ "--",
+ ])
+ .args(defines_files.lines())
+ .status()
+ .expect("command error")
+ .success()
+ };
+ let missing = print_affected_files(true);
+ if missing {
+ return Err(format!(
+ r#"
+^^^
+One or more files use a symbol declared in the bitcoin-config.h header. However, they are not
+including the header. This is problematic, because the header may or may not be indirectly
+included. If the indirect include were to be intentionally or accidentally removed, the build could
+still succeed, but silently be buggy. For example, a slower fallback algorithm could be picked,
+even though bitcoin-config.h indicates that a faster feature is available and should be used.
+
+If you are unsure which symbol is used, you can find it with this command:
+git grep --perl-regexp '{}' -- file_name
+ "#,
+ defines_regex
+ ));
+ }
+ let redundant = print_affected_files(false);
+ if redundant {
+ return Err(r#"
+^^^
+None of the files use a symbol declared in the bitcoin-config.h header. However, they are including
+the header. Consider removing the unused include.
+ "#
+ .to_string());
+ }
+ Ok(())
+}
+
fn lint_doc() -> LintResult {
if Command::new("test/lint/check-doc.py")
.status()
@@ -94,11 +204,24 @@ fn lint_doc() -> LintResult {
}
fn lint_all() -> LintResult {
- if Command::new("test/lint/all-lint.py")
- .status()
- .expect("command error")
- .success()
- {
+ let mut good = true;
+ let lint_dir = get_git_root().join("test/lint");
+ for entry in fs::read_dir(lint_dir).unwrap() {
+ let entry = entry.unwrap();
+ let entry_fn = entry.file_name().into_string().unwrap();
+ if entry_fn.starts_with("lint-")
+ && entry_fn.ends_with(".py")
+ && !Command::new("python3")
+ .arg(entry.path())
+ .status()
+ .expect("command error")
+ .success()
+ {
+ good = false;
+ println!("^---- failure generated from {}", entry_fn);
+ }
+ }
+ if good {
Ok(())
} else {
Err("".to_string())
@@ -109,18 +232,19 @@ fn main() -> ExitCode {
let test_list: Vec<(&str, LintFn)> = vec![
("subtree check", lint_subtree),
("std::filesystem check", lint_std_filesystem),
+ ("build config includes check", lint_includes_build_config),
("-help=1 documentation check", lint_doc),
- ("all-lint.py script", lint_all),
+ ("lint-*.py scripts", lint_all),
];
- let git_root = PathBuf::from(get_git_root());
+ let git_root = get_git_root();
let mut test_failed = false;
for (lint_name, lint_fn) in test_list {
// chdir to root before each lint test
env::set_current_dir(&git_root).unwrap();
if let Err(err) = lint_fn() {
- println!("{err}\n^---- Failure generated from {lint_name}!");
+ println!("{err}\n^---- ⚠️ Failure generated from {lint_name}!");
test_failed = true;
}
}
diff --git a/test/sanitizer_suppressions/ubsan b/test/sanitizer_suppressions/ubsan
index f0ee698909..2a2f7ca470 100644
--- a/test/sanitizer_suppressions/ubsan
+++ b/test/sanitizer_suppressions/ubsan
@@ -23,6 +23,7 @@ implicit-integer-sign-change:secp256k1/
implicit-signed-integer-truncation:*/include/c++/
implicit-signed-integer-truncation:leveldb/
implicit-signed-integer-truncation:secp256k1/
+implicit-signed-integer-truncation,implicit-integer-sign-change:secp256k1_modinv64_posdivsteps_62_var
implicit-unsigned-integer-truncation:*/include/c++/
implicit-unsigned-integer-truncation:leveldb/
implicit-unsigned-integer-truncation:secp256k1/
@@ -54,7 +55,7 @@ unsigned-integer-overflow:MurmurHash3
unsigned-integer-overflow:CBlockPolicyEstimator::processBlockTx
unsigned-integer-overflow:TxConfirmStats::EstimateMedianVal
unsigned-integer-overflow:prevector.h
-unsigned-integer-overflow:script/interpreter.cpp
+unsigned-integer-overflow:EvalScript
unsigned-integer-overflow:xoroshiro128plusplus.h
implicit-integer-sign-change:CBlockPolicyEstimator::processBlockTx
implicit-integer-sign-change:SetStdinEcho
@@ -69,7 +70,6 @@ implicit-signed-integer-truncation:crypto/
implicit-unsigned-integer-truncation:crypto/
shift-base:arith_uint256.cpp
shift-base:crypto/
-shift-base:ROTL32
shift-base:streams.h
shift-base:FormatHDKeypath
shift-base:xoroshiro128plusplus.h